From f90301a9009a21145ab220ae5f1cd465574adc56 Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sat, 9 May 2026 15:23:45 +0530 Subject: [PATCH 1/9] chore(docs): update Node manifest --- package.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 7c3959a..264c7ad 100644 --- a/package.json +++ b/package.json @@ -14,13 +14,13 @@ "maintainers": [ { "name": "Ayushman Chhabra", - "url": "https://ayushmanchhabra.com/" + "url": "https://github.com/ayushmanchhabra" } ], "contributors": [ { "name": "The @nwutils/updater Authors", - "url": "https://github.com/nwutils/nw-updater/graphs/contributors" + "url": "https://github.com/nwutils/updater/graphs/contributors" } ], "main": "./app/updater.js", @@ -30,10 +30,10 @@ "LICENSE", "app/updater.js" ], - "homepage": "https://github.com/nwutils/nw-updater", + "homepage": "https://github.com/nwutils/updater", "repository": { "type": "git", - "url": "https://github.com/nwutils/nw-updater.git" + "url": "https://github.com/nwutils/updater.git" }, "scripts": { "grunt": "grunt", From a21fdf37f067801cfa2ac064ee44714d9317a9d6 Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sat, 9 May 2026 16:58:03 +0530 Subject: [PATCH 2/9] chore: initial clean up --- .editorconfig | 7 - .github/dependabot.yml | 4 +- .github/workflows/ci.yml | 40 +- .gitignore | 10 - README.md | 20 +- app/index.html | 110 - app/tools/unzip.exe | Bin 167936 -> 0 bytes examples/basic.js | 57 - gruntfile.js | 148 - package-lock.json | 4823 +++++----------------- package.json | 34 +- app/updater.js => src/main.js | 13 +- test/basicTest.spec.js | 176 - tests/fixtures/app/index.html | 113 + {app => tests/fixtures/app}/package.json | 2 +- tests/fixtures/releases/manifest.json | 11 + tests/specs/main.test.js | 17 + tsconfig.json | 25 + types/main.d.ts | 151 + types/src/main.d.ts | 54 + 20 files changed, 1389 insertions(+), 4426 deletions(-) delete mode 100644 .editorconfig delete mode 100644 app/index.html delete mode 100644 app/tools/unzip.exe delete mode 100644 examples/basic.js delete mode 100644 gruntfile.js rename app/updater.js => src/main.js (97%) delete mode 100644 test/basicTest.spec.js create mode 100644 tests/fixtures/app/index.html rename {app => tests/fixtures/app}/package.json (78%) create mode 100644 tests/fixtures/releases/manifest.json create mode 100644 tests/specs/main.test.js create mode 100644 tsconfig.json create mode 100644 types/main.d.ts create mode 100644 types/src/main.d.ts diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index bad53d3..0000000 --- a/.editorconfig +++ /dev/null @@ -1,7 +0,0 @@ -[*.js] -indent_style = space -indent_size = 2 - -[*.json] -indent_style = space -indent_size = 2 \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index a7496e4..bb976c6 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -3,7 +3,7 @@ updates: - package-ecosystem: "npm" directory: "." schedule: - interval: "daily" + interval: "monthly" groups: npm: patterns: @@ -11,7 +11,7 @@ updates: - package-ecosystem: "github-actions" directory: ".github/" schedule: - interval: "daily" + interval: "monthly" groups: gha: patterns: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f02e2ba..c2601d5 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,11 +1,13 @@ name: ci + on: pull_request: branches: - main - workflow_dispatch: - branches: - - main + +permissions: + contents: read + pull-requests: write concurrency: group: ${{ github.ref }} @@ -15,13 +17,29 @@ jobs: test: strategy: matrix: - os: [macos-14, ubuntu-22.04, windows-2022] + os: + - macos-15 + - ubuntu-24.04 + - windows-2025 + fail-fast: false + runs-on: ${{ matrix.os }} + steps: - - uses: actions/checkout@v3.3.0 - - uses: actions/setup-node@v3.6.0 - with: - node-version: 20 - cache: "npm" - - run: npm ci - - run: npm t + - name: Checkout repository + uses: actions/checkout@v6.0.2 + + - name: Setup Volta + uses: volta-cli/action@v4.2.1 + + - name: Install dependencies + run: npm ci + + - name: Check for linting errors + run: npm run lint + + - name: Check for type errors + run: npm run type + + - name: Check for test suite errors + run: npm run test diff --git a/.gitignore b/.gitignore index 3f7c446..3c3629e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,11 +1 @@ node_modules - -# Test stuff -cache -test/app -test/deploy0.1 -test/deploy0.2 - -# JetBrains -.idea -*.iml \ No newline at end of file diff --git a/README.md b/README.md index 4616747..3e7c376 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,20 @@ -> This repository is in maintainance mode. Bug fixes will be provided on a best effort basis. If you use this project, please consider contributing back. # @nwutils/updater [![npm](https://img.shields.io/npm/v/node-webkit-updater.svg?style=flat)](https://www.npmjs.com/package/node-webkit-updater) [![Join the chat at https://gitter.im/nwjs/nwjs](https://badges.gitter.im/nwjs/nwjs.svg)](https://gitter.im/nwjs/nwjs) -```shell -npm i @nwutils/updater +Update NW.js applications for Linux, MacOS and Windows platforms. + +## Getting Started + +1. Install [Volta](https://volta.sh/). +1. `npm i @nwutils/updater` + +## Usage + +```js +import {} ``` It gives you low-level API to: @@ -177,3 +185,9 @@ On Windows, there is no "unzip" command built in by default. As a result, this p ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md) + +## Roadmap + +- Build 2 applications (current and latest) using nw-builder (package as ZIP) and calculate their checksum. +- Run Express server at /releases. +- Using Selenium, run an application which checks for latest version, downloads and replaces it while running. diff --git a/app/index.html b/app/index.html deleted file mode 100644 index 2f6c042..0000000 --- a/app/index.html +++ /dev/null @@ -1,110 +0,0 @@ - - -updater - - -
-
- - - diff --git a/app/tools/unzip.exe b/app/tools/unzip.exe deleted file mode 100644 index e9dc44dfe99d067be97125be62f366ba4b579181..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167936 zcmeFadwf$>)<1mGByE6{6Ci~kEmVnPHK3J%QqyWcC>5(FDYU3uyw=!pMuii^kxTI; zN_vPg4l|?A=!}^32!a8B$)q5(;7R}7?DyM$_8@uim=^~N&kcC< z^cG$9o2Sq6-@2&yj)k}1vhez!6yJFLPk(y5RD8qD#R~&JExz@q#nY~;DgMdrH{E=0 ze*Qqa2D;VPJ}u~cazyIylW{MNklFj6N9@NldEOHv*5diMg60t+JoC=`>RADwE8V?Wn!Zt!?jGjNmF zn__FUf8LtewRQgMB2$Hi9Cghoo#5ZI*iGS+BU52fJ)8~?Qa?ginQNa6c;&BPt_Wzw z&Q{k4;@Z~cmWQSa$`Iv*yea8y{rs6@TQ5^S(|_*ze4*HsTRvABP=20dywdggqR%QD z^89anG)1UY%OBAJf;rSG23G=DLyo`PGZpdnRJ`<)vfJ#o<)f5Y_ClmiMyfK^;8Di{ z4^~jB_6r|R5hB(0Vt*H4MrPTIy}k}(6_BBS>Zak~z!7=9C3I90{l&+ zGqp73~rrLOD?=PV756)*}>%I5W{|NRW(uyO<# z+nh<)4srGCm`A&giJ=&t;9X&4s?OCBE>Zz?xm!6BrGO$dnSz_7F^$LP2K4R1c^>ue zBXo!Zn!!zhI29v+NjtS`ft(1_cpOH&W3Oq1V7RWjMG!5#08vEkJ~~QRokp z0-iZHxsE8g;@UR3H79hinF>mU9dNlIxq^|??&xUi%4sH4oCgy{p`?Rbu3 zE2lh8NQRPP=rO`3_q9?G(PU}be9?$NAvkPp^62nVrwa@Q@^VKG*t^HsnlO%Pm3JmX zt$~|Zdvr{*Q%!>FNMLw}kw|*NJ5}f~5<&DYF*q8S-F(Hn7&r zRxHW@WxNF7&Rw;2kVUKWC`5IpYkL@dEIi9@5g%A>M5E|jF)?^ALXDHhi=n#_h%C`L zTbuG`xMI?qa_jqYSFL#ePO!qct!YhZp<77WfBD=fw@?{>9g)#$RN?wU8tG_vZUd;_ zuA4cw(|I&pK=JWEBZs@01%Hbm^5r>?#(#lexQNBB;<5SRA`hW@G=3K%I*jx}ER6fp z>9crx9ZRPdmR`lu#ZWDtWku8`JRGi|a8uqzv4E49B6sP;2hK+(@IdLDNjy+=#04hQ zM0#)-QYViQgI_`UG|kY>xCnfSr^A7+`1^PP1;fHcs{lJ(GzY)Hcmtwa2$^PzZl>7y zUwKxLbsf+2I3hZX^uo~oIbNfy@#aFuzZPoYRPIq){Ku5b&vNzUFU7|%Lk@Q{3to&M zutSwkAO(1hM?{B_URaf*)9JVI^n8|1FD$(qSVZr@Teile`1t$C;cjNZtq3CDnUT=Q zuaik?c;0}i=2!NIne4@%M8=gHK4n#<8dXb*Fc@O!Ej-JLrlAIiAHv}Z3ZK$+e?~%| zrlWkU=@g_=(_MsTs_D*6htYJW;|2H@DI1*I9PK?~n#NN=hUpq&UxFW;lS@zmIQbDG zI*jzfIQ4cqy^*Jr-?zg^FD(7Jbb64dH?wqlVd-nr=_D|KFSB%dVd)Z2AJSo@hNURv zS%7D_h_&=A1U2F5D;7*}CJ=;}WMR47%`9#-;yR2J1gSz?q%2Ha)^H@c5!+#;7o-UB z!}y6lj5lQJ)3+%;{w8v`n^|xjWq!1u%oHDgoMmRgUn0nrUFpA5s#OR5o=vrK4F-)? z0ws%Kz)H9!YNJbeUBgf9HWZ(@(A~_Q=S3gyCmY2lEbeCZG^OBbN>2>solGV%z+2+4 zpGYQqMuEinJlp~uoj4O(rMRX83pvT8`Zur?#sR5f49+p0tt+j{$Aa0}sLLEUs9cnK zh$|K)Ns7oiL+0P1>8KjHw>URaQj3S90?DmZrJ+_rd+vm!eh4uSU@p z5(U@B*kkEz}u*|A# zy)3j%ssnK~WlZM>9A!mBaA0g%5lLrYR9O+pNnlu%dQ6A06Tj5#-~eFJ8?hekV_z^o zOt!RTUU;Chm2n=i#foINhX;~@79Oq?5J>q%&Qhyf0I)H# zA>5;WikdQ-a^^_4u*K>Y?!J)Upjc^FR-W$(q`@A0<iIi^sv#^(FMat*hY^$ZB*fC%jlxibYo3z z9SkG0vlaH)FI!>yR)H6x)><+6bMS!8L-^0zpHMg5haWySX)wSX{gOqJSv1{DOn4MzW(1F38=o-I2D zOAjHN8+NDv<%6jL53vH4>;=q3*^^X?S$*{^uQ_|(a^xkf{T402Ufw^PDttC8+z)RA zs)+rVD75;sRH-ip64};1RVp3O7{_*wYF!}j88|-{CF`z1kh}ED3;iV!Y=0Gz$*_Kw zfiTDK#mM_DoC~vTg?(y5Jq?1tB+anvS-z}|r%uPnfy_tHguL#F{bxqLxe4U6(hoy4 zk0aU-1~>K2{N4a!OxCsl!&!ezte!#&6Bs+Bnk733!t80 zqq{ZKDj8{JX>6H=f(?R)rTVMVP)_C%^?kb~b1JCM^#_Gq4jEAX(H|7@BB(#@4+^Db zK)Jm?DCCq-OZtOCsTokt?gt8}jIEii9H^`xl5g){c%WNaBRtO7Z!fZK}y>_}yi2MQm-0>!oWWzd@ql%*A{?o%$_-@160o zz*EX*d2gOHEOL`w=w0_`$2zaRX2JYx=f&R8{zY$s>k1?OKy@gvVQ*>Q77aRn+S#Et zFk=XofpkG_opT#}Gn-#CA^*`foiuQ3eC21wa?8O)&er%eQ$fye!>2(Kb~!g;iff5lL6g#1 z724KJq2pq@D$0*B12rkSl%d#D%+qp z0Y3UR#vE8;x000=H3Mze7vUm`lx}4H$8f(;A`-D z$mi%`o*p<*N|FUjP=?%>Ho4m<-GrHuS;;5ht41Q-0;i+Zr!EF{3_~$^4H{7H?uH4> zDM6m)4@9X3UX0b_Y4D<8q1UH*lrrlGJj$?wRmzMfjW)(WP{Vkr$pSrC-Wqr(O|^BN z8g&^EQMxeifWNO^sUSQv+U6rzCPa!MbTp8+V7|ODd2NhiRqIU_Ji8YT;TrX#3=pR& ztO;v<$%5y2Y9XW4q;%D)GdO-q2NXg|+%1!H1VPjLVwP>G$q97l4~&M-_|s|$>5Rqn4kvrm5JBk4mUSmECjAh7+Fy;tI(^i z8<2)82FZC`Rzbi4bsL}#_o-zXREv_&z_vE!HW{X*!FJN1vI(dFv>0qfAfv~5)jb4$ zCyBtWz<>qwTcDkVYh$YMEx2r3rPDL=qIYgZ?>xzSCq@MH&V;F^mWx7-x{yGlf1*VT zl_C1hh~bw6%%d)&D!2>=hSsRX%-A!qnn+S+E4N{mw$xrMcNml_uwD_a`&yYU$gPI( zbfM98Mxf+UXKQ#2Qk&o?mwqaDogv*^qn?TJK-uYR1?m(ZP!qE#Ta%u^904z<%ZyRF z<@pV!T6Gw=M-%9*#HA*~os2_)5jE;A$O#~ABS^!P&(Rk)BuoHcz;KJIoAg=0tp`o$ zRi}cJ0B-fE;G}_x7#bl|3Qa%^!mPAV(dnU)Tf;hO6wwNlh4758m4JYuE*yYEwkoU( z{F~;u9eH4)09MSyOm_(8tg!|2=~oj%()*I#Qs+!E72T9Oqx_7(nHVuJTu24wXGlY8 z)e|tznP}3;5=cN0q&by|*}>LTn2SqSl#OQsH5|2B8%&zmf5eTs#Bhdj0r89veNBd$ zoO1=WYBUot0So-SX>@ScDma>@x~yPVe-~J3M6EhA4K@XAVB)XAU1Df7aS-ZdUYh(h zD-YNpWl`$XN?y!Na+2<#9K>o8s@*$?NiJpET6L>tQ2aLh)F|Ak8L8v-`=c z@F2}T05R%g=wPHRvFLISg4!~Y+3WLoSWXm~$cw0--@v(A2vIp*?$(K+87KjEnZ0WJ zElmHDV}9j&LNG>4SPgEUT26VOa!J5!q&z(8BYiVNO`?DadpxRrx4u7mt0|90?|9H_@~D4CW`r!Hbg-&41UWqF+CC7D8mS#~q){~J z11pQhjaT!4x!>|7{BI*qO`-)a{~EBYhg+9lkJ_Mp3NZq@K->hMgI zqyZk)sHH;Kv<9TMs)hb31*2`$g}n&aeW{Sm=k=&CKm|mUC`Wv1>}Fy~abh$I+K`pj z$E+Tr8^WZ9fT_IR3d0wMmRJ21G9w*rwwe_)Wk^ouXoK;c4PrE8rL4Jp8pNQcbW_4C zm@uk!E60M?S>-myjeI_J^8c3_s0MJTCkY*P*LUQym7PH{)9rLG-!4T)I)9v)aJ zuQOByj$I*{6MrK^ijNfvRu&hKLt_3sd5@u|XL7vd19s3n5yVZ#dKA``VKyj+U(y3( zej&)8h5@4ld8!m^grc3hv~1C8BJ5zTD@IFK76@%2_)GnF9Ez5pm`%KI3y_e%(Ji|0 zdy#iBj2Y!kd4p;DoD<(Gm2P{&5l28&K9jqP7hfxP-zWy>6Y`&oaUDukm1(7C zX`K~)sxtqBF|^L0#Ex~2-54p~ocK9vwKQF2Shb2~c zR5UfrB3HW@`Zp575>~1)lEm-C3mD-6Bfd9cpG@w{gA(N}#~}c!9vj=907s#7Qe=LI z_&%Hk+PE}F-QUJhGm!sJI6A&hRoOV|Y^_&j7?h2~Sw|Zr#p-AydhlN5QWstHy<~6Q zg&92JB^R~>Rw-*bf?6IaZ*y+LtPRFc(+J3n^0_0vJwfs^hsg^qXZ51)I~aLYW|d4d z4P0KXGB9?oOGMByi=D~P(R$@)2B}*9#+2$w-vRo|3o@udv4xwI?JM`e^bzzY+7c%D zpa~?}Tpf$qQZ$(;jt=Uv(1&CK;T`?ihU@}tD7>*)(5;#6Z=nNPmA1Qbl=c@%fE}H# z9gB069ROPBIKlQy6iX9apWSt?vN`f93A*x`vz1KKr6f4R-%gUimBP}e{rcFF4nVGi)qgVOUp-ma`l}!&)kr}HV(Bm$OU0~xl#rz6W(g(5Ho2isB7E<$y_j&#!h5VO^ zy~HS`keeVEV7`r%F@%e0V@<<4Ups#4ZP}MYONk!$XZ9!gBL-PH9dGZLl1Hx zjt3A$n(%N+cYTM7e&3lvkn6BE8c24xvSn<{ahRl#v|$R`cTn>{FKB#hDM@R>Zyj5# z|Dh%v+o!7kP!pDaZ%x=TA%jO~9+YI7a9mmwPW&!Sc)@?D38!aP`M;|P_n)6Z&HqoD z@B(PU2~3S{cDAPU;s3?jupQ08wc(0Wwc&BnhD+_!QX28uQ#E1}FZ=&YBNk_B#Nt>= zBNnGMqI_Ut^krzzn%VH5awS(9z75)aF09VEP;!{t;;#^YlksQ6pSi!+h70g~jnGSsaPB%K#>n0q4E`g4 z6Rsda)RJ=vU77?3A3}K~K8&q)EQeZ-Jt1g08n+serk4MV7Ujjz5OheTU@2&B$blUI zL%^rr0oxOB;F%rl+5m@}3S0BR!zkr!ZP3?8mm{-By*yi{lgOmxHzGp~HwZ9a%a+f8 zTFZ*o19fS%x)&2e!nsu&Jf_GU#WZrn|BeXOsKBJsc@*g0_c%qVD5n(6!mm#;KkH?l zSar}%8i4^bD^uw@vhbb6B8cNe6wm80JPX_e)=UIyu_JmQ8<_Psrof!e@-i^$#SBHb z)qqwCy~GH>9!KtLrL)8EH-erpBw^!Mc0UXkl_{RY9T%qp?Z`p zsdpKF1y%*dqNN^Bx70%i83r^nJGK*oS01OCHh`95u(z@8B9UoBbRPdr``}`r@ljoI zfECHM(#N-#lw&_H&pL}`?Yr0~ueZE{kw=I>fgeSUKZXY{yN0bxkJ3Ers`G5B3ji9w zO2HHuOiN-;)&e=H0*@X|71)v>7?#9Y{?lP~_zh{`@0P%);J@uyD&rqn#=eW`C`_iC zGHEjSr&KU^a1qV0$+0jSP6xXe?vE-TUQ222UV^A9n!le3Z;=e2LaSuuqAgeKL^0ip zx$-w2sZPl+#an|=i>bX2e#!zfUYn_sC?)uXV)PG>`u1H&tH#V1kYy|=w7Fr~GAzOj z3p9JF7_5T-8!E__Fw-y0W*C^@Ew>);3!zcdx?<>;NPx4$5K6)vEe+IgPPTNV81dMC zjqB9j8QWI@%?@Tz_nAmiV)0;_ZBr$J2eXd3Y69^%t-N5EDFzbYFhIfcM25aKoR^q{ zO(aJbkA`qrl`Y{R?1`*yWhnOSx!TF?wovsyUXR`EhT1yy7(k;&BExww)VlbmShFZq zoVDtEucc{_reQ}ebpt;+zCBa?U#18FXC|wiaRSkICjem5Rxyka25`YvtN!H+Mg}M} zOsCD+>cU@9Kk%w+k-&CZaRSTPZVHs6?V=?>%As_UC0=|y#lLy|R7sR9wNHePX(`;< z7HmbnnQ0H_Q9!u{q}k;1e+mH?(>V<~rf$@9zsu_%s(ezn!uZl4@H(xH{!ypC|2a`^ zfa(C`I`vKM)kLpUKX4fbT;>4}kEW`C$8?6nB&C2f7LyFc@Hda&obJ>s)a(oeb!jE` zQk^=VSGQn(=pf&?3T{nAS6INM&6cL?JO(eTlHgf;^ogPWtXP>az68PJEkzbBc(_P?UKfWYb`85<>Qzn3kd(hs1 zLODD>zi=Ye)C*aQ<>}l7EO%dp1d3Qc+_bn%KCWZPg9Z)<0Hid4w?ARnXH(V0mC&ZeH)jLz zbeg=gr^AUq^IYpj?UFyLlw*UG z7^a;QW3INqP)g2!$%jUqr^TWmHiInIQoI={z{_uYHl@>k zOx|Zey`5pNEipKqYwt1O`uHsXR9l|&cs-tC=wBee{G7$Luz5(-HYxce)Y3rg{0PzR zX{<*f^jn0Sn_i`322C4z|7~l?dE{7kgQ4Y?`ucj`u{e%!DC^qPG5SuQ|4~R^{B2}r z8V>y?^ch~{ij4pbr{~9b@vrPXZvOUk8aM4}A^9mX$yqj``PX0xvSEP#OMp^O;#|n% z6vBX5ezzD@0J!{W^in*rVj3$iSbR@5!nUBZa>6zs)Q2z~5tfrl*ygtQ82whC|KZ-2 zM7)@ggqB%@H34p&JpU0z702fQaDB7^Jg%?E5f%=tuP_SYeXj$t`ieY347Rb*071O} zp9s~xMr-~V>*FyPBwQ+>Y{OFvc^i5P(Pb*Q0_!n3ZUhz{|Kn+6#>r6V+r!as5@+392K?SxUy;xC z{Gzj*+v=50INqzlJ1C7&DKqTpF&gs>z&tV9xv5^+=*>u9ol1Wr&D^W^QIWnov=B$l z-Fv;li+*mxB4wzR7T}oWBHs5VL>TdfH00x`6NO5qhf5H!CN_Eo!^8j8ryw{ygcQ6Ci6FJs^7uFi6!$_d$pK^YGxGyWwcABsw zMl=-qG7$e_4?{do^Cj1KG96)3aI12*M|D@ha?B^IQYlDVlwKb*G1X;1p~Yz%TObOx zuAuovA){utzXi>&n7r}(0hL>&`W{m)S)Iq@@42QogIo{J$Qh+cnd+O+@j zLn6O#_fhh|Wel;bsaWd;a%ud5B7uUt+yt^S6N3n>lG9Ahs_FP4K6UWvgeC1nx;4d;#Au2FHqy1dh}X0B1o4<1%$~v1e+20{Ew%_x0%7t zK928>4+UV%%5&?Z^Fg3T{m1we6%$-BOx<^a<;%}vb^4!1l^GhMVHC^CCvx#yu&|jL z12H`kgYN_HS4pq3BY(p)kNnkYNB-JRJ@O|8SD_TItw&Yqw2GJ(_8YFHAsicI_MfKJ z|9)Ec{__Kh>Z_qNT~4QAk*xfzkj}(%?aMT>=KqK9ANI-@Pb}kRr$&yq(5K!6vyD}c zM(=Rb-Y216u9yp!34xz#`6iJ={^%5&PSVSV%*=J}YL`5`y)sqr`6dz8;upnL+88+88F z>B3P~xUb$v=V~{S{d#43))A#wwi7B+^_qNq@?9c!>;3#|FFW`8F&+)@n?09?JcB{b z+Q#v-v1f^s^<+B#h<-3(WcUqfW=H=m2)#{39N@3z4KWNFnogtJ8;=hRn67NUj|4@4 z@_&e>vmd@SkMG_6CO#G$Fr#y*P0(kPU^Jb{K89!9iW)2Ewz|L~xVuU{>IHv+NL1S= z(%7~sFr5m($k#Noloqij<2sCN{)2iujO4PTf9fCc14$OOu}<^l(S9YGN1N&7nxnMrcN$HF? z0Rns>v4afRRJ@X02?5!Rzpt)x3ksfp!Cwc$f-&Qt4&faBuFr^02MrnN874JTU)XSp z)rll?-P5VtLeLQ|va#P{`knMX3!CsO2LA>W%Zel*8@Q~7pXOrBHH=D40{%2iW9vk+ z)efYGqubx5_^c;C)V~*?!_&yew%*EJ1H}7ZfWd_=E~~!0mikF#4<7tjpBN%5fa4&B zIuT}y_k~haN5}4%zocwZHBgkUVlAKe2|pMpo#Pi8A$ZSXzS&_sg6b%w9=MHd^Y*B7 zSiltj33{0-KsrcNufq$rvQ9uf*T%|(V}}7r8SJ?3oqpMYB_MP^a;k=l32?bItp7I3<83s8nFdWB8)N0sb%w0moQdAel!X0jOwW6SYbab3 z{R!87^`P(wor^yQ$jRLk#K;%~nDFClEXlHTF(l_=J}ffGd&oETM%qF4_w58et6qq2 z$7qiQmvyHOs=tE@g!_Z=WYAjD&~9eX3KP$!1eyjatyA6oos9ZkQg;R_XMFma?CTyr z?cdfvpSs`1VkzU(3%~~l62u@6fMI_?OfQDb2E%5{-TD@y4PM1AqK?fy3qi3bgLika zD*N&dyTM_I9@ZcGa8y$M^lP~zH!%%-dEdYdwu*S9>0*b=H_js z#u&#tV#fLj_;PIbsH5}b_MCVCLmty;Ej=~APc<{GOFua7#j5qzdHg#mrKf_gp&h@a z0)k%v`2XLD;cxN@0gUOLgjkOl-pCNkIu>Ai9G?UYz@X=OI-E2mSetZ_6zG{RjTRGMEF`_8QZQFq|4mBz18?-p zv$#stKx5yVgHla1OhN2hT!Nr~%~4E@j9Asm#`qzDyCEe)oUuI-i*hf ziYXFs4E-jRu%b%31XM^DG2{cc%iV()o)xLX=KS~=!o~2UK^hU6ft$wYJ#yveq+r?t z23%%!=_}}pLZbW?R4XJV@e1--1%b1G>B6F;GfX;^t~2=5r&#HeJ*ADW7*VW2z+QQ^ z8-_s|@yWz%EPlU;_4lOX-N@1l4f=IxHcSO<;=Si1YkWF(WW010inFeX83fHZdj^=R zU=U~azcE;O=%@e5C-cMy_XCoAGFOajL_mpEi9u@JDlxPV4?w;y-9GPZCP=3E-QfF6 zIyX@H8JT%x81=zo6MTD_SUkeYW|d?jw?QYje(k~D)pTWkR-kY9M+3J|KV}DVfL<_N z;sOmlI3);gYj;YninN3_B*-VP5`)zKD^C&y($$S8bEJ{TJ~^HJ5c)om`4Dm`u?AgR zm#MzOBm}G(qPm&qN!-bLg~zX^v3QoHm=kq4fTwG^%H;Jwo=#iK)3OcZY|5(8MzL#A zrQH4%(VYF71}PuDELf-M3YBJ@Y$E#>4Ry zFgld0Vf1JkqYaQ4G)KG7$VK*gt<8^M~Zv0(>zX$Or==FM?4nO}J|8jaJ z*!(;l&h{GW7UiXC$F>{!8^gkT&^@f!r{_`YM{zxYQxX9 zttE;I9L6Mbp_^(TAm4_L;ta8eoM5iey=u!nbh0f2pG8VI0IGARkrUJ`s z{Jd3Ym$opr2g;YT2NVi{JCuBywj(pHzpPP*y-NOavugwG4&w{95<3Z>V?wJUh2I!8 z+rxaw9{&?*bmQxZ{H$6ct$wLIcR*37N1U0xq2yEBy4n`!GM`9H*~o4oP`1`771V~A zlq!=bMk!#@zzEPEadhf8hFScAFiQxt1h&{q_myHtn6)laiGFc0obhD2V04xDP#40G!E0L*`l26-9P|jq5T-XDrr)cG^|E_k(p}-942Fm9OdE1L#{%(&Ft~c zu2Ey`RJkRcj4mRtGy9NIMsmE~oK8VYD{tcL^U25^h|FXb$1H=}uSgkA)3RRit8y#lxQULl=e6ew zm6vT*uL#5z%%in+I@V_sKoI-T3dL%rlvg)H&@aT{{>1cf~>MrbECH>Ns zY%Yb61*R+c>r-A{ulfvW&(t=oJ!$Drz*Oi@`biC84|k@#`=0=0?jc|KJe8z1o2sM6 z|3-9UV5q+lWq9(x=P+#e%bV;4i&YX|lFl&VnqcF3{FWrPM@;gUlShy|?dlcG6JTmS z0>G$Z%Bk~*8dj_n#rPmM_PglNTmm>B`vAk6)5Q-p<8sB#%X4*14@VnuiGyq1@?wRn z`?2n9A_)P5yY`k-^rjjTEhhd zD4b8An@O+59Bmy&dZT|lhKoIuM{MudMQ1c^{5&#tAX=FN6q^q&XGvWp(OLIMzAd2=T#2a4icX-oBhM!qv_Y z4VZa(UUb=c-xs|Gz4|(|U9^XV#vTsx9U-|8#`HQa?wchvGjG2*gD$_=+S2Fpi`|HV z7N*NDxM>lkR+))mfFMAX;r>L5QP!pQ{V@HJUye9^TP>TvvRyk@u6&Dj?Nllo9dAMA zT)d;h@H}KYBiyY-Vm88tHNA zES>hT()17qwP zapDl&1vyB)7*kh12=M}9@K%7Xt*MLGP!-sIEm@WEUjqc+d}R@XH2^^TFJi-S+!Fb9(5exGNmdRoSPDQ^qz43YSI;x_8=Qy zcuM3dEY9_oxO!v`)?{`mU*V)SLeW*oiXC4#KqDVFi1%LsZH$$oowvKmY_KUi99u7U zZSOErHu@L9g%>X%4{m~;(ag$@s#E_Z3fiL6dIO8ZozX76?y_0!6oEi4CCBXzH-DuyBPk9txY3V4X>PWIZz<3Xc>^7QM1FbojB~; zF5dePI({667Fk-BNOeiK>$AnRDYVa13K+_}9Us)p_Nl-2YA82gmkX0HG4wf#rcf@# zA#d>wx@LSnv0{=N2T_Cd7X9=r#T z(KzH83*L^foHU5{)*>()S1l#YWF8-hT$^4jD zR(4-@1-a3>z=y~pL#_G-3PA2EYAdHq<-Rvug@LVkIL0u$R=x5|(&yNBEe6|BLSAaO z6)zmvR5hk?uehq(j=eeg-VyN7M{eZeWo!;QgwfVji=Ca2P&J2P4*!lpz)kQ;-NFG) zl?JA)=ud#3IP*~`%FjUZ=g(`Z zwhwZ)HXhGefTanv6s~Z>Z-&M0kHTq~VeLH%4#8QLHrsCdCsEUP^3`j{$?+J3w1D=E z$m)6g;1C^;9SyFwtO9$ZkC%JKjd}VOL^M%$A7xJb90f&DgO$0zQFC zH}tl>6UIF3B)X&6PRrj%V{T~-b_bc2`<}!-M3j^e8}CjIlm@ix22P>!Ga{9DM6UEh z5jmbht6k|wi^y%=M`Oj|EB#`S^dc_|TIOEyH*_%Wpr`N=#}33v@DC8BdpjkrAw7pdl)fe zss=$>7iQ6%5pzJdMS0V)F><$#E@nH2*}zac-|QvKG5vFOh`(H?tfR&tg<7L_W8UAO zi%i!z*h3C_V{wX~mf7m4e}EwJ;m|QHmnzvS=W8fzy~GUZ!#_SB!qyk`7mIQ~mwe3V z*a9kvf%+mB0_A?z8i0=zGb|yB1RnZt^i*`Z5-2YD6P@%U^-*+>rk#x^^H+gk(&>#S z2TFyFCyS*KjVJGvhBlt`2HsB$QWvval*NA=q?yCIJPmagL4{`I7hw3*dhW22yY39+ zK~s*0P7NLHU?`I~;+nUU#euwz8MhH#nYZPEUR>iu>qCl;w#*0S_(#C9>7e6pf;#bK zR6`4^a4bwl`;@RvupU)CjP_>x*-7h;x)i%J-$4{p!cS7?Q~&rk;<-g>PYh{!88L~0 zRroxEuB8)UAWmjOp|8fHUO9~kqtb;M2GptnR7lk&xjPfaCj5_$E};dwH7UVULt|v7 zHpP7sOYMe1feZQS>Jl0hzE11XVunRlzZ>Q-d2JAPk1F8Nqb}EYX{fmw4q^zs37gY! zf7CJX9c_rql-^a|YTIAX79T0^6XiC~%y5-8?6D|sDerc;i-BUYEpBPsKSOqAFbH{xC1d&$;);VMJeqW+zUq(R9*OrN9IIkCUSYb_9&9XdgGD=^&aq)=foi zZ~@trNv%i(WD|~c9}yozKjaq{QZzE;MefkKj;zSRZBY!SPyGZ9fQIRvopH^pO~`46 zx|`0n223d{1)aZ8{w7zv|HlThy8j|9b7MAw(K-ibVwOTM6DG<6Jm@Nt`x+3VOrm+h z%9E5w>1J8spo@8GRl^Y`U}zP}9Q>Fv=Tm0K&US2IWOta3gg!OVRdnU~QWyE35S~#P zYz=%We`AFIDNxN9kej^2g4+TGSVYFS)-+{k`AErBewt(`FA2b+%asN-o){Du)_C{O z34#15)#35*osH=i@?$9#l*I0WY0ATzWH5wQbRH}p6&TQ-J0GU$wTaWphXt(oHpDBy z77AYsk(EQ=ihw<@w2vqArGl=Cy~}`ulNEG1ao;6lRsoVnYaeZq3b2+j5&cLr<0V+X z5Cnn>BtrKJ{+10V~d@(c!z#3QN0P!mk z!UaJyRt>Ifs>5S=+(i|gq`jjHr*U7DKi%>E^b8ZzKIBCHPIu3s3Ro5v;t2%C_L3f< zgn@!J+|^|}#M&BT1DmbV1R4mn%WTJ~)`U}NyL1u6OUh;KSlr|t+IV85G_di+X_B$= zL`h(9d9F0Dd{Cf}HRNyxn*H#$Ynk`J9Q586vsABn`A_|dX`7oH$fY+d_RR?p^G%V4O14CMd z;K}w^H*Ix8oWG>C4jou|s$=k?{bXUTN!!Z<|3a1awJ=Fv?`HlMWxN@ZtyGX#g&$RS zY;bhID-rXktI;-)6DzaMO|0gcCt;>bK}$_p154dYoCc^6D{ophFjtF2=esl+#ysh~rC7gP z;uhxp%q?7x@D~~Hq`;6FYOTqyYckaICU?aeJR-*ueo8( zfAJJ9lg1NWE7@Tz0p+xNEAx|1bdvf>G-c)$AS&`vXX-HC23;U5#O7b)9SD^MC`9_f z%|dj^Z}DQc&_Y!$&`6LE*rL}V0d(7;TxnD&(JscTNnM{;>FJ>(rKh)j#I9g%VD zZnCD?Lemv=G1#kk#U`gMnY;NA=Nt}eiNFfhvM(3%ca$ojpCPKW-0uNG&(Oi+c366 zzfO4z?LedAWXJC9hh00DUG}|b+8*aL4NKERAY40_;$kTx#6xw_nKEp+2Yu#Fv>h!_ z+2{s1thiM5FnQsf?DjXhVuf>6YuoRj)T?2TjnZupP^wI0<=7ocl_6r?N(;sDyZ#e) z9#H!iARI&FZauBNFvF#r^rje;x5n<+e%P_!p*nWc4Gj=k3-@oh4k>TK!gvdc8kfG& zrFex{x1_t8--Xh72RtftbuOF$##xk&k$=#D8F`U@)60RBgf#(uC+-eMP_HIN68NSF zw|VwTaT>C4)tGq*kl0js~~%CL|)=trGU{& zH7ofne*q_e@;4I|;e19$0TGaD;sU1Dxe2D$V=V-twE*i4#Ai$hxbN&4xWdrNslfp4 zfo~G{kweqQNL;FdK||*y7X789wS{eedRZ#)dCl$B-ApS3*n{@NC;2W zd&5YeGzDY{oasDB7bG4sDIHf)H@g8UFU*=I%$kb}0r;U=erY8WrM|QBKqIE0_{>zD z7&3x!FRTG^EhhX#pnd$*v%Yxhg*zy607brRug2Ktr=p0rQ9S%{6mJ0>^mz-SS@D~S^elkPGx3~ z(=UCV^|+lt#s)iZZyxrmDHd!YY)j~8gsaz1bbSN1+7>p+$zh8|MhveI2G~19St@7< zr92CdVBo^y9r-gGAZ!i8=oYeuVLqTd4k9e5w*UcrE{J(->D=oW1g)=83wTr)dJx7! zn&-^BcIA4K78>=&@T<^~&!gJ1WP#;XqM4@_=fOz%5ZcA1O+bJ&tQ**3rQ&@B=$J0p zS1GHwM_XpqORwzaTpE^cETC#}9bs1SQE~NC@JAq~6xCbD#v;}>tQW#RiNR>5t{&f+ z#x2^P$z7I3gTvFFo(R?zPLC_ps-ZB5rQxjd)TYad#swN0nT?eL^@v;f#nopK4v_yG z3}$kxzAcdxF_*Zui1$B3COZ)*28W~4h(`xh3nNRPo~Ufby~E&%et-OHLZoX*05-cm zg-wq*&@ng9=FIC}p zw8Dj1D$Gk&SfW*!C+}Gyw+?DcMP< z6;g=#4?{_UJ#>4X6=Gvm@<}B_s%<`;J3-KcyZuSiAga2~lR1Q_)Vy$fLMG((#gOeh z*5?uf;Gw<*S~f6V+iD#c(V%N6@NXo)3QeffpJgUd@~RVo2z3MYsbsAiC?_# z^)YluLW?nLjrP(DN50>b;e@Z5V-p?o>|=*8r)w_CP(SslK31B2IUwE9(P zuoW>2KaUiKsB)#cu*&fnrj66?CX09Lavsz-wC5q@qp<(YzW@Y&{UTkHvpg;?M4ko zwJK_*qI10C>coIy#mv2vRwCKd!SR9e`u05#+mb1m(>q8ZVEd3`3j%h1+oi7e77bIb zG7#hUAU)4PQ40?uwG=c?j#wS8&c!BNGL6Gajt`g%AMpMiew1MsF&rcV5Z~a4vK~c? z5+WhLmPu5k$^;Pss^#H<;UJ5`iW~}nU8|oXN+e%X@HygQW2_iH-y-UgtFSDlY~|-c zHg5kY{PJ^*@#wjikNr@2nPq4A7j930F1KR-YqA0*qYFIz>r$_oEX&_39hAvhv4P4L!sW7n6BuMVGlC6)-4*suj6z6?A&hvz1TOR-4ISJqX2Iu1 z+>lI?%865vY#}iv8N;&u176CgiCxf60ve{_cp7wDKERD*)w(u9Rkw1>hiMLs8pLpF zaGzR?LQuZcoiRNXQr$Vjy5|09fV9;rcYH0YSbehSSi0K+6e!DJ#q0WNEMsyVQUmyj>58^5VzHcxQwM`SDZ#CmRRN2#LD^5czM<$gC<$e!b^)gZ z`1p_~icQ3_xN4?=Qm_QE9-sO$CM--OmW_Ded3*)@-u*H_}(PF2Q?*v*u& zm|XzLFLWfuK=&Ii%41g>CX6rU16-v1olXNLadgF31mB+F7kr_YRe`)?5audv<2c>% zb;9(;6HH)Lq!bq?G2s)8Z{qfJ4$Rw;$KVrA4m=rXv+K4(< zRolJT?O?wtKwqbt<$n^kB);#(vYQfTKnIb2vt!90czNjij&uEwvphDI$AVOMs1?8E zxB-N%E3zAh8gOTfP07ClwKeXu9DQ%pHhJI0^15RB)Kn>bbZRn%N+?w2^VHDyxt8G6 z5b+mvEP;*ae-v7QcmKaYG0N-96Epi%02SE>{6y`WR;;nSfIZvip94}ktm_%9aeY>i zpR6#x|0w{CwK?jY`BpmRbZ~>Y=#QrCU-;D|7|E6hOM1txwDAm(r1+;>+q? z`E)tD7@7wqCs)u3SzHu+1Z@H?7W!({b0CKQFC|hw(OU>Ee2{^}K^zFJkKZFzZJ&ed zLDByBekn`F7EoydX5pt?@{1yNl9f6i&fxA$H{{3cP)K3oM}14w)%qLLjr20hmvuE6 zYP{!mc!}WvT_%v!{?$u6gC*b=P?;!V=G2D z8t?`6sy9=@5{x6F*SK~gN0f%Le<4l1aU>tt9ws5pUkVYzhYi>_MZM~;-%kniAPBRf ziVrSCu9W)5m{$I45`fGxZ5zILpcIf6_o;LG6n9eb)PVLYpqd)c%J_gL-lvkl=F^}S zr7_K;SpVwdyECrA$iW8Wj4|z<#3iSUY3C{Vv{rp;;i8PfsUhv1%puJHU(xNvT69gf z`de@Y!(V-h)Qi$1m8I`UH3f%c`A9_@c&*A{*T!YV;anxpjoaeK@{&Gv)O)bw27_5h z%?alw^I&&q)ul#KX-s+)E!uS|=evk8_;g-_VJg=O@G+?MucsP1Gy>)}E`uVaFi&1z zO6y_fNL5l(3xVr;^@{nJ05D$m?G-mFl+=H(kS`JXbPKAFNqOc+7EWV;zE_Vp+|+NK zsUAU9WOj&}Q!X*SOq!y7*kT`iUQO5{YHB=ro@D1&H&qS8U4X?6+9iimA7<5|f%6+r z&c((tW<%qHqjUsYs{}gLP>Va^uqk7HY~}IB;Anj0q-FaRH&~ACRX(SNXgiea+N`uM zG;dWM*sGy$J9cz_4B;@ zv3wi+An>K?`2NvMk5Ng+^4l5`7or&`o8YBV&5$EVNEMB6Zq$r)1NLifYNGEgE63Fb z;E04U;~LgvU?>XNX!_AKa9(f|Z9tF7$xCor1fIgiO9U}US_1$I`FTx`w@#hF6o*OQ zfvqZ0tf`P5si{^@>($z0u(~9k?zV>@zRuAe!65XpHJ!%*@OT&aG2r*1FX)Z{xfAa?W#E& zD#74PCWbWW%jX92n9ZCpl+TkaHR^+yys(42*d-d+(de2dh9U%dF!UI<;g1IsTwg$8 z%B18%2Lq>}Qovy2N@8L8_`m?L^2(%gJaIEI2E$VUp4b!7Wbvuue{tTbiGhr>o0fkYk;Dm z$%J#g;~S694GhHL-rzP#@5Xt8$z&0wy5Mv{Tj^;<*RmXFA;R4_iOt)P{O8aasd z(-Zh=aCIOz30pW(j7kFf8HvGgP*4o!RQR=GWuA7$^Mh7;HESzDHCs9(Ywc4~muqDL2-r$C+%v#w46`Mm37p(M)pp3ra{>im1sok zMzRuqQ(CeTD~WPbqA;{;`8bwX<1b04zR6Ov8dKB=`u+Mt0qtJ0>U5!pImoON*=p(~ zkSE->fXRl1n{R%18vVKbmu25W=B0Wp5?m@3#vNYHWP`Czz5Q0mpaHT^ny`b;?_zs+ zxPoG$X4oT$6Fq8@S$&3Z1w}DSo5z2eil7_g8?7EuNM9Sy*d}^gYZ>qE&XD-y?AAJA^e96KgNcf9%{(HX<}D8uq$Z!DF}Eq z=fXZXs#*f9smT5~2_Ij5lrCK$?+ngQ37B!OJTADgR=akc@;L_E&<^BL@>`JSNq0DZ zBA$|w853&9E6F6fA50(CMbHo?+~Z1Y3Y@L}*WK9d8Ea;5qxjbkeCn_-sA>ai0vxEJ z0#UN*a7uc1Sy3lK(iKVpU4D!+6WeQWH;pHp{{~*wUAF)WjQ=LAVCCSl;2)(xwtkL; zb^skO3>270V}ZSUK2{MpbYfn(h;~D>qv1?z;$}Xdb_?BIWkobt1a9Xa|EbZ=( zo4@DyQvEuA1>xOyy3W8s{(%2@rGR+jQ|}~xaZ4pIO?95e-k@|Qmlcsl6GJdUgec{$ z=){`jQez7}JZf1+IkP$l!~hERr`*a;(0kM!7(zj&>!dV+Bg=Z3*Ix{M&pki4ETGAo^ z15*%JFo;=4Fa{Gu3)!t1oqr&zv+DPiN5k zwl$jhRq~{0%~6G(!Uig8lbF=NTQ_h6IBi}$7kV0ZH4*`sjC?qYI6%jbrg6`fe%bl_ z!WA9R_4p_HQk4B+X}`RJC@kY&flRkR7BUW`$+(7rvc`k3A<$G0{2r*66+H@!NcbPd zQ<|wE0ec6+o@Q@xKS*F7DN2D2;d}xUE}~b)@I)0%n9Q$fWwf0aP50!06oKpSAp)~A zmxQsbh~z*F!A?P#una8aoRx~AHz5f(SGAOaUn}_4)Rvv zhyOr|S8Y5*7#YA`1)shABN_zij8I|v1A7mEgHL?}3W0KU=>w-}0x*LY)MofBHx$cx za8%GYI@P8ZsRT7T+*}z8Gr#93ks0?8YEc+3l}W@)+`~l=bpa}4^Fh~1e)D?@<^?I3 zVsH=2_JTVz4L7u&;AZrm-L=>xF(}mpQ+`GS_uqS>M6pMG@1-;nSoUTY!+6!2gN#}1 zGzRGrt!eVq1K91CaC2oUk)z!V|DFZ=AoK?q8xr=iB3f>fMre1xirU?;dFq|m=$SC8 z=QKf1+rgUjG~E=3RVuzoewJR`dYF*mY9r5JMZm7_=_T zR^Ga#75U|jTE7${n6U{_QjMA(lrBZ*HuGDI$-qtwB=&E2cxp6`H<7oqC z#}caBmcSQDdmHCejOS-c$%j&3rb|UxsjOW@X(xY%yysH6b$~W}YJ)x-PjD!u#<{Du zLMVn;L45E7BBc~n)!?+x^BO@ManlNP;}-)PHLINDR&8ol{#lz@B-!ceU5OHFEb*@d282@aA{4 zV@c1azPOu+Ax^Msc9^AA3opUf*epauw`)YNM7K{7eSV7Qh2Gu-@4Jf{l?Wb@mEZ*S zLYj%Fp1Y2et&SaRcY>a?H#!aJ^~#X?u%+p;oK;mhi9FnM!#IJp5@uUD+Kr%0cmzk4 z@qiEGNLzP4riY=|Nu76#557r_%Zjk!c|5f_5z8+U+K9H#a*@#>PB0S?jph(Biy<6Y zNmXeLcPiBf7JpBwStIhzeOn#dvr#>RlO5Ux!o^@ICRFjGm<|$ghwx0z=hKsS?Q4g; zr}+KQ_T1XJo0+kFbvtw$%j6>u%?kxN8`ew2q zeCiOq*Ef?HK}!}MRY&R7_A~06*CNiVezuY2FR5>)1uP$XZ>Et8+3}5zeUyyVz-Cgb zUNweSrGS#_n;*w7)3)+@Z0uOjOhX@C&<2_8Wz3_GM=38HI9RZjVAPPIhFj`}2d;rn zl7#~v{xL%Md@KJCXYT_TRdpr)&txXa0F%ss2}TGIF=&(^Xh4A^m_QQ10!|V#F#8Zb%d*_+r9Ziq zN*r1~>Cu9r_TrRk;M_PZIdCo+*AHAUc_b%saU_>Kp85;!jpX?b*Es5Fl3NwT62}sa zo_&)XIK6py|JgUWpR(&z%D5w>LtVz%#|No@Cx1xC{Kr4u-UGw~6k!*G!#*Cm1tzUWZ0drE$M}vIE_*StVZ0 zXG6ypGxbd#qs&ZQ)X*V&T$RRLGx_3%4%rW`GICXVxyKM#mU)Z}GySTDj%Jl!eXq{- zb_hbNjAWvN2j_M?#Ft#wl^>_u;OT6IpGh90NjadAlRa_#WOpmvfFsf*wWi%pZcl4w z9S@`9Mb&smL&qI_RvO=x@71~K4IOLwu2SC}9$v{h(PK25$)|R#R;m4F>Z?1Jsl*L@ zcC0WHU+*!Nnu+H&bja;#mB!6{H+0;|`!1;r!`0mmEk}`w?s0~ct91_CaZHF<-Qx&l zN?Gda0p&bSTAXdRnDsX52shJjEjPWe1mMrXQA?TpwxA$9&pCJA5jb-FWBJ8q&(C)a z9&)^{9e46tYwSJ&{=5{famjUZ) z7F|_vFbzE!FGR8EaJ9&WfilAkyk{xwV|zZswc|Cy05)Gl&_ld4^lI(ne%Jh_b{hx& z?^_yPn(Q%VQZ)jvGXD4p<2k^oPaJX-ydvHgt`zM6wuh)M{jTZ1>)SyoqAeqxsNM5J zi|zOvdvB0ha)oJpnfU(hByCRk>-NIGZMr&Kwg9IlhZJ|>l%ZL^L$sly>r*8pNdcet zciUafx#SL)+6!OYlpS8Nz+P!QY-TjGxn-#Z*K-8lJKuLM0f0j}6$^guaP4?s0#WJ- zBq!uuqwW3Lm+`e8JZj^T#-YVcruMvo!%d%=t?X(!4AR_w=kzy~p{!~mj@d&Mz>zvM zqgvaqs{=%E{k`P)c}dx+hXZMCe8a>WLKR7Ym&L3u$8^8+>+qJ@ z3HM7muHY`_)p~C9U9VOtvQH?&`%rz6_&H*0OlVc<6_x80kMT9c1NB;C+#P>4(v+G( zG)XB9_-9D-+n*X6aTGZ;chPpui7q^A>$q0?qKZgzOaC_ODm;h1KGa1}rt%Dg=b}+P z1ihdNk9i2{U@6|VVv!Ic*Jtgyw@Q|VcOfzKlr4&?>jl=uS`j>L&J)!&&yAsr+m>Z{ z`@0;<*`*>(NC;c%3k=_aj|yM(&+u6+cGhT0s)4dPB*yQOtv9qVvN&*ev+vZoSB&#o z1NOrgQdxU2NH6?2S%Edt%9v%fAS~PB=50Vod)Um@9?SEchA-%@X&* zTfY+gEUPy;hj>b{Y`?=4k%pc)P+l|D{*vj=IWms>y+l}$Lgn1S)%v_FDgVf;CxZtZ zp;=N`NX3pjL+K$EyY0vA@1MfUMw%qOsw?>6n65q`Q5n-DN8zv0!)KWJ{AkexMy@nc zu&Voq%nD1<^+}ZSro2yzly40!{_`W(E(e)z{Jqmok{*R&XU8fI) z&+IiiEspFVF#b?aiKRVyRWC=SUq!Sr;WQiJAHM|aaxuOW?DfqAP`P-oWjZg$?fjU? zj+1ELSP63eRH$yBZ4D>z&RHNY{Y8xU=rqO1_azaI>Br%=o%YFe-9+8qBI##{^u9`2 z9{bVB~<+16NQY8y1@>yDV{=R<)KzE6rp{t@;*B~Z*3JIZf{*%k$kIR{!%1=`P?VS&DO!ZsdR2g(@%KTN>z+WCp4ddW-$P*0dZJx4%qvV16@o;2gXfB>;!*eg1pSSb&fsm8Jo&bDbm zXJoTlrZP(N`NQLB)ZZZfF9i>gwZJ|$RNSoUi>&HRmN%&^vX~gxFjPlo??r1Lt0ppC za?%UMvRI2`^d`$wq|#U!@Em$x_y|FX?h__BZ8kfsOEjdeZvb1IhAmd_-e z)jSxxS$!DRiS>h6?#~YuuLampaX|eF;Gt_nH!?jc(IKasveSVl&+jl(V(B4dpC-A8 zn@(K5Uxq-eG%07j6p<)_T2y=}Q{q&e*RCHL55MbBKul2yVnrdln8h$f=ZKM*Sf$P< zdrl~?Ds+SK8ormn2au`+JAc_(V%f{zJNzYgm013Xzp)2OEDik4;C&T;8h_97capzc z!pr!p=g*R!o^DOzXV^bm;>&KnC96kDB3NEh`E!g>L1V|IJ9$adqkpE%v;0l#F0nN6 zx062zA}J|J?j5oX6~}hAOVjZ$hv4}2>IQv^s1_R7c=bMef+f6`{OsF2^m+LN*K#qN z?At5LsrA8g*X%h-9NS8cG}%VOqo}FgYtWBYR(WHd4T|m-x*7GFFt+82h4ja`zV)Ld zQ7ZXzDah2hB&%$rY7I!YERpW_e<#I{OxON41;e7zRC(0CkH_QNkjV9KD%VJ$)K(6; zP=5ID#5_}wvA4N;F&O#GswMB;!fX4Z1WK_5os|vx0X9|A<3M{ZRqW$ri2>uYyI^|1 zv@itHM6L7eW>x$-ihow)wK3*exe7b~8L~Eu?JSj+pu3$*UK2lm{PO5%ZD<#mr3uAW z%d-MHRsiR#qwd_$uGQL}8C!qOh3CNFmX;%pI@$D=PU&y}nW%nb>Qz_^)AP_W3;r5!VYe(aGL)Fd1j17e59Mr}({++N zTxK*1HrOK+xm&}6Uh>KI_C|Lo%ls;3ySnhmeP@(0aAEhxxd>2T1Qmtxm5Z6PBy;Dm z%<>h_tY>C@R|raUF~N7wVq2{O3SPm5x7w1zZ|SZ0l_5*;U2L93KW8BaGj+b|0OO5+ zRm(}iV^7i-wwEGz3LvPx*%T(uh~SY*J_ebd+qX!+CdK;o%Adtb(UjHo3D?8FlQajZ zS2B#JuVZG@aihdrq__pN2W5#cU8 zmxpnbQ(r@&ctxN%R%QH>B_f;_$l}=EFboRW3`s!ofSEY5(8y-#8Y$p5HQ)P*5s+7} zx_E?^98KF?kFk(qg9lNfXm`e-w-FMl9tu<(HB(0b^#(K(N6ipB@xLkYeJJ$*DG4`& zL+14y?84*?Dam$dmncYWpCDT2?6!(PEanVBb!^Fv$(C%g%D!v4G5%j-7;&{MM1qnv zePYKbyfSW4ZmPy&Mq{q#uu$G=_Uy|z?(Nwp{^N{2uONSMVhiK5t*QGSf?K0Drl$Qe z1%m_3VAL$!^@2!!kDdLz(V|X5Rhb8*j*vD_orIz(xpEjN+gs(St@Pzih;zAT)(TE@ zM_^nSFoX@R*Quc*Y8iE4t~^-uE4gk!9h*}eOdXmt-i=>hazUY z70ba_;lJzDsG*XqVU?(p2xcX6ioy9_yprge(Fp~xRY|c*{&0_~B(_y(?utKQ!bhbe z&a?bPl{)Hdq~vo!J;Q%2QqcC~=fo1jlvBoTxs)wu{HCR>*qu#7&bt&{x(VjQaPhp$ z_)EhT+xw3@=sJR&$=?V3U3atu0NFK=d(XJHtm*V=zD?#VS1~=Edx3A(j(Q4BtM7NfhuLEf<;B9>}$wzKm9`v{Pm;FjwJ6(BL&vBNj|yqcev9BPsga-$v-Iv4B!47TVM8+}V z=IHkCJzXW@o5%NlqVQYHR3nC+-dpgBTES7n*^e2`zkcbZm#WVGsp~^ql`lIp-Yb?% zz$S2=pLYK^-Tp69C$!40mVnZhDVVELFnWwGboR_-5+PvSo+x*>88H&97e@u_j|!}v ziR@od*+-&Gz#2@uZ@LK!;$e~6{*M~`*`XFB<4=-3K(Xq9@MX~)x z%P~37spc`%U3UW{_ueLI_}V3EpzQu+sl>WRST?rNWvk8RJ(b8?aEZLCUJBUl*i%9# z@)pJN{xy;JtatR5L6*6=0P=01YU99kNtDeV77hxleEFBh@v`?4xz&iIW)Z^<3e$+6 zGG06K>{iPkWv=6tv8(wpl1e4e)t%UUOWi$8W)`DV0pJ8E@sPNS`Z@TQfTBP_F_LO1 zDwm?}y;#&7tI>a@*%q^?-CromsFB!_MG>ZF%7&%1|H(wndsXt0Q&qb#Gx7)-8i~~U zB~t5YA}pxnmA<^JIC9rsD!F2qBsY1bK;%ngy5q9+LHeVMDU~{gBx8_@y$g)c|WyvMZ$M?*IJ|pS7llJ7B z^qL!^*LxGiEWJcA?X47plvTnhtb=%BhhLzhJ`X{u)7hCUT*U3j{Qe#}5nQAt_YhFk ze<1Ml+Na7i2PdrO;R)g9{sSeyEZ6Lui;2Ib|A1A+FDm$mDl+mQz|4ZT_OpCo8z_4&8~?UeN6C`g{2%vN@=G|EG!f;t zqog8mE?*m$c=i9SJove7%OR8ED|_%E(Nhw=*0(!>h(*<-Q>x$q4D=OIBL;!kKFjz! zFvH^HT4XkiELujf#ldF7Bc01~-wJl#4bT}8K}W_c{fK@ba4OJf>3?(5;oOqIsX~IU zv;?|l^`Ds3368GNkK|SaPUYBV^}k8JN%{fOxdW$`s3atqtRI=w893$0of}J%t&-RS zr^@3=rkF{Ra&L_#nW~al1E=Q4lT4%8S(7>|b8oJ)&+?s&x0xE}7!_5j-F?eMmd8}8 zWv#3|Xx|xW-!43=FX3WmOMsUdT6VFegchSR_pm{^ZvW27(ASsu?~=!w{ZGkbb+Kh9 zai#k^<*Q=0!VW8DILx3==YUL2%JhOwk=kt($z`RLL91Y~7l#yOJ3&v+izXVQw5a{B}pTc);?x~;G z+E>!>8Tx_TBCrO{ZoS;0Cl&B=H+i&OlTD}AE zBJ?BF3+4#FPU?nCvjV5y_5`}Bs_4f8-|aN9@7pXs#JPAkDT9M4+^DKv#<`k*u3pkz z&AZhLTlW8|UfApYzIt)7AmJs^Gk1c|0`0nDiyLIoFF7V!=^pn09wsZ=vCGM8UW%9T`;*`gR1PTAL+-#YCK-!g?GyQ0stTIi? zvrq4iQC^m!yuig2G4gdMXmg@UkrX&}t184C1S4)tW*$5ze#0*Q|AL+n?c{@ zk;|mv5-k03wS5+eFBjHfrjK=aBK;&Yy#!18TU7c#wrPnERmzT125z#cK(7$FuP0GImpkF0NF#xS7AB4x!v(Fw+eGV=TNzx zQ(un#7WJhTuDk8~29Tfp$@^4X(z9pOm(nZmw(d35*ItQ3JAhTdT=~ha;oz#6sk)(T zQ`Py|N@;%nNNLsNp$WBs>w)J|Amub!RInZp0bcK;l?|*g^0&G8E)#8i(?MAvbz?v= z)Nhvx1AkA$7tCsds@hRki4EKa?b>l8wbdAFIh7l(;a=e?qmow``&@mXspkUgBNjiw z7wrv&gDkw<0>sAUdXIio376_V6w|w`$DF%akIhL`o}wxrX_|`$9;eS{bBbk8v%K}l+knJA&s)==m)TufVp>22C3d&O{y^R~ zNRCH%Ln$+7&lbXi=WMQ)9TM_Lu5fjIY|G(|{>cAr8vMV0z`9AB)ik&mRfaYd9aXHTEjw zp39KL%BK;t+q&n%m1ANi67w;XLpj6H@db|hL zU82r#c?$NW<3aouIUJwS_bTPa#(eX40V6h+w>AyRNOZM4n5^({nQO;Z-onr4o*+Zm z?|KeNM0C{YmABsD$)iPqS*C#dqSWIB=b2(h;2qOgSJb zvKYkM?<->ZF@E&V>Qd(fE?ZRAQE{o874-s_Qa4$BZx2^DG2q4D;_8_%Q;F@v2DU{Q zSoyBtZ_deP(#XTYvDJW@%)1O{@T7A$CY`GwsovAk3Ffs5x4GULlyv9)S*^>^nt?V1o+`u4BupZRLa- z@%44erhjaFf?Cv|ha<8l9_k=N; zD~<1^3pHQ4H{My$T#+N%H#fGuczuZ|5f|;$k#plo{~p>vA3#hwN_Q^U0Ll# zy7zvmyiQBqw_D;C@7pDh!UjB_x!wC7<>S8V!!>x{VXd;T$^(2$MLkrK!%u0R@oQ5Z z&d0)Q(b(=JJp%Du6c^!|6mON0W`eI|Bnat+hZG@|KnP~{f3!ppm(`cYsV(qgb?x{D zZ*A+)3B$EoSLgb)+52~bIc2F3=G$E0sm0xA%4q1K!?#bLfD^c}7j`u(ZnGuVchSHB z1L2gOGN*5LX?U&Ew|`f>%pv8S*B@6rC%$5|F<=(Abbk88#$<6WYEz|`TkP6uT-}ad zv_{dphZl{c_(kV*`e-HNcKTae&(qtVnOa9Jd5`Q8Dd+PW@cFn_=w~a~i9y--bx75e zFkH>aiUo^w;c7ky6`0b4tN9naH*h=T16NTp2+nG>Y`V^uo!}u~T`c$?RVvndBQt%L zM9L+XPPr#T)xw=}FMJl`E&AW^)WTL{+r%ngZla86snj;=%7-h+#Zj!g?;8{Wpsa4or^jT)`izNZM@ZQr|v=2L}mbNx&sH~cs&y+fF~*ozEd>Tj1w_K{5eB0t2| zuydo`))TTe1dCqs0@>eDC5`M_Q^(ktY%WtOjembwIE-xPjbU|# zo~~qjJ}ak^8Syc?{89y#<$A!#kVP0K4#Cq!H4XYK*(zuVexBx)H73*%bL05im>WlP zgXnN|EvItA&wnRyHP!^^hUw;I6EM`mAbzMSC)-rzTpZ}Z&r&{p!aqZ)+S?AP4TMRD zI}J1j_FQYAYp(M~)B#gi{ZET5!V9F9D?T8ni4VxxYBOU>gZ|qp<^R!R{QWJ8CULTw zCK~_aeGK}xZx7IVxX-jbIsDV7h@Mk4n5<|s1VcS#xnEM=T*U+LGAg=N@9r|(!OthS z9;{#rr6FP8Cu$RZHID*0@sP`3UjIQWk9?)W%&poT_(ko{MG?9>cLoq&vpcQ_y?VE) z2FykQNb%}_E3{~+lq|b znErF|DpUV?oBxl?;L=4smK^T79dNqB1nvRk407aH=BkZjLB%h$rhJ z$+0AG%B@n7<`(@J3Y>Qxfm3r;D$hR^zys&NxYaOh-Yq5 zuu03kx4RKkq3mutPTS-ejyj{a;?VKe? zt=7(2N?5IZoz5;Qi)@s~lE~NOu_EFlQ6QFRCy7=_a8;yI9@UXsM9pX-m;zZCn98lbKvy}TrIN73O!#`B>vln| z1O+5$hAcEFH0el8MY<%{RDhQCy+lFi)34Ew>aU(X4xbIa%h*loI+Z-`h<>c=R8rHs zon&T>);x=+be8f>E8`7XU7=aqcNAphyAN*DlDq=vU=V$Ve0l=aeS*izGT%wJNey9)A}R z?o@PdWPv=s9Jw(@sWW))g1Tf#cV472QRfz!>f9nzohu_7b?&>;=lY?u;2Eq=e>FZB z8P+mn?WX?rcY;-O#0D;=Sz@N4@Fce8Cut4CVi_q z-#s5Vuvu6{MBUGQQQLbpoPzYXzzxkDGByOtc#g%f9I-JII2FsW7#8WesIR|Z-yBK1 z_-U$h%SR*7IBDWMSh0{Q~>&v1dxjRwh^Yaz)jkf4R91vR#i~kC>^6Wnt&~n(% z(s1UQ!lwA=Z z<0>FW5(lVM#4ug1gYK!vqiIq1&cB{6vF!h_#FEM1zeP$cEB;)9iBOWASwRfIWpd!f zv;$Y(4866=v=QHFa#F@w(CMpXFt?$?p(OC&K#@o|KAG=}|#^gtsrV#vB_WX7an8SfY^BL^%Ojm(Ib-61tz zIa)@vamgby+J|K{ETe$R>D8B%G|1g(7u%RTEaT5c%Lrn>J2E52QwdPDZ;U`ps>i4w znJIN>rgF{!9d4^gZCjNBi4?q2+2&1V2~;6B=&rI=5z^*Osx%W>+tP7h>6@ESrhaFx zbah^2jaoK&?QIpwUGF+<$0V;DxUb;qdI>l#1YpJxn1nfbo0o&_4%-oVv&q{b^;zj_ zP82>*6+Y?;X}CkNO7>}-7_M>Iy>>50w{kpzLaRU3_yol>&RfQzmo-nG$SUpJm~Hu3 zKjrT~iTIsZ0pQpDxQ-hZQ~p1qwsB?A!L@q$$kFe0>$f}g%^AASp?mB)ZUZrxL@XCy z`0QwNzs3N&M<;XxlgyLTy8d!S*Pq1$e%D9iL?zbi34Y+h34ZX8>caSwtUXj_{W#1c zJvivxG$!o)uY<7n$Yd|WKg0JBuvHmz3jiE}p5-ju!yP;Muq~hFW;OM0NQEg>)l`eW z^|`gaC&_~TSF*5p2p-Ha!H>I}RGCPbBU#MM-df*5mFcA$zmTa)jLnp5|FiuyVjP-Z z$xY7+rd?**BG!*)1+2#e{T`!Xrec3_r?x{*jI{59X>mx@pApSGd9swCrbz)(bRv3tl$#c-+qRGw@>$$>Dzv%X_M5_k0Hc&C5P7LkFq#=Kft=ZBjlPOcodhFad4no_wCPq&GQuy#)&qzX9dKmkP8whu35l1SCjl9* zFX@DJ2m(1eE3iN{9({2Jd!y>=iY2fz5(Wou!*wqyWA03}3iQkN$@nu)XGG;z|I zz{vuYe$=U0`9sO!x=ZbD{dN5}fp^7GLx$XOfarJCF}lpGx>0?{i-AVCo1X9 z{K=hHb$M!|nVZc%xXvS8@I<1zBeO5r1!QU^Q><1+)lH{!K%^Y6s)x%2tLuDA*xt>l4c9gxbzB zu2dms!YePBd)csr!jCsCX*w^vyf}9JHtIRhl*3(<_f2kF>S*rVlmY+BVNB$Tnh5k- zLJLE4lq-VpmYeM}e`D*T()+(d2b0LYuC5#XQbx7c91E2Ut%R(n+}r+|67)>v4B@JI z#AngbUp2GEW4MEeqdU@|D&v)J069lIz4#-ERVa3D4o|zpbFu^lRHY}Hc`qY^bUBPO zhqo%4smZs1o6c=xUVF%6PdGBm=$83`J(0(fE#G!O;|qNMQA_ZZB*4FC8JJv=>j+sx zmG+?wn)6GF0>s8M*MsRop0Tu)q0-N&D(vyEWI*Ru8X4t+5eX=2iU!WUJYoAad!&0C zq@SNpZD4wyAU_kum?KMmCdp5Bqz0(n0PO?l$TBXC%hytZn=?FHIvez584XQc8^{da z8+4DmVQ~XPaRL!e37be59xcEzAzY2Mf--ft1c*l&2Y|UfmC?*&OmcLDLR}T;67;OE zhak*W3O+nW3L>?h_9R1`R>(YcRaXoN_-m=IHF^frlsJLZ8SB^d(lSuc34!31l+J+4 zXHuU-W`!6Hnk0xNjPXyX@MV;XpbuPjRP-E?u(+aGz zTV z@xeW6aR}B#fbsZz322{GWsO=h+deJd5wenzXWkFntykpG{>`julfzyIOWIe^At#4d zxy3Pr=#|42S+dZDP-_x1^744SpiRjl9-}4(kgq5K$@KpY62IyBmojC-jsYX2BjZWv zB%{__5RK6n7Xa4AWVzayD2E)W=mp2NQ9mvW$8{>w=Zc+)5V#C*1RMD0I@v%|yc;_~ z8GgdgRhTdUry7t|B7erE4O{T#C|_}?RH;Kry6JQl(~O+E$>9k!Cup$O$W)ExRH2qZ z*lQ}x8V~bd!8)qBQ=3pUTT3rmD~I{H*;&fz4ytvvbz24tYa9I{Yx3KbjOoC-aQJ#$ z;;A5o8xR(1;x)`3ekfP0ppf2VmkF>-U}lh)BVK&?X_cTc$?JOp<^@Z28;#ef*-0eO zw}lY!BG$-x35hq-7pXYP&WNGMp^D}@EAUt4p+YgmQel-UOHcBT$vC?w`QLaTINwco z0zujjrMx&8^rz!lCzTbx-e{lPNzqv)zL!8!Wyfx*cFI0AJ$Q`YTpfc=TgVPGtlM{x zR8__^iSX%-HbBYpbrS9|eqe_8CJSqpe^foz`~pminq%TXn7!Ek_7Cu589Qw2YI#m% z2B=Mq32&%aVvQ3&5TX%Z2(wMZ`d$(!KQ26Kso#_QBH-=La*_3Jj{P3mlhB#CMBWb6Bi4bCyDzW0_YNz4?m6)TjDXUR}vh@ zemf+ie<{w@X}c-z??Wu3t`VGLDA)@X*x4r73Qk!JcI#C!hlw!7pq)x&jB;fu{uAyU+^(>+G&^a1=Hc( z64fr{M3P^ScaPDl)@&5-YW@Tagg57?S+DVWb3&?-67|oA7H51}wF>o^KX1PvbGUZk zbM>hoxov2kc0n;*p~krUpA=VMFm2c;ne`Xj+-*k|PV{FlJgQ}ICk7v0t3N&1nH20v zT6old66YStI7~f(2V`yjzPIUs|ED~zmb<~2YP83AGmcDG%LJCvf)qVX@KI^3G7%A) zBA-J$(Z6sA?Op6dRU*!UuWdJ}QOH-Y_!qFKXG*_R8N1Y40kK_md#u;e&F&BXL^>eR z54Xf2)3*O_`rr==sQ;gR@LgpIBImGI#9QA9jue&ooAgYF%5BbUP#M2i;sQ+wi9(DP%YmBFWquTg)erdMZ>rDrxk=P5MoFSV|myk#Bxs0bCltN@y>{V}+ zX3@JTOA>YKy1*Wdz=qf z^HD)in#lco4yTne8#APeVX}nB_*EJ~LI|-0bHhp?^|uvJ@v3u^E=# z!`;G`=f)5d`DR?k$Y#w!w30I_jZctH%rYPocF2^hp?4`1pmSb4L&Od4Pbvz0zR-WO zl-ZUxmhz}^NL3rS!niDV>T?p~Pp8(Yv-zI(+&I2_RNrQc%Z!E;MU90ovc_|BS_sR6 zmVQ!aTf!T1v;9}M-wBc+lkttQtI2{lsSNrFlq9LDg%Rr#u?IpqJx>2vHen~g8p0JP zg9B?_4~i-V?exw^+@&}=_+EeqU}X2O?DQBcW*G{0#pxw9&g(($2wo3nFYfDmYXi+Ql5x!mdFoq@0yK(_YS+WrEJlZc^L@$?+M~IJ<$bMuwQn|o%Q7`1o5&%IsT1Z>ZpkT+ z{2w0c%OiKjNyDu+gt#0_$y1Jq%OnTr;J(;4ke^eu+wYsLwv#;7#y4OBm?C`2%p9MW zYt%S2wq_H9J1oQq-KaMHuY8`6wXnU7Yu&`EbtwjzEI+g8@5=ZZZyDyFljBNFN1d$k zI^lDslyhRTfIsRQ?`&^0fKGBu)1L%GL3~%LffTy}@13tDxc_Wd%WYr}9|AI5jNdZR zw#z64$07+oBS_Osq|Ik>b`h9w-Y&pAnE>WXmj))rMiyu6{+d=ZQklGXnCA8>%BAx7 zQp%?#YUrCJ%^h_K$3iLa{?7V!ftTE{N#R7SAPxbx)qj`iZnorqRr!x=FID-5|Dp07 zQh8Fmav5OlJ597LVK;}{l(fR|{nj{LjmOD}9oudLn`%LI#MQ307;#nBX7>b7LXw)T zB63V_y0i7zM46wBuNvCLh{zF6*XjS#FtnZaN_Th?$a?;YOVWnk8+bp+G!=Ns7KfK5 zMRudD$`FJ7I4KVv|AQ9%@6?`yaFH5qyUfyk{$5+&DaH3Pa@zRLii(e6b4H?kD=Mu_?3 zAElAzYC1+98=a+=f8_5U#-ZNl`2+qecB||Y^G`jM*Ra^P&5EU>`9AvZe;X+!4xcWS zKG9?JoMFhP?N;M$xc*Gd&+1+wud(6hs+q8>Ts`QrP|oGvKykU_8XS_ z`+HJ`?=4EzFcwGCX$O58Jei8h2``zou9j&Gcb4qg1nX(f14h9|Z7Jbx)>dn~eCaO- z=3@y{QraP3ZIw}6TFM)t{tw%q=FMXiAgY@@^m?2pNwW0TvF-9==DwQTDp=)~HeHD3r9V>&7|HTt zxc@zZPrR<_ne@APJ@zEJ(-Onr~m`4q7S3{NA1l0$sSstS*7Up}pHjd$GmuQyR zFkRuxk6EWO+j1MY@cjYt4C8KtwqJT={aSD%Dv@>4O@V*q& zoxAm7)mQNqRBW~Kyc#$|7YXssC{yJMl~oz@Rk^G<6k^p#q8B=(zz#_P4_4Ua>Kj*! zNKmX1h78F5He2}b69e*d22aeHl4=4T1yqSMk2ig0C-0UoFKe`_5QTlZF-9scd1AzM zaR%QT54t_kF%MjJ33?NHfe`lzCAGPhwmRZ`z}0fUtku<4ZU5q|9RI9Xg_D&wQ6{p< zYNS^i%ay$8klU4H*`yjBV;SS(EaTU4hBFGw7?u&+A6LtASp`21XnNW)mcHTDR%?|p z5y^@{r*I2zP+OOBb6LE~5gGodBp18t5i(4TH6UP?vq$m{g;?qP`%ANO+8?E6SF@<( zY2_HbS#?_^Jy=FEbQG$VDnaAUj$Kr5ztbF4tw?}EZ8$W7XJXc3 zB}L0CDvdTHu;8xyayU@o=g#i?WKK|N6g@m%9|!;I9BT1OPB` z9SeLR;4iLAi>3adqb0JiT`<+sx$RoLSa3Bohp4uOd(3VU>?*O;jfmWng@RnS-HW!kL&4`7c`Y&5wADSXC z4oSx~dIW4sY+svnJj6w4;n9#HN7uK;P*||bR`6D(xGyxeAnqttNnyl4F;TK2usCrJ zaW!fx3=_);wTg(#k7948)Z*pLbR|kO9cqiU64?xsDoIh$U)ZBL+sdu#3{cTRO>S^@ zE4;U@$cwUS)wtnftv_R#@&VQ%ZR@e;SyYO`*HO_7B>A%o|KMu*4J6Q0o^-v6DNzag zo+V7~lwzJUr|25vGT0}?%0Qafprn&h!;M5T2zgoowJ9uMw)Fhl2SBe z`;|J!!QDkdnf}rm<7=wG1hm81f*5387bA^K)9L{&T`Y&9m|?`m#~#byU1Ul-k?ZZq z$98*3B?7ghr!05OLVm{1=4TxH2g{Iwv9rLpIoC!WQ2Wsic697)3gH^M&C2#+X-lX6 zsphE(`+ghz{KicS;W^*ioUIoA8+gdlvT%++yUogqI;ZG*e@0s=ul}^2l|LryrWzSX??p_xa6=Nwy-_d4iP{q>p0ZsmH} zEy>Sb)~Db=x*JusxdNxA!cKu2)&2k4`SN+{fR)@W<||6^Foye~5>P_t9R6SCYGI^suev zX}r=W!d^6Ug<6zoa=$kIA1OCz%+WHIX=9i9)Aum$Ep_J2&~@En7_w9HCrSP(!}B}n zc=o{jNl(op)y02Jr*~0?s?^e$;yZyz=rR6;_>0w+SWx+Vodi`HuMy;XS_H-?N>i#F}#mddj@z4N2nsZ z>%G)aMNX&!lahKCi?OmW?>H1?XIHvRtv?&B90SG#0Mgqs1JtD#^xL{Fd%eEtvp@X& zU#y!Z-j|94oJGIAKTYf~3Oaj*>@D3*pVcqBDe1n6n^KDdeLs3_V;Ze<^l~Yb98>I` zB{}fI@H;6&S<-;;LH1r5(U{Swtx4+Ve4G%!fKldQ2ls9oNgt$pj62mr$BrpVkz6Py zd)4+zv;=nw8Y=9?Qm$)<%uIe~(;}(Owc|;?iUlgygF9mp0-Ec=9ee?vlgj1NgbB*b ze3qD{nuaLoW#d^Q>X<)auaZ<*6`Dd<;81(bu7q zcy>61$|-HYH*7RBXGC@yE>{aVD~DxF2^ZC2coib{@~d&&_M#1GgYx z{Tqm+?q=%d^2R~6m`F&fDi@f@E_h|;z%SQ^%QCXtoT-R_etRp{EUk{kg|BbyV?xSa z*v;=0f9b+*f3cd(aHoA{K$*T+)}?c$2&qX<^0j z@LlcO0GUPKkZlJo&l~$<&s2tMqnP>ZBo&W`c&LIUuL(qED`5)Ig3kQ{AM?wd&}MaS zvd}KgqEg8hzvMSI?yHq)tXH2R^SHVOi&>t;*t!8~GOy{@+TLE8v zzrf$(gBj7h;4N;&>V;3Mt6co!jg_df8O{#L5QNV$&E@r1WN?U?*2!jC5@6?3dW;=j zOh~ZM94(rF-F!6Dp&Buyqza+!8}te>x|*a{xW#Zynekw@Hi^>Btu;5dS&F55@xA;q zS+UEWJAo8gEz#%X>aG_Ma@nTk-D!D&>CnOf>r5=JW1@;Srs=5QA^2+tr&`C-3?)Oj zyTQ1l3E5mV!5j*?oCH(7oLUXM7tPa#h#rQOr>%4k2i)=pp2p2Z>suuj{ka!G>bD%BpCCsV&Y% zU?QIA8=!4^^tW`5*djZ7lLbLi3S03qK4@wXTjX{LCecD_%&7GJm1!92Vd~NH=(*7f zb*n-d)q-~^P>LU3=#UXzqo0;5kjfq2P`ME*KN&7}_m-a)cHjw@pN#sQz2)yCR&4he zTXTdlIioAz*UxN*mQMz9ERi%4FyYFvzgk8{kL}U-imbCcFJ0z+?S%r!;$~yx9RElAFy_}+y5GB6e^cM;(9bI4ls9ch^+Db5 z{Pf3d6?mgrxHP)SuGyC_KYLv7T2sINFc$Wwu|?VH6wepUdqGDqimM=5x#-+bIGCi> z2M05?y5QhME?XRQX}5}}W6mep@!Bvr&eie&DZR#L{I+z~Y2VbBITqZDC!wDb5CVId zp1ZJ_>U4%Ps=^uHJ4UMt54eI46B~Jhg8ezc;#M$V@n25!%4V{-&U_MD3gT2Sw?kr9 zth_hX?@0Fj%%$CkOG#9X8L4BpA zDtfH0(R%v{*5Lu_G2R2WtiU;uyll5FakYF-Y+!rRdRL2xioTL- z#3k0Ug=9WcSNLgN%#m}?%-&G>1y{428we~abT$7cFTLeXDf_u1>H~G<7Z3vrj4iko zV$?8#)A+i6CU$$}7wWY1Xt^`k?QA-~fz;bxsqht1lh^pc0%{tlYl+tRlPTC=7u@Ph z-aflF+_ITLh^^p9D9!^<6w8;z4D`@y92FO6p>pDlhz#W4sLbeoJrOy1^s>UsIE4Pt@hL!YhY$_JSU^@Q*F~e!6Wz14QjKa zH^-`0XKCt$z_Vf@)kYPCNRU7I%JK^l0Vmk&T+$T1R~p(?5M8kKf;QP$3aX;>RFP+l zZOLQ_70Xw|wP35GuMq%^T#|55u&0mhs;Hs@R`M1(@3PeqE;nl7PiH*gmbJtx9Q>5@ z3J0#{LnMsF7|&sBRN^sw%rkYNayo)e+%55Qw}-P|*z&E#maY$y8dLNKr20^~L$`&> zPlxT>!}jvWi42tw2qW|u_k+OpM^wm#A+>Ip&wy5W8&h1rDnApl30P78fU#IGUXI0D zPB5C}PwtSscvRx;QQo58pHF>s*j3OqU1*kJ+z*&~`RO{G8 zFfSS&X^9E0>cVybTn<<@;)rIQ-|eeJ{53Z7Q`aF;fgCVh!pr_Lq2}m3A<#yfiGAZ? zu(nTPL7n~wMTW7MAKpwCZFB~EoDi=6CPA)`E38>Pfq^O_s<=~OBf?G2r-0qV?INoVYH^XaX{9Y|t z_1-$wp(3?9TcX=0dBa++JGxPB6^!y`xFywXb^g=!>jin{Q1A(FY=lew0?aa_QB_+C zn%8VJuhTG9$41MFlZoB{$r#hm3o7ck zK*`p+!1?R7)hxFCj>udht^N!NUK}{TUMu#9l0qg#^~%=;@JTAlb$6`{&w z#v+weU_9f-cxF+x(S`=94wZ5W#E#M5H~B2=t=o9Ho)RdUU+j0)R%7>G8lw;VIP};f zuj+Utm~WMX8nS|k&U;@*IEIe~L=U>VWd=RDX*xl6gY7<%3H%cmpi^MdlCblXCt-hJ z!fVgng}s89O|nz#&n%pm&G)8TyvF*arZ6$L9z{2}M$lsWLvw`hbp<~-6R|bA>kH>O zLyIk&rs+Lh2FIq3Rhq?4jik|hTcfo;*duAZh>-JgDAruR)C)CL${++2cc}WM>WNXCI0!l6_I z$%L0#aeKl5+T=vyfE&1eWiO3X>4)eq`RqF9a6NOpzsze5)NAR1dj>77D=)N`e~#cW zCUDQ^me%qMh#29OV`cG)dP%{;Es9UCmYPM0nsm4uc0Bf~a;K`a>GS|-7e?c(6{q++ zZl-b>s-_#9;5`>Ct6V?hcGh*wEdi#1aEpV9#r7#vhQ8IU_sr}rc;)Qb5_T9i&1Uq< z0nu}m2t7tuUI>2GX%BwYVGnM-U~xV4HsQj!vS_G2C(?P`aQ&>e*47Q(h-L)Lgw_q% z2KDj*Te-WihZ$zmI94n*8N!dY88f%K3(s#HS6v$m+4^U=Na5Cj+WXRES~;$2bw)a? z4bfCkivIG1X@SFuoL%q9aKs5^~|d z#$u|hwsoGZN6 z>~}|3**A~X(_PP4OL4oJ>NO(OP^~PXC$^?8EgGvOlhpra;2O-JIWV`b8yNf_7rYfY z(;oN*!>$n-s@|Wf_6Q>>g*{tS^_~uiX=FHE<)y5SJ7Fv`RQ_S=GEqQS15#SE2oWO=Q=+xR#M{#a~>z2G#jZwd9vkO~$TF_^jcnz=+ogntxx z>OkvCM+2y6fJ-cNJ#(yohb+lhowrq5OW7Nn;`&vm>zP-&PCCXNSWxcN#z!2kUmaUe zb&R89kn_v~a_;i%v8%c$mkmMY>myoYn|0vi{i8ks7W~5>n)x&}uQ!*~T-EMmb0h_9O1aEPA3-ZGKm|~dwcA5B z$*TU0n`#u>>TWC{$SHruamKf_GPXwdkMSDcmP+v#VO+%vT}bfepN zgVN8QsH>mcN!QeOt4%j&!CSQ`gmCO}$`&}6~y9c}RL>mDZPHavT7$e7dWjI(D)%qWq=uh3t%UlgHw`|;ct>kBc#NliT(xmnbx@rjHuVh|u?=S{oDOR( zz8Xw~F-wNh^;KERTcV*=_HFK348Iq#y#wmtw2=bYikql+>qmuwoQgA$u>DXZd5;@8 zpufbPqop+_HF6$hyXtj-bF{5=v|_~3Xk`vxFGWTs#fx09)w!PY-E;yL=;aQz-5hZ^ z*}!v3@53%-{>C^2@|KmDe~Qc%1EsEq{v8wq2kvk^+%7MjIem`_PS$Z@0W)5sweX$# ztuq$PQ$CEwF?IfpL&?YzW0f^>oBj5ydLUH0-W|Cob`GMuYXAx0P=DF2)_~>;+%pyd zueIFKx^B$vA_0uCv@*~1AYb6!pwTAtzk}uWJORvjR5djRn)pwwKT=%JuntY*_jA`X zD=!GM>x$1{UW9Ll@vB-uJ%i#)mXQ+h-85D{Xdnl?M&9j$n=ED03mr0A5;7gAP-{{B zwv6Dpa@RwLX=&3rop!q(7FE8!iBm;eFxwxu?WStIr_uS?nzQGtZHM%p$LiOd9c+0e zRO{ZF8a&`!&WkGH!67AlQ%b0H_jlR2`OMJxW@#d041 zAItG?(NifR!x5@+Y#ECZFumoKExrg6?^b)uD_iSD2GAB62N^i+IS{)QnGGT^mQ%9u zt784OoR-7e9b5B)n{zDNrnlz}Nt8>Xx=6apFkmw?I2*^HZYX!uu_t1K+(lI;eJuLE zMV76pteGZ&A)|^K^_1ekUu~9cw-;|8cVYY1%9+Umf{2X*!jCC2Se#1;lhGMh^PAM> zHNub*fSF5H1)hw?3bf+??YmkRV6Ua}z=>M3e(tfeQCkH&1rA=;6YaHc9TPlI#M4aCnDyA%b9J@~ zhe~ozQaHBadx}RQLEYJN`k|J?p_Ptp)AWk0##CEZ9l1hY5p1n6I{D2OuV~#{.A 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 b2p0%5gwup6!V`ocLPXfTb}8`pg#!N%y-P#P diff --git a/examples/basic.js b/examples/basic.js deleted file mode 100644 index 181fa97..0000000 --- a/examples/basic.js +++ /dev/null @@ -1,57 +0,0 @@ -/* - - 1. Check the manifest for version (from your running "old" app). - 2. If the version is different from the running one, download new package to a temp directory. - 3. Unpack the package in temp. - 4. Run new app from temp and kill the old one (i.e. still all from the running app). - 5. The new app (in temp) will copy itself to the original folder, overwriting the old app. - 6. The new app will run itself from original folder and exit the process. - -*/ - -var gui = require('nw.gui'); -var pkg = require('../package.json'); // Insert your app's manifest here -var updater = require('node-webkit-updater'); -var upd = new updater(pkg); -var copyPath, execPath; - -// Args passed when new app is launched from temp dir during update -if(gui.App.argv.length) { - // ------------- Step 5 ------------- - copyPath = gui.App.argv[0]; - execPath = gui.App.argv[1]; - - // Replace old app, Run updated app from original location and close temp instance - upd.install(copyPath, function(err) { - if(!err) { - - // ------------- Step 6 ------------- - upd.run(execPath, []); - gui.App.quit(); - } - }); -} -else { // if no arguments were passed to the app - - // ------------- Step 1 ------------- - upd.checkNewVersion(function(error, newVersionExists, manifest) { - if (!error && newVersionExists) { - - // ------------- Step 2 ------------- - upd.download(function(error, filename) { - if (!error) { - - // ------------- Step 3 ------------- - upd.unpack(filename, function(error, newAppPath) { - if (!error) { - - // ------------- Step 4 ------------- - upd.runInstaller(newAppPath, [upd.getAppPath(), upd.getAppExec()],{}); - gui.App.quit(); - } - }, manifest); - } - }, manifest); - } - }); -} diff --git a/gruntfile.js b/gruntfile.js deleted file mode 100644 index 911044a..0000000 --- a/gruntfile.js +++ /dev/null @@ -1,148 +0,0 @@ -var exec = require('node:child_process').exec; -var fs = require('node:fs'); - -var ncp = require('ncp'); - -var isWin = /^win/.test(process.platform); -var isMac = /^darwin/.test(process.platform); -var isLinux = /^linux/.test(process.platform); -var is32 = process.arch == 'ia32'; -var is64 = process.arch == 'x64'; -var platforms = []; -if(isMac) platforms.push('osx'); -if(isWin) platforms.push('win'); -if(isLinux && is32) platforms.push('linux32'); -if(isLinux && is64) platforms.push('linux64'); - -///^win/.test(process.platform)?'win':/^darwin/.test(process.platform)?'mac':process.arch == 'ia32'?'linux32':'linux64'; - -module.exports = function(grunt){ - var dest = grunt.option('dest') || './deploy'; - var src = grunt.option('src') || './app'; - grunt.initConfig({ - clean:{ - main: ['test/app'] - }, - compress:{ - mac:{ - options: { - mode: 'zip', - archive: dest + '/updapp/osx/updapp.zip' - }, - expand: true, - cwd: dest + '/updapp/osx/', - src: ['**/**'], - dest: '/updapp' - }, - win:{ - options: { - mode: 'zip', - archive: dest + '/updapp/win/updapp.zip' - }, - expand: true, - cwd: dest + '/updapp/win/', - src: ['**/**'], - dest: '/updapp' - }, - linux32:{ - options: { - mode: 'tgz', - archive: dest + '/updapp/linux32/updapp.tar.gz' - }, - expand: true, - cwd: dest + '/updapp/linux32/', - src: ['**/**'], - dest: 'updapp/' - }, - linux64:{ - options: { - mode: 'tgz', - archive: dest + '/updapp/linux64/updapp.tar.gz' - }, - expand: true, - cwd: dest + '/updapp/linux64/', - src: ['**/**'], - dest: 'updapp/' - } - }, - nwjs: { - build: { - options: { - outDir: dest, // Where the build version of my node-webkit app is saved - glob: false, - }, - src: src, - } - }, - mochaTest:{ - test:{ - options: { - reporter: 'spec' - }, - src: ['test/**/*.spec.js'] - } - }, - copy:{ - win:{ - src: 'tools/*', - dest: dest + '/win/' - } - }, -}); - grunt.loadNpmTasks('grunt-nw-builder'); - grunt.loadNpmTasks('grunt-mocha-test'); - grunt.loadNpmTasks('grunt-contrib-compress'); - grunt.loadNpmTasks('grunt-contrib-copy'); - grunt.loadNpmTasks('grunt-contrib-clean'); - - grunt.registerTask('packageMacZip', function(){ - var done = this.async(); - - fs.mkdirSync(dest + '/updapp/osx/updapp'); - ncp(dest + '/updapp/osx/updapp.app', dest + '/updapp/osx/updapp/updapp.app', function(err){ - exec('zip -r updapp.zip updapp',{cwd: dest + '/updapp/osx'},function(error, stdout, stderr){ - console.log('stdout: ' + stdout); - console.log('stderr: ' + stderr); - if (error !== null) { - console.log('exec error: ' + error); - } - done() - }) - - }) - }); - - grunt.registerTask('packageMac', function(){ - var done = this.async(); - console.log('packaging...', 'hdiutil create -format UDZO -srcfolder ' + dest + '/releases/updapp/mac/updapp.app ' + dest + '/releases/updapp/mac/updapp.dmg'); - - exec('hdiutil create -format UDZO -srcfolder ' + dest + '/updapp/osx/updapp.app ' + dest + '/updapp/osx/updapp.dmg',function(error, stdout, stderr){ - console.log('stdout: ' + stdout); - console.log('stderr: ' + stderr); - if (error !== null) { - console.log('exec error: ' + error); - } - done() - }) - }); - - grunt.registerTask('version', function(){ - var ver = grunt.option('ver'); - customizePackageJson({version: ver}, './app/package.json'); - - function customizePackageJson(obj, path){ - var json = require(path); - for(var i in obj){ - json[i] = obj[i]; - } - fs.writeFileSync(path, JSON.stringify(json, null, 4)); - } - }); - - var buildFlow = ['nwjs']; - if(isWin) buildFlow.push('copy:win'); - - grunt.registerTask('buildapp', buildFlow); - - grunt.registerTask('default', 'mochaTest'); -}; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 4f94bb8..904e20f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,6 +7,7 @@ "": { "name": "@nwutils/updater", "version": "0.3.5", + "license": "MIT", "dependencies": { "axios": "^1.7.2", "del": "^7.1.0", @@ -14,59 +15,30 @@ "semver": "^7.6.2" }, "devDependencies": { + "@types/node": "^25.6.2", "chai": "^5.1.1", "express": "^4.19.2", "get-port": "^7.1.0", - "grunt": "^1.6.1", - "grunt-cli": "^1.4.3", - "grunt-contrib-clean": "^2.0.1", - "grunt-contrib-compress": "^2.0.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-mocha-test": "^0.13.3", - "grunt-nw-builder": "^4.7.4", - "mocha": "^10.4.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@eggjs/yauzl": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@eggjs/yauzl/-/yauzl-2.11.0.tgz", - "integrity": "sha512-Jq+k2fCZJ3i3HShb0nxLUiAgq5pwo8JTT1TrH22JoehZQ0Nm2dvByGIja1NYfNyuE4Tx5/Dns5nVsBN/mlC8yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer2": "^1.2.0" + "nw-builder": "^4.17.10", + "typescript": "^6.0.3" } }, "node_modules/@emnapi/core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.2.0.tgz", - "integrity": "sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/wasi-threads": "1.0.1", + "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.2.0.tgz", - "integrity": "sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", "dev": true, "license": "MIT", "optional": true, @@ -75,9 +47,9 @@ } }, "node_modules/@emnapi/wasi-threads": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.1.tgz", - "integrity": "sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", "dev": true, "license": "MIT", "optional": true, @@ -104,9 +76,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", "dev": true, "license": "MIT", "engines": { @@ -117,9 +89,9 @@ } }, "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -155,13 +127,13 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -201,46 +173,23 @@ "node": ">=18.0.0" } }, - "node_modules/@malept/cross-spawn-promise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-1.1.1.tgz", - "integrity": "sha512-RTBGWL5FWQcg9orDOCcp4LvItNzUPcyEU9bwaeJX0rJ1IQxzucC48Y0/sQLp/g6t99IQgAlGIaesJS+gTn7tVQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-.malept-cross-spawn-promise?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "cross-spawn": "^7.0.1" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.4.tgz", - "integrity": "sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==", + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", "dev": true, "license": "MIT", "optional": true, "dependencies": { - "@emnapi/core": "^1.1.0", - "@emnapi/runtime": "^1.1.0", - "@tybys/wasm-util": "^0.9.0" + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" } }, "node_modules/@node-rs/crc32": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.10.3.tgz", - "integrity": "sha512-4UgH0fDRxs0eMSgrUN0UUM4BpIEbVKutiSkFLICwegbgIger3c1t7V3jOYralK0xTBHraW3r59wlESdc3h/nQg==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32/-/crc32-1.10.6.tgz", + "integrity": "sha512-+llXfqt+UzgoDzT9of5vPQPGqTAVCohU74I9zIBkNo5TH6s2P31DFJOGsJQKN207f0GHnYv5pV3wh3BCY/un/A==", "dev": true, "license": "MIT", "engines": { @@ -251,26 +200,26 @@ "url": "https://github.com/sponsors/Brooooooklyn" }, "optionalDependencies": { - "@node-rs/crc32-android-arm-eabi": "1.10.3", - "@node-rs/crc32-android-arm64": "1.10.3", - "@node-rs/crc32-darwin-arm64": "1.10.3", - "@node-rs/crc32-darwin-x64": "1.10.3", - "@node-rs/crc32-freebsd-x64": "1.10.3", - "@node-rs/crc32-linux-arm-gnueabihf": "1.10.3", - "@node-rs/crc32-linux-arm64-gnu": "1.10.3", - "@node-rs/crc32-linux-arm64-musl": "1.10.3", - "@node-rs/crc32-linux-x64-gnu": "1.10.3", - "@node-rs/crc32-linux-x64-musl": "1.10.3", - "@node-rs/crc32-wasm32-wasi": "1.10.3", - "@node-rs/crc32-win32-arm64-msvc": "1.10.3", - "@node-rs/crc32-win32-ia32-msvc": "1.10.3", - "@node-rs/crc32-win32-x64-msvc": "1.10.3" + "@node-rs/crc32-android-arm-eabi": "1.10.6", + "@node-rs/crc32-android-arm64": "1.10.6", + "@node-rs/crc32-darwin-arm64": "1.10.6", + "@node-rs/crc32-darwin-x64": "1.10.6", + "@node-rs/crc32-freebsd-x64": "1.10.6", + "@node-rs/crc32-linux-arm-gnueabihf": "1.10.6", + "@node-rs/crc32-linux-arm64-gnu": "1.10.6", + "@node-rs/crc32-linux-arm64-musl": "1.10.6", + "@node-rs/crc32-linux-x64-gnu": "1.10.6", + "@node-rs/crc32-linux-x64-musl": "1.10.6", + "@node-rs/crc32-wasm32-wasi": "1.10.6", + "@node-rs/crc32-win32-arm64-msvc": "1.10.6", + "@node-rs/crc32-win32-ia32-msvc": "1.10.6", + "@node-rs/crc32-win32-x64-msvc": "1.10.6" } }, "node_modules/@node-rs/crc32-android-arm-eabi": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.10.3.tgz", - "integrity": "sha512-V9iNJd5ux9I415qOldmxZIHrazYMJNsQ6v+Kq/t9FTQyYqiEeHvRc1FzBh9MT6Uc24InwMhBeC1WVw0BL4VaxQ==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm-eabi/-/crc32-android-arm-eabi-1.10.6.tgz", + "integrity": "sha512-vZAMuJXm3TpWPOkkhxdrofWDv+Q+I2oO7ucLRbXyAPmXFNDhHtBxbO1rk9Qzz+M3eep8ieS4/+jCL1Q0zacNMQ==", "cpu": [ "arm" ], @@ -285,9 +234,9 @@ } }, "node_modules/@node-rs/crc32-android-arm64": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.10.3.tgz", - "integrity": "sha512-d6xLAhbk5FDGpltAKTFs7hZO/PWpHeihZ/ZCKx2LEVz8jXQEshpo2/ojnfb5FAw6oNzU2H+S/RI5GeCr7paa1Q==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-android-arm64/-/crc32-android-arm64-1.10.6.tgz", + "integrity": "sha512-Vl/JbjCinCw/H9gEpZveWCMjxjcEChDcDBM8S4hKay5yyoRCUHJPuKr4sjVDBeOm+1nwU3oOm6Ca8dyblwp4/w==", "cpu": [ "arm64" ], @@ -302,9 +251,9 @@ } }, "node_modules/@node-rs/crc32-darwin-arm64": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.10.3.tgz", - "integrity": "sha512-IoX6HC4dlKc9BONe7632DADBtiHUiIVD7Bibuj3bGrvOBllN8hvBL9+dDC+/iDdOeuiBKgb0hgL5h2nPIybpzA==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-arm64/-/crc32-darwin-arm64-1.10.6.tgz", + "integrity": "sha512-kARYANp5GnmsQiViA5Qu74weYQ3phOHSYQf0G+U5wB3NB5JmBHnZcOc46Ig21tTypWtdv7u63TaltJQE41noyg==", "cpu": [ "arm64" ], @@ -319,9 +268,9 @@ } }, "node_modules/@node-rs/crc32-darwin-x64": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.10.3.tgz", - "integrity": "sha512-JUDGAX/0W4A9ok9p6yuy4fAsBDrq8Db0sUjKLMZ/+P3NHB+Qk+OsZUsEDxP3yhBJxhPq97JpN4bBzgMnkDajpw==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-darwin-x64/-/crc32-darwin-x64-1.10.6.tgz", + "integrity": "sha512-Q99bevJVMfLTISpkpKBlXgtPUItrvTWKFyiqoKH5IvscZmLV++NH4V13Pa17GTBmv9n18OwzgQY4/SRq6PQNVA==", "cpu": [ "x64" ], @@ -336,9 +285,9 @@ } }, "node_modules/@node-rs/crc32-freebsd-x64": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.10.3.tgz", - "integrity": "sha512-mbpVcrF9cRJm9ksv2vVaWc/yRsLJErdb90Kusc6I8CgsBxpS6/wI637i0khSl1l10iWrALXjfh6osihixANYhQ==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-freebsd-x64/-/crc32-freebsd-x64-1.10.6.tgz", + "integrity": "sha512-66hpawbNjrgnS9EDMErta/lpaqOMrL6a6ee+nlI2viduVOmRZWm9Rg9XdGTK/+c4bQLdtC6jOd+Kp4EyGRYkAg==", "cpu": [ "x64" ], @@ -353,9 +302,9 @@ } }, "node_modules/@node-rs/crc32-linux-arm-gnueabihf": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.10.3.tgz", - "integrity": "sha512-9MZohdtKzdnb16xRKU76t1UTEJu80dFO8f2/N0geJYNobnT1E6p/+5pqB/G1/H6OnPvjqMuFuLVL4BJVvO4GYQ==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm-gnueabihf/-/crc32-linux-arm-gnueabihf-1.10.6.tgz", + "integrity": "sha512-E8Z0WChH7X6ankbVm8J/Yym19Cq3otx6l4NFPS6JW/cWdjv7iw+Sps2huSug+TBprjbcEA+s4TvEwfDI1KScjg==", "cpu": [ "arm" ], @@ -370,13 +319,16 @@ } }, "node_modules/@node-rs/crc32-linux-arm64-gnu": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.10.3.tgz", - "integrity": "sha512-t1+9ik4awZF+luQp94HsUH8M1lSw8jWjvQiLaHyxMzrM0NY0/oIkhjqdOswXL11Wybkc63eunNwVqGKWfJEi4Q==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-gnu/-/crc32-linux-arm64-gnu-1.10.6.tgz", + "integrity": "sha512-LmWcfDbqAvypX0bQjQVPmQGazh4dLiVklkgHxpV4P0TcQ1DT86H/SWpMBMs/ncF8DGuCQ05cNyMv1iddUDugoQ==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -387,13 +339,16 @@ } }, "node_modules/@node-rs/crc32-linux-arm64-musl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.10.3.tgz", - "integrity": "sha512-fsxOk9CpFzyon+vktvCICwhGk0b+tnfEZfPOXa3QDrkyZD7R7cHmpEHGim1BYgJZIJSTBfal5eM11hzBGjJbxw==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-arm64-musl/-/crc32-linux-arm64-musl-1.10.6.tgz", + "integrity": "sha512-k8ra/bmg0hwRrIEE8JL1p32WfaN9gDlUUpQRWsbxd1WhjqvXea7kKO6K4DwVxyxlPhBS9Gkb5Urq7Y4mXANzaw==", "cpu": [ "arm64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -404,13 +359,16 @@ } }, "node_modules/@node-rs/crc32-linux-x64-gnu": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.10.3.tgz", - "integrity": "sha512-0zIX68FIeqpRMRNvmB5AgONnLMm628+8mV9UDuCRmGppME8WGnY+Dirx+TPUeTJ4f27+in+6CU4u6LJDi9cXmQ==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-gnu/-/crc32-linux-x64-gnu-1.10.6.tgz", + "integrity": "sha512-IfjtqcuFK7JrSZ9mlAFhb83xgium30PguvRjIMI45C3FJwu18bnLk1oR619IYb/zetQT82MObgmqfKOtgemEKw==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ @@ -421,13 +379,16 @@ } }, "node_modules/@node-rs/crc32-linux-x64-musl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.10.3.tgz", - "integrity": "sha512-dKKt0FEm8JDp2MvIu1J7vg8Dc5D5upNO6LAuvfShq9Hy8hYNQWy6f+AF8mSm/c5wWnjn+pv7I1+jvrZIe6wMig==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-linux-x64-musl/-/crc32-linux-x64-musl-1.10.6.tgz", + "integrity": "sha512-LbFYsA5M9pNunOweSt6uhxenYQF94v3bHDAQRPTQ3rnjn+mK6IC7YTAYoBjvoJP8lVzcvk9hRj8wp4Jyh6Y80g==", "cpu": [ "x64" ], "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ @@ -438,9 +399,9 @@ } }, "node_modules/@node-rs/crc32-wasm32-wasi": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-wasm32-wasi/-/crc32-wasm32-wasi-1.10.3.tgz", - "integrity": "sha512-oT2V4r0lGZqZHkFLHeXu5Z8C8SutIvBVV0Ws3unz4/KhwmlMcOZYRmSelUSSILbjNLrg4FihCe20tC1VbmaNxA==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-wasm32-wasi/-/crc32-wasm32-wasi-1.10.6.tgz", + "integrity": "sha512-KaejdLgHMPsRaxnM+OG9L9XdWL2TabNx80HLdsCOoX9BVhEkfh39OeahBo8lBmidylKbLGMQoGfIKDjq0YMStw==", "cpu": [ "wasm32" ], @@ -448,16 +409,16 @@ "license": "MIT", "optional": true, "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.3" + "@napi-rs/wasm-runtime": "^0.2.5" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@node-rs/crc32-win32-arm64-msvc": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.10.3.tgz", - "integrity": "sha512-IwP/TjDoQycv3ZCbAHV3qS9oH8pmBo7h9RC0chOvKY0g9+RxRl0nXhxcAcmZvJugKdJd+eCOR9fJrWzcwQOgFg==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-arm64-msvc/-/crc32-win32-arm64-msvc-1.10.6.tgz", + "integrity": "sha512-x50AXiSxn5Ccn+dCjLf1T7ZpdBiV1Sp5aC+H2ijhJO4alwznvXgWbopPRVhbp2nj0i+Gb6kkDUEyU+508KAdGQ==", "cpu": [ "arm64" ], @@ -472,9 +433,9 @@ } }, "node_modules/@node-rs/crc32-win32-ia32-msvc": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.10.3.tgz", - "integrity": "sha512-YK0qYTHUFqriqAkHyXfe3IpDFfpG5fc2yuNl7MXn4ejklLLyNQPOCSawvPU7ouOBgtQDaAH60yZhFhsXZfwSfQ==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-ia32-msvc/-/crc32-win32-ia32-msvc-1.10.6.tgz", + "integrity": "sha512-DpDxQLaErJF9l36aghe1Mx+cOnYLKYo6qVPqPL9ukJ5rAGLtCdU0C+Zoi3gs9ySm8zmbFgazq/LvmsZYU42aBw==", "cpu": [ "ia32" ], @@ -489,9 +450,9 @@ } }, "node_modules/@node-rs/crc32-win32-x64-msvc": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.10.3.tgz", - "integrity": "sha512-VI9jd8ECiij4YADsfzVuDnhk/UZ5op4RYHyN40yZzwhzcOQ8DDluOeHv91FPHSyMYJEsVsqbr3cqtD6R47xYjw==", + "version": "1.10.6", + "resolved": "https://registry.npmjs.org/@node-rs/crc32-win32-x64-msvc/-/crc32-win32-x64-msvc-1.10.6.tgz", + "integrity": "sha512-5B1vXosIIBw1m2Rcnw62IIfH7W9s9f7H7Ma0rRuhT8HR4Xh8QCgw6NJSI2S2MCngsGktYnAhyUvs81b7efTyQw==", "cpu": [ "x64" ], @@ -540,35 +501,24 @@ "node": ">= 8" } }, - "node_modules/@npmcli/agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@npmcli/agent/-/agent-2.2.2.tgz", - "integrity": "sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==", + "node_modules/@nwutils/getter": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/@nwutils/getter/-/getter-0.2.4.tgz", + "integrity": "sha512-U3FjVnl34Cub3xbbZL08tqYX3TLvhSq+suoNf+YnF2Hpi0IMMi54nLHTi7V7xY/wqkdrCTuMf5bmnT3/xcb1pA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "agent-base": "^7.1.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.1", - "lru-cache": "^10.0.1", - "socks-proxy-agent": "^8.0.3" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" + "semver": "^7.7.4", + "tar": "^7.5.11", + "yauzl-promise": "^4.0.0" } }, - "node_modules/@npmcli/fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", - "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", + "node_modules/@nwutils/runner": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@nwutils/runner/-/runner-0.2.3.tgz", + "integrity": "sha512-3IH1MCPVvKMBwxmr5L9+TEYOQVopqtdIyZB2piYWQuhSnTv+paMu8uPbbvOUFECapUdWeqCuGMyIHtCpgvkJUg==", "dev": true, - "license": "ISC", - "dependencies": { - "semver": "^7.3.5" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "MIT" }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", @@ -582,9 +532,9 @@ } }, "node_modules/@tybys/wasm-util": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", - "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", + "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", "dev": true, "license": "MIT", "optional": true, @@ -592,85 +542,53 @@ "tslib": "^2.4.0" } }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.10", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.10.tgz", - "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true, - "license": "ISC" - }, - "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "node_modules/@types/node": { + "version": "25.6.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz", + "integrity": "sha512-sokuT28dxf9JT5Kady1fsXOvI4HVpjZa95NKT5y9PNTIrs2AsobR4GFAA90ZG8M+nxVRLysCXsVj6eGC7Vbrlw==", "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" + "undici-types": "~7.19.0" } }, - "node_modules/adm-zip": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.14.tgz", - "integrity": "sha512-DnyqqifT4Jrcvb8USYjp6FHtBpEIz1mnXu6pTRHZ0RL69LbQYiO+0lDFg5+OKA7U29oWSs3a/i8fhn8ZcceIWg==", + "node_modules/@xmldom/xmldom": { + "version": "0.9.10", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", + "integrity": "sha512-A9gOqLdi6cV4ibazAjcQufGj0B1y/vDqYrcuP6d/6x8P27gRS8643Dj9o1dEKtB6O7fwxb2FgBmJS2mX7gpvdw==", "dev": true, "license": "MIT", "engines": { - "node": ">=12.0" + "node": ">=14.6" } }, - "node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "dev": true, "license": "MIT", "dependencies": { - "debug": "^4.3.4" + "event-target-shim": "^5.0.0" }, "engines": { - "node": ">= 14" + "node": ">=6.5" } }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/agent-base/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, "node_modules/aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", @@ -687,16 +605,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -723,114 +631,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^2.1.0", - "async": "^3.2.4", - "buffer-crc32": "^0.2.1", - "readable-stream": "^3.6.0", - "readdir-glob": "^1.1.2", - "tar-stream": "^2.2.0", - "zip-stream": "^4.1.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/archiver-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz", - "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^7.1.4", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^2.0.0" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/archiver-utils/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/archiver-utils/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/archiver-utils/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -838,16 +638,6 @@ "dev": true, "license": "MIT" }, - "node_modules/array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/assertion-error": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", @@ -882,12 +672,124 @@ "proxy-from-env": "^1.1.0" } }, + "node_modules/b4a": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.8.1.tgz", + "integrity": "sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "react-native-b4a": "*" + }, + "peerDependenciesMeta": { + "react-native-b4a": { + "optional": true + } + } + }, "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==", "license": "MIT" }, + "node_modules/bare-events": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.8.2.tgz", + "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", + "dev": true, + "license": "Apache-2.0", + "peerDependencies": { + "bare-abort-controller": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + } + } + }, + "node_modules/bare-fs": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz", + "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.5.4", + "bare-path": "^3.0.0", + "bare-stream": "^2.6.4", + "bare-url": "^2.2.2", + "fast-fifo": "^1.3.2" + }, + "engines": { + "bare": ">=1.16.0" + }, + "peerDependencies": { + "bare-buffer": "*" + }, + "peerDependenciesMeta": { + "bare-buffer": { + "optional": true + } + } + }, + "node_modules/bare-os": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.9.1.tgz", + "integrity": "sha512-6M5XjcnsygQNPMCMPXSK379xrJFiZ/AEMNBmFEmQW8d/789VQATvriyi5r0HYTL9TkQ26rn3kgdTG3aisbrXkQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "bare": ">=1.14.0" + } + }, + "node_modules/bare-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", + "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-os": "^3.0.1" + } + }, + "node_modules/bare-stream": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.1.tgz", + "integrity": "sha512-Vp0cnjYyrEC4whYTymQ+YZi6pBpfiICZO3cfRG8sy67ZNWe951urv1x4eW1BKNngw3U+3fPYb5JQvHbCtxH7Ow==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "streamx": "^2.25.0", + "teex": "^1.0.1" + }, + "peerDependencies": { + "bare-abort-controller": "*", + "bare-buffer": "*", + "bare-events": "*" + }, + "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, + "bare-buffer": { + "optional": true + }, + "bare-events": { + "optional": true + } + } + }, + "node_modules/bare-url": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.3.tgz", + "integrity": "sha512-Kccpc7ACfXaxfeInfqKcZtW4pT5YBn1mesc4sCsun6sRwtbJ4h+sNOaksUpYEJUKfN65YWC6Bw2OJEFiKxq8nQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "bare-path": "^3.0.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -909,35 +811,10 @@ ], "license": "MIT" }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "license": "MIT", "dependencies": { @@ -981,73 +858,6 @@ "node": ">=8" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true, - "license": "ISC" - }, - "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", - "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", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.1.13" - } - }, - "node_modules/buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "node_modules/buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true, - "license": "MIT" - }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==", - "dev": true, - "license": "MIT" - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -1058,206 +868,6 @@ "node": ">= 0.8" } }, - "node_modules/cacache": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-18.0.3.tgz", - "integrity": "sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^10.0.1", - "minipass": "^7.0.3", - "minipass-collect": "^2.0.1", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/cacache/node_modules/aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/cacache/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/cacache/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/cacache/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacache/node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/cacache/node_modules/tar/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/cacache/node_modules/tar/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacache/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=8" - } - }, "node_modules/call-bind": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", @@ -1278,19 +888,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/chai": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", @@ -1308,23 +905,6 @@ "node": ">=12" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/check-error": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", @@ -1335,34 +915,6 @@ "node": ">= 16" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/chownr": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", @@ -1400,31 +952,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-progress": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz", - "integrity": "sha512-tRkV3HJ1ASwm19THiiLIXLO7Im7wlTuKnvkYaTkyoAPefqjNg7W7DHKUlGRxy9vxDvbyCYQkQozvptuMkGCg8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "string-width": "^4.2.3" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1445,16 +972,6 @@ "dev": true, "license": "MIT" }, - "node_modules/colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha512-ENwblkFQpqqia6b++zLD/KUWafYlVY/UNnAp7oz7LY7E924wmpye416wBOmvv/HMWzl8gL1kJlfvId/1Dg176w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -1467,142 +984,39 @@ "node": ">= 0.8" } }, - "node_modules/compress-commons": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.1.2.tgz", - "integrity": "sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==", + "node_modules/commander": { + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", - "dependencies": { - "buffer-crc32": "^0.2.13", - "crc32-stream": "^4.0.2", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, "engines": { - "node": ">= 10" + "node": ">=20" } }, - "node_modules/compressing": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/compressing/-/compressing-1.10.1.tgz", - "integrity": "sha512-XXwUffcVjqv8NGSQu1ttp6eMmuZ3zZEAec28Rt30o/vkXE20jXhowRQ9LXLY4uOgFkxXrNzApLobpam53Dc1AA==", + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "dev": true, "license": "MIT", "dependencies": { - "@eggjs/yauzl": "^2.11.0", - "flushwritable": "^1.0.0", - "get-ready": "^1.0.0", - "iconv-lite": "^0.5.0", - "mkdirp": "^0.5.1", - "pump": "^3.0.0", - "streamifier": "^0.1.1", - "tar-stream": "^1.5.2", - "yazl": "^2.4.2" + "safe-buffer": "5.2.1" }, "engines": { - "node": ">= 4.0.0" + "node": ">= 0.6" } }, - "node_modules/compressing/node_modules/bl": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", - "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/compressing/node_modules/iconv-lite": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", - "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/compressing/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/compressing/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/compressing/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/compressing/node_modules/tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "license": "MIT", "engines": { @@ -1646,24 +1060,10 @@ "node": ">=0.8" } }, - "node_modules/crc32-stream": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.3.tgz", - "integrity": "sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==", - "dev": true, - "license": "MIT", - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } - }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "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": { @@ -1675,41 +1075,6 @@ "node": ">= 8" } }, - "node_modules/cross-spawn-windows-exe": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/cross-spawn-windows-exe/-/cross-spawn-windows-exe-1.2.0.tgz", - "integrity": "sha512-mkLtJJcYbDCxEG7Js6eUnUNndWjyUZwJ3H7bErmmtOYU/Zb99DyUkpamuIZE0b3bhmJyZ7D90uS6f+CGxRRjOw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/malept" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/subscription/pkg/npm-cross-spawn-windows-exe?utm_medium=referral&utm_source=npm_fund" - } - ], - "license": "Apache-2.0", - "dependencies": { - "@malept/cross-spawn-promise": "^1.1.0", - "is-wsl": "^2.2.0", - "which": "^2.0.2" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/dateformat": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", - "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -1720,19 +1085,6 @@ "ms": "2.0.0" } }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/deep-eql": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", @@ -1831,26 +1183,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -1894,58 +1226,6 @@ "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/encoding/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "once": "^1.4.0" - } - }, - "node_modules/env-paths": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", - "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/err-code": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", - "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", - "dev": true, - "license": "MIT" - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -1969,16 +1249,6 @@ "node": ">= 0.4" } }, - "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1986,33 +1256,6 @@ "dev": true, "license": "MIT" }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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/etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", @@ -2023,41 +1266,35 @@ "node": ">= 0.6" } }, - "node_modules/eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.8.0" + "node": ">=6" } }, - "node_modules/expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, "engines": { - "node": ">=0.10.0" + "node": ">=0.8.x" } }, - "node_modules/exponential-backoff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", - "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", + "node_modules/events-universal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/events-universal/-/events-universal-1.0.1.tgz", + "integrity": "sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==", "dev": true, - "license": "Apache-2.0" + "license": "Apache-2.0", + "dependencies": { + "bare-events": "^2.7.0" + } }, "node_modules/express": { "version": "4.19.2", @@ -2102,10 +1339,10 @@ "node": ">= 0.10.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", "dev": true, "license": "MIT" }, @@ -2134,23 +1371,6 @@ "reusify": "^1.0.4" } }, - "node_modules/fd-slicer2": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fd-slicer2/-/fd-slicer2-1.2.0.tgz", - "integrity": "sha512-3lBUNUckhMZduCc4g+Pw4Ve16LD9vpX9b8qUkkKq2mgDRLYWzblszZH2luADnJqjJe+cypngjCuKRm/IW12rRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "pend": "^1.2.0" - } - }, - "node_modules/file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", - "dev": true, - "license": "MIT" - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -2182,155 +1402,55 @@ "node": ">= 0.8" } }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, + "node_modules/follow-redirects": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, "engines": { - "node": ">=10" + "node": ">=4.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/findup-sync": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", - "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.3", - "micromatch": "^4.0.4", - "resolve-dir": "^1.0.1" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">= 10.13.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "license": "MIT", "dependencies": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flushwritable": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/flushwritable/-/flushwritable-1.0.0.tgz", - "integrity": "sha512-3VELfuWCLVzt5d2Gblk8qcqFro6nuwvxwMzHaENVDHI7rxcBRtMCwTk/E9FXcgh+82DSpavPNDueA9+RxXJoFg==", - "dev": true, - "license": "MIT" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", - "dev": true, - "license": "MIT", - "dependencies": { - "for-in": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "node": ">= 6" } }, "node_modules/forwarded": { @@ -2353,47 +1473,12 @@ "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true, - "license": "MIT" - }, - "node_modules/fs-minipass": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-3.0.3.tgz", - "integrity": "sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "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==", "license": "ISC" }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -2404,16 +1489,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, "node_modules/get-func-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", @@ -2457,22 +1532,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-ready": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-ready/-/get-ready-1.0.0.tgz", - "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==", - "dev": true, - "license": "MIT" - }, - "node_modules/getobject": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-1.0.2.tgz", - "integrity": "sha512-2zblDBaFcb3rB4rF77XVnuINOE2h2k/OnqXAiy0IrTxUfV1iFp3la33oAQVY9pCpWU268WFYVt2t71hlMuLsOg==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/glob": { "version": "7.1.7", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", @@ -2506,51 +1565,6 @@ "node": ">= 6" } }, - "node_modules/global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "license": "MIT", - "dependencies": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/global-prefix/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -2606,1593 +1620,466 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/grunt": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.6.1.tgz", - "integrity": "sha512-/ABUy3gYWu5iBmrUSRBP97JLpQUm0GgVveDCp6t3yRNIoltIYw7rEj3g5y1o2PGPR2vfTRGa7WC/LZHLTXnEzA==", + "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": { - "dateformat": "~4.6.2", - "eventemitter2": "~0.4.13", - "exit": "~0.1.2", - "findup-sync": "~5.0.0", - "glob": "~7.1.6", - "grunt-cli": "~1.4.3", - "grunt-known-options": "~2.0.0", - "grunt-legacy-log": "~3.0.0", - "grunt-legacy-util": "~2.0.1", - "iconv-lite": "~0.6.3", - "js-yaml": "~3.14.0", - "minimatch": "~3.0.4", - "nopt": "~3.0.6" - }, - "bin": { - "grunt": "bin/grunt" + "es-define-property": "^1.0.0" }, - "engines": { - "node": ">=16" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/grunt-cli": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.4.3.tgz", - "integrity": "sha512-9Dtx/AhVeB4LYzsViCjUQkd0Kw0McN2gYpdmGYKtE2a5Yt7v1Q+HYZVWhqXc/kGnxlMtqKDxSwotiGeFmkrCoQ==", + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "license": "MIT", - "dependencies": { - "grunt-known-options": "~2.0.0", - "interpret": "~1.1.0", - "liftup": "~3.0.1", - "nopt": "~4.0.1", - "v8flags": "~3.2.0" - }, - "bin": { - "grunt": "bin/grunt" - }, "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-cli/node_modules/nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "1", - "osenv": "^0.1.4" + "node": ">= 0.4" }, - "bin": { - "nopt": "bin/nopt.js" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/grunt-contrib-clean": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-2.0.1.tgz", - "integrity": "sha512-uRvnXfhiZt8akb/ZRDHJpQQtkkVkqc/opWO4Po/9ehC2hPxgptB9S6JHDC/Nxswo4CJSM0iFPT/Iym3cEMWzKA==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true, "license": "MIT", - "dependencies": { - "async": "^3.2.3", - "rimraf": "^2.6.2" - }, "engines": { - "node": ">=12" + "node": ">= 0.4" }, - "peerDependencies": { - "grunt": ">=0.4.5" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/grunt-contrib-clean/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "glob": "^7.1.3" + "function-bind": "^1.1.2" }, - "bin": { - "rimraf": "bin.js" + "engines": { + "node": ">= 0.4" } }, - "node_modules/grunt-contrib-compress": { + "node_modules/http-errors": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-2.0.0.tgz", - "integrity": "sha512-r/dAGx4qG+rmBFF4lb/hTktW2huGMGxkSLf9msh3PPtq0+cdQRQerZJ30UKevX3BLQsohwLzO0p1z/LrH6aKXQ==", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, "license": "MIT", "dependencies": { - "adm-zip": "^0.5.1", - "archiver": "^5.1.0", - "chalk": "^4.1.0", - "lodash": "^4.17.20", - "pretty-bytes": "^5.4.1", - "stream-buffers": "^3.0.2" + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" }, "engines": { - "node": ">=10.16" + "node": ">= 0.8" } }, - "node_modules/grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha512-gFRFUB0ZbLcjKb67Magz1yOHGBkyU6uL29hiEW1tdQ9gQt72NuMKIy/kS6dsCbV0cZ0maNCb0s6y+uT1FKU7jA==", + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^1.1.1", - "file-sync-cmp": "^0.1.0" + "safer-buffer": ">= 2.1.2 < 3" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/grunt-contrib-copy/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", "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": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">= 4" } }, - "node_modules/grunt-contrib-copy/node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "dev": true, + "node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grunt-contrib-copy/node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/grunt-contrib-copy/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/grunt-contrib-copy/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "license": "MIT", + "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.", + "license": "ISC", "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" + "once": "^1.3.0", + "wrappy": "1" } }, - "node_modules/grunt-contrib-copy/node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.8.0" + "node": ">= 0.10" } }, - "node_modules/grunt-known-options": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-2.0.0.tgz", - "integrity": "sha512-GD7cTz0I4SAede1/+pAbmJRG44zFLPipVtdL9o3vqx9IEyb7b4/Y3s7r6ofI3CchR5GvYJ+8buCSioDv5dQLiA==", - "dev": true, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "license": "MIT", "engines": { "node": ">=0.10.0" } }, - "node_modules/grunt-legacy-log": { + "node_modules/is-fullwidth-code-point": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-3.0.0.tgz", - "integrity": "sha512-GHZQzZmhyq0u3hr7aHW4qUH0xDzwp2YXldLPZTCjlOeGscAOWWPftZG3XioW8MasGp+OBRIu39LFx14SLjXRcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "colors": "~1.1.2", - "grunt-legacy-log-utils": "~2.1.0", - "hooker": "~0.2.3", - "lodash": "~4.17.19" - }, - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/grunt-legacy-log-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-2.1.0.tgz", - "integrity": "sha512-lwquaPXJtKQk0rUM1IQAop5noEpwFqOXasVoedLeNzaibf/OPWjKYvvdqnEHNmU+0T0CaReAXIbGo747ZD+Aaw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "~4.1.0", - "lodash": "~4.17.19" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-legacy-util": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-2.0.1.tgz", - "integrity": "sha512-2bQiD4fzXqX8rhNdXkAywCadeqiPiay0oQny77wA2F3WF4grPJXCvAcyoWUJV+po/b15glGkxuSiQCK299UC2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "async": "~3.2.0", - "exit": "~0.1.2", - "getobject": "~1.0.0", - "hooker": "~0.2.3", - "lodash": "~4.17.21", - "underscore.string": "~3.3.5", - "which": "~2.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/grunt-mocha-test": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/grunt-mocha-test/-/grunt-mocha-test-0.13.3.tgz", - "integrity": "sha512-zQGEsi3d+ViPPi7/4jcj78afKKAKiAA5n61pknQYi25Ugik+aNOuRmiOkmb8mN2CeG8YxT+YdT1H1Q7B/eNkoQ==", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", - "dependencies": { - "hooker": "^0.2.3", - "mkdirp": "^0.5.0" - }, "engines": { - "node": ">= 0.10.4" - }, - "peerDependencies": { - "mocha": ">=1.20.0" - } - }, - "node_modules/grunt-nw-builder": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/grunt-nw-builder/-/grunt-nw-builder-4.7.4.tgz", - "integrity": "sha512-tQi4FqMxBH+J9Jb0F+KtT6O77Kv1KEJZsQYtfFzZmnUN6Yk0Gc37PjeVx7bhPbsClzNjCj5BxBuig0C0wUZkBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "nw-builder": "^4.7.4" - }, - "peerDependencies": { - "grunt": "^1.6.1" + "node": ">=8" } }, - "node_modules/grunt/node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" + "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "node_modules/is-it-type": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/is-it-type/-/is-it-type-5.1.3.tgz", + "integrity": "sha512-AX2uU0HW+TxagTgQXOJY7+2fbFHemC7YFBwN1XqD8qQMKdtfbOC8OC3fUb4s5NU59a3662Dzwto8tWDdZYRXxg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^2.0.0" + "globalthis": "^1.0.2" }, "engines": { - "node": ">=0.10.0" + "node": ">=12" } }, - "node_modules/has-ansi/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=0.12.0" } }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, + "node_modules/is-path-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", + "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", "license": "MIT", "engines": { - "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" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, + "node_modules/is-path-inside": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", + "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", "license": "MIT", "engines": { - "node": ">= 0.4" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "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": ">= 0.4" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "license": "MIT", - "dependencies": { - "parse-passwd": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", - "dev": true, - "engines": { - "node": "*" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/http-cache-semantics": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", - "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==", + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "BSD-2-Clause" + "license": "MIT" }, - "node_modules/http-errors": { + "node_modules/isexe": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - }, - "engines": { - "node": ">= 14" - } + "license": "ISC" }, - "node_modules/http-proxy-agent/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "ms": "2.1.2" + "@isaacs/cliui": "^8.0.2" }, - "engines": { - "node": ">=6.0" + "funding": { + "url": "https://github.com/sponsors/isaacs" }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/http-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/lazystream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", + "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", - "debug": "4" + "readable-stream": "^2.0.5" }, "engines": { - "node": ">= 14" + "node": ">= 0.6.3" } }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/lazystream/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "node_modules/https-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "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": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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.", - "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==", - "license": "ISC" - }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true, - "license": "ISC" - }, - "node_modules/interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha512-CLM8SNMDu7C5psFCn6Wg/tgpj/bKAg7hc2gWqcuR9OD5Ft9PhBpIu8PLicPeis+xDd6YX2ncI8MCA64I9tftIA==", - "dev": true, - "license": "MIT" - }, - "node_modules/ip-address": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", - "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "jsbn": "1.1.0", - "sprintf-js": "^1.1.3" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/ip-address/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-it-type": { + "node_modules/lazystream/node_modules/safe-buffer": { "version": "5.1.2", - "resolved": "https://registry.npmjs.org/is-it-type/-/is-it-type-5.1.2.tgz", - "integrity": "sha512-q/gOZQTNYABAxaXWnBKZjTFH4yACvWEFtgVOj+LbgxYIgAJG1xVmUZOsECSrZPIemYUQvaQWVilSFVbh4Eyt8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.16.7", - "globalthis": "^1.0.2" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/is-lambda": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", - "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-3.0.0.tgz", - "integrity": "sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==", - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-path-inside": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-4.0.0.tgz", - "integrity": "sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-unc-path": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "unc-path-regex": "^0.1.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true, - "license": "MIT" - }, - "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/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsbn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", - "dev": true, - "license": "MIT" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readable-stream": "^2.0.5" - }, - "engines": { - "node": ">= 0.6.3" - } - }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/liftup": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz", - "integrity": "sha512-yRHaiQDizWSzoXk3APcA71eOI/UuhEkNN9DiW2Tt44mhYzX4joFoCZlxsSOF7RyeLlfqzFLQI1ngFq3ggMPhOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "extend": "^3.0.2", - "findup-sync": "^4.0.0", - "fined": "^1.2.0", - "flagged-respawn": "^1.0.1", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.1", - "rechoir": "^0.7.0", - "resolve": "^1.19.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/liftup/node_modules/findup-sync": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-4.0.0.tgz", - "integrity": "sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^4.0.2", - "resolve-dir": "^1.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.difference": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz", - "integrity": "sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.flatten": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz", - "integrity": "sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.union": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz", - "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", - "dev": true, - "license": "MIT" - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, - "node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/make-fetch-happen": { - "version": "13.0.1", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-13.0.1.tgz", - "integrity": "sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@npmcli/agent": "^2.0.0", - "cacache": "^18.0.0", - "http-cache-semantics": "^4.1.1", - "is-lambda": "^1.0.1", - "minipass": "^7.0.2", - "minipass-fetch": "^3.0.0", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.3", - "proc-log": "^4.2.0", - "promise-retry": "^2.0.1", - "ssri": "^10.0.0" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/make-fetch-happen/node_modules/proc-log": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-4.2.0.tgz", - "integrity": "sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "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", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-collect": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-2.0.1.tgz", - "integrity": "sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minipass-fetch": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", - "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^7.0.3", - "minipass-sized": "^1.0.3", - "minizlib": "^2.1.2" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - }, - "optionalDependencies": { - "encoding": "^0.1.13" - } - }, - "node_modules/minipass-flush": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", - "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true, + "license": "MIT" }, - "node_modules/minipass-flush/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/lazystream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "safe-buffer": "~5.1.0" } }, - "node_modules/minipass-pipeline": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", - "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } + "license": "MIT" }, - "node_modules/minipass-pipeline/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/loupe": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", + "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "get-func-name": "^2.0.1" } }, - "node_modules/minipass-sized": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", - "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "node_modules/lru-cache": { + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", + "integrity": "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A==", "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": "20 || >=22" } }, - "node_modules/minipass-sized/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", "dev": true, + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, "engines": { "node": ">= 8" } }, - "node_modules/minizlib/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">= 0.6" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "license": "MIT", "dependencies": { - "minimist": "^1.2.6" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, - "bin": { - "mkdirp": "bin/cmd.js" + "engines": { + "node": ">=8.6" } }, - "node_modules/mocha": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.4.0.tgz", - "integrity": "sha512-eqhGB8JKapEYcC4ytX/xrzKforgEc3j1pGlAXVy3eRwrtAy5/nIfT1SvgGzfN0XZZxeLq0aQWkOUAmqIJiv+bA==", + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, "license": "MIT", - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "8.1.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" + "mime": "cli.js" }, "engines": { - "node": ">= 14.0.0" + "node": ">=4" } }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" + "engines": { + "node": ">= 0.6" } }, - "node_modules/mocha/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "license": "MIT", "dependencies": { - "ms": "2.1.2" + "mime-db": "1.52.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">= 0.6" } }, - "node_modules/mocha/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, + "node_modules/minimatch": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", + "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", "license": "ISC", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "node": "*" } }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" } }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/minizlib": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", + "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", "dev": true, "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" + "minipass": "^7.1.2" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "node": ">= 18" } }, "node_modules/ms": { @@ -4221,91 +2108,98 @@ "node": ">= 0.6" } }, - "node_modules/node-gyp": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-10.1.0.tgz", - "integrity": "sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==", + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "exponential-backoff": "^3.1.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.6", - "make-fetch-happen": "^13.0.0", - "nopt": "^7.0.0", - "proc-log": "^3.0.0", - "semver": "^7.3.5", - "tar": "^6.1.2", - "which": "^4.0.0" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": "^16.14.0 || >=18.0.0" - } - }, - "node_modules/node-gyp/node_modules/abbrev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-2.0.0.tgz", - "integrity": "sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==", - "dev": true, - "license": "ISC", "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=0.10.0" } }, - "node_modules/node-gyp/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/nw-builder": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/nw-builder/-/nw-builder-4.17.10.tgz", + "integrity": "sha512-+yBQULGni1luAOAYzRtd/JgjOhFy5VChdiw6DdAwseBiU9ydu2ekvZNSJBTFfei9kr15nqRZuODLsdn/HE4S1g==", "dev": true, + "hasInstallScript": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "@nwutils/getter": "^0.2.4", + "@nwutils/runner": "^0.2.3", + "archiver": "^7.0.1", + "commander": "^14.0.3", + "glob": "^13.0.6", + "plist": "^4.0.0", + "resedit": "^3.0.2", + "semver": "^7.7.4", + "tar": "^7.5.10" + }, + "bin": { + "nwbuild": "src/cli.js" } }, - "node_modules/node-gyp/node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "node_modules/nw-builder/node_modules/archiver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-7.0.1.tgz", + "integrity": "sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.2", + "async": "^3.2.4", + "buffer-crc32": "^1.0.0", + "readable-stream": "^4.0.0", + "readdir-glob": "^1.1.2", + "tar-stream": "^3.0.0", + "zip-stream": "^6.0.1" + }, "engines": { - "node": ">=10" + "node": ">= 14" } }, - "node_modules/node-gyp/node_modules/fs-minipass": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", - "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "node_modules/nw-builder/node_modules/archiver-utils": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-5.0.2.tgz", + "integrity": "sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "minipass": "^3.0.0" + "glob": "^10.0.0", + "graceful-fs": "^4.2.0", + "is-stream": "^2.0.1", + "lazystream": "^1.0.0", + "lodash": "^4.17.15", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">= 8" + "node": ">= 14" } }, - "node_modules/node-gyp/node_modules/fs-minipass/node_modules/minipass": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", - "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "node_modules/nw-builder/node_modules/archiver-utils/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/nw-builder/node_modules/archiver-utils/node_modules/brace-expansion": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "balanced-match": "^1.0.0" } }, - "node_modules/node-gyp/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "node_modules/nw-builder/node_modules/archiver-utils/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "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": { @@ -4313,36 +2207,24 @@ "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/isexe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.1.tgz", - "integrity": "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16" - } - }, - "node_modules/node-gyp/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "node_modules/nw-builder/node_modules/archiver-utils/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -4351,219 +2233,196 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/node-gyp/node_modules/nopt": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-7.2.1.tgz", - "integrity": "sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "^2.0.0" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/node-gyp/node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", + "node_modules/nw-builder/node_modules/archiver-utils/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/node-gyp/node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "node_modules/nw-builder/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" } }, - "node_modules/node-gyp/node_modules/which": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/which/-/which-4.0.0.tgz", - "integrity": "sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==", + "node_modules/nw-builder/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "isexe": "^3.1.1" - }, - "bin": { - "node-which": "bin/which.js" + "balanced-match": "^4.0.2" }, "engines": { - "node": "^16.13.0 || >=18.0.0" + "node": "18 || 20 || >=22" } }, - "node_modules/nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==", + "node_modules/nw-builder/node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, - "license": "ISC", + "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", "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "node_modules/nw-builder/node_modules/buffer-crc32": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", + "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8.0.0" } }, - "node_modules/nw-builder": { - "version": "4.7.4", - "resolved": "https://registry.npmjs.org/nw-builder/-/nw-builder-4.7.4.tgz", - "integrity": "sha512-klgSL8xs8cr4918bev1Vm4Hm6/v6IqekDixonOQThh3mvAqrjdmkH2nkLnyV1xiWiAqjnX3f/5vuxBF2+oqr8A==", + "node_modules/nw-builder/node_modules/compress-commons": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-6.0.2.tgz", + "integrity": "sha512-6FqVXeETqWPoGcfzrXb37E50NP0LXT8kAMu5ooZayhWWdgEY4lBEEcbQNXtkuKQsGduxiIcI4gOTsxTmuq/bSg==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.6.8", - "cli-progress": "^3.12.0", - "compressing": "^1.10.0", - "glob": "^10.3.14", - "node-gyp": "^10.1.0", - "plist": "^3.1.0", - "rcedit": "^4.0.1", - "semver": "^7.6.2", - "tar": "^7.1.0", - "yargs": "^17.7.2", - "yauzl-promise": "^4.0.0" - }, - "bin": { - "nwbuild": "src/cli.js" + "crc-32": "^1.2.0", + "crc32-stream": "^6.0.0", + "is-stream": "^2.0.1", + "normalize-path": "^3.0.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">=14" + "node": ">= 14" } }, - "node_modules/nw-builder/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/nw-builder/node_modules/crc32-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-6.0.0.tgz", + "integrity": "sha512-piICUB6ei4IlTv1+653yq5+KoqfBYmj9bw6LqXoOneTMDXk5nM1qt12mFW1caG3LlJXEKW1Bp0WggEmIfQB34g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/nw-builder/node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" + "crc-32": "^1.2.0", + "readable-stream": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">= 14" } }, "node_modules/nw-builder/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/nw-builder/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/nw-builder/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.5" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/nw-builder/node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "node_modules/nw-builder/node_modules/readable-stream": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.7.0.tgz", + "integrity": "sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==", "dev": true, "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "abort-controller": "^3.0.0", + "buffer": "^6.0.3", + "events": "^3.3.0", + "process": "^0.11.10", + "string_decoder": "^1.3.0" }, "engines": { - "node": ">=12" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/nw-builder/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/nw-builder/node_modules/tar-stream": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.2.0.tgz", + "integrity": "sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==", "dev": true, - "license": "ISC", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "bare-fs": "^4.5.5", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/nw-builder/node_modules/zip-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-6.0.1.tgz", + "integrity": "sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "archiver-utils": "^5.0.0", + "compress-commons": "^6.0.2", + "readable-stream": "^4.0.0" + }, "engines": { - "node": ">=12" + "node": ">= 14" } }, "node_modules/object-inspect": { @@ -4586,49 +2445,6 @@ "node": ">= 0.4" } }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", @@ -4651,70 +2467,6 @@ "wrappy": "1" } }, - "node_modules/os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "deprecated": "This package is no longer supported.", - "dev": true, - "license": "ISC", - "dependencies": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-map": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", @@ -4730,30 +2482,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } + "license": "BlueOak-1.0.0" }, "node_modules/parseurl": { "version": "1.3.3", @@ -4765,16 +2499,6 @@ "node": ">= 0.8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -4794,48 +2518,18 @@ "node": ">=8" } }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, - "license": "MIT" - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4867,12 +2561,19 @@ "node": ">= 14.16" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "node_modules/pe-library": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-2.0.1.tgz", + "integrity": "sha512-/qjYFqNSlq59B5DI36am++5/3gMgh02QnzpYigrwrW6s+QpU0mHf09/iA4wjTu21UUxodyV7ZCetV5MiDhaN/A==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } }, "node_modules/picomatch": { "version": "2.3.1", @@ -4887,63 +2588,35 @@ } }, "node_modules/plist": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", - "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-4.0.0.tgz", + "integrity": "sha512-4dOqNo0Y2NpfSf9q4+zr4bh7pzNWeckIam34Z0KYJhg8qtNNfh59VbD+Yna5SjwcxawVvLKx5w5FtuCijpEF4Q==", "dev": true, "license": "MIT", "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.5.1", + "@xmldom/xmldom": "^0.9.10", "xmlbuilder": "^15.1.1" }, "engines": { - "node": ">=10.4.0" + "node": ">=18" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "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": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/proc-log": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-3.0.0.tgz", - "integrity": "sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==", - "dev": true, - "license": "ISC", - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">= 0.6.0" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/promise-retry": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", - "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", - "dev": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true, + "license": "MIT" }, "node_modules/proxy-addr": { "version": "2.0.7", @@ -4965,17 +2638,6 @@ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "license": "MIT", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/qs": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", @@ -5012,16 +2674,6 @@ ], "license": "MIT" }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -5048,34 +2700,6 @@ "node": ">= 0.8" } }, - "node_modules/rcedit": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/rcedit/-/rcedit-4.0.1.tgz", - "integrity": "sha512-bZdaQi34krFWhrDn+O53ccBDw0MkAT2Vhu75SqhtvhQu4OPyFM4RoVheyYiVQYdjhUi6EJMVWQ0tR6bCIYVkUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn-windows-exe": "^1.1.0" - }, - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdir-glob": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", @@ -5109,89 +2733,21 @@ "node": ">=10" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", + "node_modules/resedit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-3.0.2.tgz", + "integrity": "sha512-FnqVDJYX4etlEnz2AaJYE1c1FTcgrsHiI2U4DXRxO4CIzbGP7r0jml9uZIMlvzCom2pbBLZjIhF26wj92y1cVQ==", "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.9.0" + "pe-library": "^2.0.1" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, - "license": "MIT" - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" + "node": ">=20" }, "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/retry": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" + "type": "github", + "url": "https://github.com/sponsors/jet2jet" } }, "node_modules/reusify": { @@ -5272,9 +2828,9 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5315,16 +2871,6 @@ "dev": true, "license": "MIT" }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/serve-static": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", @@ -5443,92 +2989,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/smart-buffer": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", - "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks": { - "version": "2.8.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", - "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ip-address": "^9.0.5", - "smart-buffer": "^4.2.0" - }, - "engines": { - "node": ">= 10.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.1", - "debug": "^4.3.4", - "socks": "^2.7.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/socks-proxy-agent/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socks-proxy-agent/node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/ssri": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", - "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^7.0.3" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", @@ -5539,282 +2999,122 @@ "node": ">= 0.8" } }, - "node_modules/stream-buffers": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", - "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", - "dev": true, - "license": "Unlicense", - "engines": { - "node": ">= 0.10.0" - } - }, - "node_modules/streamifier": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha512-zDgl+muIlWzXNsXeyUfOk9dChMjlpkq0DRsxujtYPgyJ676yQ8jEm6zzaaWHFDg5BNcLuif0eD2MTyJdZqXpdg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tar": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.2.0.tgz", - "integrity": "sha512-hctwP0Nb4AB60bj8WQgRYaMOuJYRAPMGiQUAotms5igN8ppfQM+IvjQ5HcKu1MaZh2Wy2KWVTe563Yj8dfc14w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.0", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "node_modules/streamx": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", "dev": true, - "license": "MIT", - "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "license": "MIT", + "dependencies": { + "events-universal": "^1.0.0", + "fast-fifo": "^1.3.2", + "text-decoder": "^1.1.0" } }, - "node_modules/tar/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "safe-buffer": "~5.2.0" } }, - "node_modules/tar/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/tar/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, - "license": "ISC", + "license": "MIT", "dependencies": { - "brace-expansion": "^2.0.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/tar/node_modules/minizlib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.1.tgz", - "integrity": "sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==", + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", "dependencies": { - "minipass": "^7.0.4", - "rimraf": "^5.0.5" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">= 18" + "node": ">=8" } }, - "node_modules/tar/node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" + "dependencies": { + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=8" } }, - "node_modules/tar/node_modules/rimraf": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", - "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", + "node_modules/tar": { + "version": "7.5.15", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.15.tgz", + "integrity": "sha512-dzGK0boVlC4W5QFuQN1EFSl3bIDYsk7Tj40U6eIBnK2k/8ml7TZ5agbI5j5+qnoVcAA+rNtBml8SEiLxZpNqRQ==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=18" } }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" } }, - "node_modules/to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", + "node_modules/text-decoder": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.7.tgz", + "integrity": "sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==", "dev": true, - "license": "MIT" + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } }, "node_modules/to-regex-range": { "version": "5.0.1", @@ -5839,9 +3139,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "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", "optional": true @@ -5860,62 +3160,26 @@ "node": ">= 0.6" } }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/underscore.string": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.3.6.tgz", - "integrity": "sha512-VoC83HWXmCrF6rgkyxS9GHv8W9Q5nhMKho+OadDJGzL2oDYbYEppBaCMH6pFlwLeqj2QS+hhkw2kpXkSdD1JxQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "^1.1.1", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/underscore.string/node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/unique-filename": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", - "integrity": "sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==", + "node_modules/typescript": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz", + "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "dev": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^4.0.0" + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" }, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=14.17" } }, - "node_modules/unique-slug": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-4.0.0.tgz", - "integrity": "sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==", + "node_modules/undici-types": { + "version": "7.19.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", + "integrity": "sha512-qYVnV5OEm2AW8cJMCpdV20CDyaN3g0AjDlOGf1OW4iaDEx8MwdtChUp4zu4H0VP3nDRF/8RKWH+IPp9uW0YGZg==", "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } + "license": "MIT" }, "node_modules/unpipe": { "version": "1.0.0", @@ -5944,19 +3208,6 @@ "node": ">= 0.4.0" } }, - "node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "license": "MIT", - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -5983,31 +3234,6 @@ "node": ">= 8" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", @@ -6043,76 +3269,14 @@ "node": ">=8.0" } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true, - "license": "ISC" - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "license": "MIT", - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", "dev": true, - "license": "MIT", - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/yauzl-promise": { @@ -6129,101 +3293,6 @@ "engines": { "node": ">=16" } - }, - "node_modules/yazl": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", - "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-crc32": "~0.2.3" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/zip-stream": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.1.tgz", - "integrity": "sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "archiver-utils": "^3.0.4", - "compress-commons": "^4.1.2", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/archiver-utils": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-3.0.4.tgz", - "integrity": "sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^7.2.3", - "graceful-fs": "^4.2.0", - "lazystream": "^1.0.0", - "lodash.defaults": "^4.2.0", - "lodash.difference": "^4.5.0", - "lodash.flatten": "^4.4.0", - "lodash.isplainobject": "^4.0.6", - "lodash.union": "^4.6.0", - "normalize-path": "^3.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/zip-stream/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "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/zip-stream/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } } } } diff --git a/package.json b/package.json index 264c7ad..aa0a930 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "@nwutils/updater", + "version": "0.3.5", "description": "Update NW.js applications", "keywords": [ "NW.js", "node-webkit", "update" ], - "version": "0.3.5", "author": { "name": "Eldar Djafarov", "url": "https://github.com/edjafarov" @@ -23,12 +23,14 @@ "url": "https://github.com/nwutils/updater/graphs/contributors" } ], - "main": "./app/updater.js", - "types": "./index.d.ts", + "license": "MIT", + "main": "./src/main.js", + "types": "types/main.d.ts", + "type": "module", "files": [ - "index.d.ts", "LICENSE", - "app/updater.js" + "src", + "types" ], "homepage": "https://github.com/nwutils/updater", "repository": { @@ -36,9 +38,13 @@ "url": "https://github.com/nwutils/updater.git" }, "scripts": { - "grunt": "grunt", - "test": "grunt clean mochaTest", - "types": "npx -p typescript tsc app/updater.js --declaration --allowJs --emitDeclarationOnly --outFile ./index.d.ts" + "lint": "echo 'Linting is not set up yet'", + "type": "tsc", + "test": "node --test --experimental-test-coverage \"test/specs/*.test.js\"" + }, + "volta": { + "node": "25.9.0", + "npm": "11.14.1" }, "dependencies": { "axios": "^1.7.2", @@ -47,16 +53,10 @@ "semver": "^7.6.2" }, "devDependencies": { - "chai": "^5.1.1", + "@types/node": "^25.6.2", "express": "^4.19.2", "get-port": "^7.1.0", - "grunt": "^1.6.1", - "grunt-cli": "^1.4.3", - "grunt-contrib-clean": "^2.0.1", - "grunt-contrib-compress": "^2.0.0", - "grunt-contrib-copy": "^1.0.0", - "grunt-mocha-test": "^0.13.3", - "grunt-nw-builder": "^4.7.4", - "mocha": "^10.4.0" + "nw-builder": "^4.17.10", + "typescript": "^6.0.3" } } diff --git a/app/updater.js b/src/main.js similarity index 97% rename from app/updater.js rename to src/main.js index 45736cf..aa9b157 100644 --- a/app/updater.js +++ b/src/main.js @@ -8,7 +8,6 @@ import del from 'del'; import ncp from 'ncp'; import semver from 'semver'; - let platform = process.platform; platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'linux' + (process.arch == 'ia32' ? '32' : '64'); @@ -39,13 +38,13 @@ platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'l * @property {string} temporaryDirectory - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) */ -class updater { +class Updater { /** - * Creates new instance of updater. + * Creates new instance of Updater. * * @constructor - * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/nw-updater?tab=readme-ov-file#manifest-schema). + * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema). * @param {UpdaterOptions} options - Optional */ constructor(manifest, options) { @@ -77,7 +76,7 @@ class updater { * * @async * @method - * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/nw-updater?tab=readme-ov-file#manifest-schema) below + * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below * @returns {Promise.} */ async download(newManifest) { @@ -130,7 +129,7 @@ class updater { /** * Will unpack the `filename` in temporary folder. - * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/edjafarov/node-webkit-updater/issues/68)). + * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). * * @param {string} filename * @param {function} cb - Callback arguments: error, unpacked directory @@ -413,4 +412,4 @@ var pInstall = { }; pInstall.linux64 = pInstall.linux32; -export default updater; +export default Updater; diff --git a/test/basicTest.spec.js b/test/basicTest.spec.js deleted file mode 100644 index 77a80b8..0000000 --- a/test/basicTest.spec.js +++ /dev/null @@ -1,176 +0,0 @@ -const { cp } = require('node:fs/promises'); -var ncp = require('ncp'); -var spawn = require('child_process').spawn; -var exec = require('child_process').exec; -var express = require('express'); -var isWin = /^win/.test(process.platform); -var isMac = /^darwin/.test(process.platform); -var isLinux = /^linux/.test(process.platform); -var path = require('path'); -var fs = require('fs'); -var getPort = undefined; -var port = null; -var app; -var expect; - -(async function () { - try { - expect = (await import('chai')).expect; - getPort = (await import('get-port')).default; - } catch (e) { - console.log(e); - } -})(); - -ncp.limit = 100; - -describe("build app", function () { - - it("copy current to temp", async function () { - await cp('./app', './test/app', { force: true, recursive: true }); - port = await getPort(); - return; - }); - - it("change manifest, build from temp", async function () { - const mock = { - name: "updapp", - manifestUrl: "http://localhost:" + port + "/package.json", - packages: { - mac: { - url: "http://localhost:" + port + "/updapp/osx/updapp.zip", - execPath: "updapp/updapp.app" - }, - win: { - url: "http://localhost:" + port + "/updapp/win/updapp.zip", - execPath: "updapp\\updapp.exe" - }, - linux32: { - url: "http://localhost:" + port + "/updapp/linux32/updapp.tar.gz" - }, - linux64: { - url: "http://localhost:" + port + "/updapp/linux64/updapp.tar.gz" - } - }, - updated: true, - version: "0.0.2" - } - - customizePackageJson(mock, __dirname + '/app/package.json'); - const base = path.normalize(__dirname); - const bd = spawn('node', ['./node_modules/grunt-cli/bin/grunt', 'buildapp', - '--dest=' + base + '/deploy0.2', - '--src=' + base + '/app']); - bd.stdout.on('data', function (data) { - console.log(data.toString()); - }) - bd.stderr.on('data', function (data) { - console.log(data.toString()); - }) - bd.on('close', function (code) { - expect(code).to.equal(0); - }); - - return; - }); - - it("package for [current os]", function (done) { - - var pkgCommand; - if (isMac) pkgCommand = 'packageMacZip';//'packageMac'; - if (isWin) pkgCommand = 'compress:win'; - if (isLinux) pkgCommand = 'compress:linux' + (process.arch == 'ia32' ? '32' : '64'); - console.log(pkgCommand) - - - var pk = spawn('node', ['./node_modules/grunt-cli/bin/grunt', pkgCommand, '--dest=./test/deploy0.2', '--src=./test/app']); - - pk.stdout.on('data', function (data) { - console.log(data.toString()); - }) - pk.on('close', function (code) { - expect(code).to.equal(0); - done(); - }) - }); - - it('run built app for [os], wait for app to be updated', function (done) { - var json = { - name: "updapp", - manifestUrl: "http://localhost:" + port + "/package.json", - packages: { - mac: { - url: "http://localhost:" + port + "/updapp/osx/updapp.zip", - execPath: "updapp/updapp.app" - }, - win: { - url: "http://localhost:" + port + "/updapp/win/updapp.zip", - execPath: "updapp\\updapp.exe" - }, - linux32: { - url: "http://localhost:" + port + "/updapp/linux32/updapp.tar.gz" - }, - linux64: { - url: "http://localhost:" + port + "/updapp/linux64/updapp.tar.gz" - } - }, - updated: true, - version: "0.0.2" - } - fs.writeFileSync(__dirname + "/deploy0.2/package.json", JSON.stringify(json, null, 4)); - app = express(); - app.use(express.static('./test/deploy0.2')); - app.listen(port); - done(); - }); - - it('should be updated, with new version', function (done) { - let os = { - mac: { - dir: 'osx/', - run: 'open ' + __dirname + "/deploy0.1/updapp/osx/updapp.app" - }, - win: { - dir: 'win/', - run: path.join(__dirname, "/deploy0.1/updapp/win/updapp.exe") - }, - linux32: { - dir: 'linux32/', - run: __dirname + "/deploy0.1/updapp/linux32/updapp" - }, - linux64: { - dir: 'linux64/', - run: __dirname + "/deploy0.1/updapp/linux64/updapp" - } - }; - if (isMac) os = os.mac; - if (isWin) os = os.win; - if (isLinux) os = os['linux' + (process.arch == 'ia32' ? '32' : '64')]; - - app.get('/version/0.0.2', function (req, res) { - res.end(); - done(); - }); - - exec(os.run, function (err, stdo, stder) { - console.log(arguments) - console.log(arguments[2]) - console.log("opened and updated"); - }); - }); - -}); - -function customizePackageJson(obj, path) { - var json = require(path); - for (var i in obj) { - json[i] = obj[i]; - } - fs.writeFileSync(path, JSON.stringify(json, null, 4)); -} -//build app -//serve from url dmg -//check app ver -//update served version -//wait -//check app ver updated diff --git a/tests/fixtures/app/index.html b/tests/fixtures/app/index.html new file mode 100644 index 0000000..82245f6 --- /dev/null +++ b/tests/fixtures/app/index.html @@ -0,0 +1,113 @@ + + + + updater + + + +
+
+ + + + \ No newline at end of file diff --git a/app/package.json b/tests/fixtures/app/package.json similarity index 78% rename from app/package.json rename to tests/fixtures/app/package.json index 6f836ce..0cdc639 100644 --- a/app/package.json +++ b/tests/fixtures/app/package.json @@ -4,7 +4,7 @@ "description": "", "author": "Eldar Djafarov ", "license": "MIT", - "manifestUrl": "https://raw.githubusercontent.com/nwutils/nw-updater/main/package.json", + "manifestUrl": "https://raw.githubusercontent.com/nwutils/updater/main/package.json", "packages": { "mac": { "url": "https://github.com/nwutils/nw-updater/archive/refs/tags/0.2.1.tar.gz" diff --git a/tests/fixtures/releases/manifest.json b/tests/fixtures/releases/manifest.json new file mode 100644 index 0000000..afce448 --- /dev/null +++ b/tests/fixtures/releases/manifest.json @@ -0,0 +1,11 @@ +{ + "name": "demo", + "version": "0.0.2", + "author": "NW.js Utils", + "manifestUrl": "http://localhost:3000/releases/manifest.json", + "packages": { + "linux-x64": { + "url": "http://localhost:3000/releases/linux/x64/demo.zip" + } + } +} diff --git a/tests/specs/main.test.js b/tests/specs/main.test.js new file mode 100644 index 0000000..e12e5ae --- /dev/null +++ b/tests/specs/main.test.js @@ -0,0 +1,17 @@ +import assert from "node:assert/strict"; +import { before, describe, it } from "node:test"; + +import nwbuild from "nw-builder"; + +// import get from "../../src/main.js"; + +describe("updater test suite", function () { + + before(function () { + + }); + + it("updates the application", async function () { + assert.strictEqual(1 === 1, true); + }); +}); diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..0cb9ecc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "declaration": true, + "emitDeclarationOnly": true, + "rootDir": "src", + "outDir": "types", + "strict": true, + "target": "ES2020", + "lib": [ + "ES2020" + ], + "module": "ESNext", + // "moduleResolution": "node", + "types": [ + "node" + ], + "esModuleInterop": true, + "allowSyntheticDefaultImports": true + }, + "include": [ + "src/**/*.js" + ] +} diff --git a/types/main.d.ts b/types/main.d.ts new file mode 100644 index 0000000..989a3bb --- /dev/null +++ b/types/main.d.ts @@ -0,0 +1,151 @@ +export default Updater; +export type Platform = { + /** + * - The URL to the package + */ + url: string; + /** + * - The path to the executable + */ + execPath: string; +}; +export type Packages = { + /** + * - The Windows package + */ + win: Platform; + /** + * - The macOS package + */ + mac: Platform; + /** + * - The Linux 32-bit package + */ + linux32: Platform; + /** + * - The Linux 64-bit package + */ + linux64: Platform; +}; +export type Manifest = { + /** + * - The name of the application + */ + name: string; + /** + * - The current version of the application + */ + version: string; + /** + * - The URL to the remote manifest file + */ + manifestUrl: string; + /** + * - The packages for the application + */ + packages: Packages; +}; +export type UpdaterOptions = { + /** + * - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ + temporaryDirectory: string; +}; +/** + * @typedef {object} Platform + * @property {string} url - The URL to the package + * @property {string} execPath - The path to the executable + */ +/** + * @typedef {object} Packages + * @property {Platform} win - The Windows package + * @property {Platform} mac - The macOS package + * @property {Platform} linux32 - The Linux 32-bit package + * @property {Platform} linux64 - The Linux 64-bit package + */ +/** + * @typedef {object} Manifest + * @property {string} name - The name of the application + * @property {string} version - The current version of the application + * @property {string} manifestUrl - The URL to the remote manifest file + * @property {Packages} packages - The packages for the application + */ +/** + * @typedef {object} UpdaterOptions + * @property {string} temporaryDirectory - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ +declare class Updater { + /** + * Creates new instance of Updater. + * + * @constructor + * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema). + * @param {UpdaterOptions} options - Optional + */ + constructor(manifest: Manifest, options: UpdaterOptions); + manifest: Manifest; + options: { + temporaryDirectory: string; + }; + /** + * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. + * + * @async + * @method + * @returns {Promise.} + */ + checkNewVersion(): Promise; + /** + * Downloads the new app to a temorary folder. + * + * @async + * @method + * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below + * @returns {Promise.} + */ + download(newManifest: Manifest): Promise; + /** + * Returns executed application path. + * + * @returns {string} + */ + getAppPath(): string; + /** + * Returns current application executable. + * + * @returns {string} + */ + getAppExec(): string; + /** + * Will unpack the `filename` in temporary folder. + * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). + * + * @param {string} filename + * @param {function} cb - Callback arguments: error, unpacked directory + * @param {object} manifest + */ + unpack(filename: string, cb: Function, manifest: object): void; + /** + * Runs installer + * @param {string} appPath + * @param {array} args - Arguments which will be passed when running the new app + * @param {object} options - Optional + * @returns {function} + */ + runInstaller(appPath: string, args: array, options: object, ...args: any[]): Function; + /** + * Installs the app (copies current application to `copyPath`) + * @param {string} copyPath + * @param {function} cb - Callback arguments: error + */ + install(copyPath: string, cb: Function, ...args: any[]): void; + /** + * Runs the app from original app executable path. + * @param {string} execPath + * @param {array} args - Arguments passed to the app being ran. + * @param {object} options - Optional. See `spawn` from nodejs docs. + * + * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). + */ + run(execPath: string, args: array, options: object, ...args: any[]): void; +} diff --git a/types/src/main.d.ts b/types/src/main.d.ts new file mode 100644 index 0000000..ed205d2 --- /dev/null +++ b/types/src/main.d.ts @@ -0,0 +1,54 @@ +declare const updater: any; +export default updater; +export type Platform = { + /** + * - The URL to the package + */ + url: string; + /** + * - The path to the executable + */ + execPath: string; +}; +export type Packages = { + /** + * - The Windows package + */ + win: Platform; + /** + * - The macOS package + */ + mac: Platform; + /** + * - The Linux 32-bit package + */ + linux32: Platform; + /** + * - The Linux 64-bit package + */ + linux64: Platform; +}; +export type Manifest = { + /** + * - The name of the application + */ + name: string; + /** + * - The current version of the application + */ + version: string; + /** + * - The URL to the remote manifest file + */ + manifestUrl: string; + /** + * - The packages for the application + */ + packages: Packages; +}; +export type UpdaterOptions = { + /** + * - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ + temporaryDirectory: string; +}; From 375b4a25b1949269298b452fc4d92e82f1fb7907 Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sat, 9 May 2026 19:44:59 +0530 Subject: [PATCH 3/9] chore(ci): build current and latest app for test suite --- .github/workflows/ci.yml | 4 +- .gitignore | 4 + index.d.ts | 153 --- package-lock.json | 1207 +++++++++-------- package.json | 16 +- tests/fixtures/app-current/index.html | 12 + tests/fixtures/app-current/index.js | 1 + tests/fixtures/app-current/package.json | 12 + .../{app/index.html => app-current/tmp.html} | 3 +- tests/fixtures/app-latest/index.html | 12 + tests/fixtures/app-latest/index.js | 1 + tests/fixtures/app-latest/package.json | 12 + tests/fixtures/app-latest/tmp.html | 114 ++ tests/fixtures/app/package.json | 17 - tests/fixtures/releases/manifest.json | 2 +- tests/specs/main.test.js | 30 +- tsconfig.json | 2 +- types/src/main.d.ts | 101 +- 18 files changed, 923 insertions(+), 780 deletions(-) delete mode 100644 index.d.ts create mode 100644 tests/fixtures/app-current/index.html create mode 100644 tests/fixtures/app-current/index.js create mode 100644 tests/fixtures/app-current/package.json rename tests/fixtures/{app/index.html => app-current/tmp.html} (98%) create mode 100644 tests/fixtures/app-latest/index.html create mode 100644 tests/fixtures/app-latest/index.js create mode 100644 tests/fixtures/app-latest/package.json create mode 100644 tests/fixtures/app-latest/tmp.html delete mode 100644 tests/fixtures/app/package.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2601d5..d3854b9 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,9 +18,9 @@ jobs: strategy: matrix: os: - - macos-15 + # - macos-26 - ubuntu-24.04 - - windows-2025 + # - windows-2025 fail-fast: false runs-on: ${{ matrix.os }} diff --git a/.gitignore b/.gitignore index 3c3629e..9fe0221 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,5 @@ node_modules + +cache + +*.zip diff --git a/index.d.ts b/index.d.ts deleted file mode 100644 index a8ab308..0000000 --- a/index.d.ts +++ /dev/null @@ -1,153 +0,0 @@ -declare module "updater" { - export default updater; - export type Platform = { - /** - * - The URL to the package - */ - url: string; - /** - * - The path to the executable - */ - execPath: string; - }; - export type Packages = { - /** - * - The Windows package - */ - win: Platform; - /** - * - The macOS package - */ - mac: Platform; - /** - * - The Linux 32-bit package - */ - linux32: Platform; - /** - * - The Linux 64-bit package - */ - linux64: Platform; - }; - export type Manifest = { - /** - * - The name of the application - */ - name: string; - /** - * - The current version of the application - */ - version: string; - /** - * - The URL to the remote manifest file - */ - manifestUrl: string; - /** - * - The packages for the application - */ - packages: Packages; - }; - export type UpdaterOptions = { - /** - * - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) - */ - temporaryDirectory: string; - }; - /** - * @typedef {object} Platform - * @property {string} url - The URL to the package - * @property {string} execPath - The path to the executable - */ - /** - * @typedef {object} Packages - * @property {Platform} win - The Windows package - * @property {Platform} mac - The macOS package - * @property {Platform} linux32 - The Linux 32-bit package - * @property {Platform} linux64 - The Linux 64-bit package - */ - /** - * @typedef {object} Manifest - * @property {string} name - The name of the application - * @property {string} version - The current version of the application - * @property {string} manifestUrl - The URL to the remote manifest file - * @property {Packages} packages - The packages for the application - */ - /** - * @typedef {object} UpdaterOptions - * @property {string} temporaryDirectory - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) - */ - class updater { - /** - * Creates new instance of updater. - * - * @constructor - * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/nw-updater?tab=readme-ov-file#manifest-schema). - * @param {UpdaterOptions} options - Optional - */ - constructor(manifest: Manifest, options: UpdaterOptions); - manifest: Manifest; - options: { - temporaryDirectory: any; - }; - /** - * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. - * - * @async - * @method - * @returns {Promise.} - */ - checkNewVersion(): Promise; - /** - * Downloads the new app to a temorary folder. - * - * @async - * @method - * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/nw-updater?tab=readme-ov-file#manifest-schema) below - * @returns {Promise.} - */ - download(newManifest: Manifest): Promise; - /** - * Returns executed application path. - * - * @returns {string} - */ - getAppPath(): string; - /** - * Returns current application executable. - * - * @returns {string} - */ - getAppExec(): string; - /** - * Will unpack the `filename` in temporary folder. - * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/edjafarov/node-webkit-updater/issues/68)). - * - * @param {string} filename - * @param {function} cb - Callback arguments: error, unpacked directory - * @param {object} manifest - */ - unpack(filename: string, cb: Function, manifest: object): void; - /** - * Runs installer - * @param {string} appPath - * @param {array} args - Arguments which will be passed when running the new app - * @param {object} options - Optional - * @returns {function} - */ - runInstaller(appPath: string, args: any[], options: object, ...args: any[]): Function; - /** - * Installs the app (copies current application to `copyPath`) - * @param {string} copyPath - * @param {function} cb - Callback arguments: error - */ - install(copyPath: string, cb: Function, ...args: any[]): void; - /** - * Runs the app from original app executable path. - * @param {string} execPath - * @param {array} args - Arguments passed to the app being ran. - * @param {object} options - Optional. See `spawn` from nodejs docs. - * - * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). - */ - run(execPath: string, args: any[], options: object, ...args: any[]): void; - } -} diff --git a/package-lock.json b/package-lock.json index 904e20f..9e0c10b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,16 +9,19 @@ "version": "0.3.5", "license": "MIT", "dependencies": { - "axios": "^1.7.2", - "del": "^7.1.0", + "axios": "^1.16.0", + "del": "^8.0.1", "ncp": "^2.0.0", "semver": "^7.6.2" }, "devDependencies": { + "@types/del": "^3.0.1", + "@types/ncp": "^2.0.8", "@types/node": "^25.6.2", - "chai": "^5.1.1", - "express": "^4.19.2", - "get-port": "^7.1.0", + "@types/nw.js": "^0.92.0", + "@types/semver": "^7.7.1", + "express": "^5.2.1", + "get-port": "^7.2.0", "nw-builder": "^4.17.10", "typescript": "^6.0.3" } @@ -531,6 +534,18 @@ "node": ">=14" } }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.2", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", @@ -542,6 +557,44 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/del": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/del/-/del-3.0.1.tgz", + "integrity": "sha512-y6qRq6raBuu965clKgx6FHuiPu3oHdtmzMPXi8Uahsjdq1L6DL5fS/aY5/s71YwM7k6K1QIWvem5vNwlnNGIkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/glob": "*" + } + }, + "node_modules/@types/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/minimatch": "^5.1.2", + "@types/node": "*" + } + }, + "node_modules/@types/minimatch": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", + "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ncp": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/ncp/-/ncp-2.0.8.tgz", + "integrity": "sha512-pLNWVLCVWBLVM4F2OPjjK6FWFtByFKD7LhHryF+MbVLws7ENj09mKxRFlhkGPOXfJuaBAG+2iADKJsZwnAbYDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/node": { "version": "25.6.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.6.2.tgz", @@ -552,6 +605,23 @@ "undici-types": "~7.19.0" } }, + "node_modules/@types/nw.js": { + "version": "0.92.0", + "resolved": "https://registry.npmjs.org/@types/nw.js/-/nw.js-0.92.0.tgz", + "integrity": "sha512-Lmang5tGGogfjSXx0DTeM3VN48rAX8wF/F+1fGbBd/NaU6RgPBogmzgjqsmqufRqpsZQD5d9fGfCyyzMg43ZkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.7.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", + "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", + "dev": true, + "license": "MIT" + }, "node_modules/@xmldom/xmldom": { "version": "0.9.10", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.9.10.tgz", @@ -576,35 +646,19 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "dev": true, "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" } }, - "node_modules/aggregate-error": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", - "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", - "license": "MIT", - "dependencies": { - "clean-stack": "^4.0.0", - "indent-string": "^5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -631,23 +685,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", - "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/async": { "version": "3.2.5", "resolved": "https://registry.npmjs.org/async/-/async-3.2.5.tgz", @@ -662,14 +699,14 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", - "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", + "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" } }, "node_modules/b4a": { @@ -691,6 +728,7 @@ "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/bare-events": { @@ -812,38 +850,28 @@ "license": "MIT" }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", + "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "content-type": "~1.0.5", - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.2", - "type-is": "~1.6.18", - "unpipe": "1.0.0" + "bytes": "^3.1.2", + "content-type": "^1.0.5", + "debug": "^4.4.3", + "http-errors": "^2.0.0", + "iconv-lite": "^0.7.0", + "on-finished": "^2.4.1", + "qs": "^6.14.1", + "raw-body": "^3.0.1", + "type-is": "^2.0.1" }, "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/braces": { @@ -868,51 +896,34 @@ "node": ">= 0.8" } }, - "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", - "dev": true, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/chai": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz", - "integrity": "sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==", + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { - "assertion-error": "^2.0.1", - "check-error": "^2.1.1", - "deep-eql": "^5.0.1", - "loupe": "^3.1.0", - "pathval": "^2.0.0" + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { - "node": ">=12" - } - }, - "node_modules/check-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", - "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 16" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/chownr": { @@ -925,33 +936,6 @@ "node": ">=18" } }, - "node_modules/clean-stack": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", - "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "5.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/clean-stack/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -994,23 +978,18 @@ "node": ">=20" } }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "license": "MIT" - }, "node_modules/content-disposition": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", - "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", + "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", "dev": true, "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/content-type": { @@ -1024,9 +1003,9 @@ } }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true, "license": "MIT", "engines": { @@ -1034,11 +1013,14 @@ } }, "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", + "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=6.6.0" + } }, "node_modules/core-util-is": { "version": "1.0.3", @@ -1076,23 +1058,21 @@ } }, "node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/deep-eql": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", - "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", - "dev": true, - "license": "MIT", + "ms": "^2.1.3" + }, "engines": { - "node": ">=6" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, "node_modules/define-data-property": { @@ -1132,22 +1112,21 @@ } }, "node_modules/del": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/del/-/del-7.1.0.tgz", - "integrity": "sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/del/-/del-8.0.1.tgz", + "integrity": "sha512-gPqh0mKTPvaUZGAuHbrBUYKZWBNAeHG7TU3QH5EhVwPMyKvmfJaNXhcD2jTcXsJRRcffuho4vaYweu80dRrMGA==", "license": "MIT", "dependencies": { - "globby": "^13.1.2", - "graceful-fs": "^4.2.10", + "globby": "^14.0.2", "is-glob": "^4.0.3", "is-path-cwd": "^3.0.0", "is-path-inside": "^4.0.0", - "p-map": "^5.5.0", - "rimraf": "^3.0.2", - "slash": "^4.0.0" + "p-map": "^7.0.2", + "presentable-error": "^0.0.1", + "slash": "^5.1.0" }, "engines": { - "node": ">=14.16" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -1172,27 +1151,18 @@ "node": ">= 0.8" } }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "license": "MIT", "dependencies": { - "path-type": "^4.0.0" + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" }, "engines": { - "node": ">=8" + "node": ">= 0.4" } }, "node_modules/eastasianwidth": { @@ -1217,9 +1187,9 @@ "license": "MIT" }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, "license": "MIT", "engines": { @@ -1227,14 +1197,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dev": true, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, "engines": { "node": ">= 0.4" } @@ -1243,12 +1209,38 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1297,46 +1289,47 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", - "content-disposition": "0.5.4", - "content-type": "~1.0.4", - "cookie": "0.6.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "2.0.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "1.2.0", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.7", - "qs": "6.11.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.10.0" + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", + "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "accepts": "^2.0.0", + "body-parser": "^2.2.1", + "content-disposition": "^1.0.0", + "content-type": "^1.0.5", + "cookie": "^0.7.1", + "cookie-signature": "^1.2.1", + "debug": "^4.4.0", + "depd": "^2.0.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "finalhandler": "^2.1.0", + "fresh": "^2.0.0", + "http-errors": "^2.0.0", + "merge-descriptors": "^2.0.0", + "mime-types": "^3.0.0", + "on-finished": "^2.4.1", + "once": "^1.4.0", + "parseurl": "^1.3.3", + "proxy-addr": "^2.0.7", + "qs": "^6.14.0", + "range-parser": "^1.2.1", + "router": "^2.2.0", + "send": "^1.1.0", + "serve-static": "^2.2.0", + "statuses": "^2.0.1", + "type-is": "^2.0.1", + "vary": "^1.1.2" + }, + "engines": { + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/fast-fifo": { @@ -1347,25 +1340,25 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.4" + "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" @@ -1384,28 +1377,31 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", + "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "2.4.1", - "parseurl": "~1.3.3", - "statuses": "2.0.1", - "unpipe": "~1.0.0" + "debug": "^4.4.0", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "on-finished": "^2.4.1", + "parseurl": "^1.3.3", + "statuses": "^2.0.1" }, "engines": { - "node": ">= 0.8" + "node": ">= 18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", @@ -1440,19 +1436,42 @@ } }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" } }, + "node_modules/form-data/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/form-data/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1464,53 +1483,40 @@ } }, "node_modules/fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", + "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, - "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==", - "license": "ISC" - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", - "dev": true, + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1520,9 +1526,9 @@ } }, "node_modules/get-port": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.1.0.tgz", - "integrity": "sha512-QB9NKEeDg3xxVwCCwJQ9+xycaz6pBB6iQ76wiWMl1927n0Kir6alPiP+yuiICLLU4jpMe08dXfpebuQppFA2zw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/get-port/-/get-port-7.2.0.tgz", + "integrity": "sha512-afP4W205ONCuMoPBqcR6PSXnzX35KTcJygfJfcp+QY+uwm3p20p1YczWXhlICIzGMCxYBQcySEcOgsJcrkyobg==", "dev": true, "license": "MIT", "engines": { @@ -1532,25 +1538,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/glob": { - "version": "7.1.7", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz", - "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "license": "ISC", + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">= 0.4" } }, "node_modules/glob-parent": { @@ -1583,32 +1581,32 @@ } }, "node_modules/globby": { - "version": "13.2.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", - "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", "license": "MIT", "dependencies": { - "dir-glob": "^3.0.1", - "fast-glob": "^3.3.0", - "ignore": "^5.2.4", - "merge2": "^1.4.1", - "slash": "^4.0.0" + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -1618,6 +1616,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, "license": "ISC" }, "node_modules/has-property-descriptors": { @@ -1633,11 +1632,10 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "license": "MIT", "engines": { "node": ">= 0.4" @@ -1646,12 +1644,14 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, + "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==", "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, "engines": { "node": ">= 0.4" }, @@ -1663,7 +1663,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -1673,33 +1672,41 @@ } }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", + "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", "dev": true, "license": "MIT", "dependencies": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/ieee754": { @@ -1724,41 +1731,19 @@ "license": "BSD-3-Clause" }, "node_modules/ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/indent-string": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", - "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "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.", - "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/ipaddr.js": { @@ -1848,6 +1833,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", + "dev": true, + "license": "MIT" + }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -1944,16 +1936,6 @@ "dev": true, "license": "MIT" }, - "node_modules/loupe": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz", - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-func-name": "^2.0.1" - } - }, "node_modules/lru-cache": { "version": "11.3.6", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.6.tgz", @@ -1964,22 +1946,37 @@ "node": "20 || >=22" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", "dev": true, "license": "MIT", "engines": { - "node": ">= 0.6" + "node": ">= 0.8" } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", + "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge2": { "version": "1.4.1", @@ -1990,20 +1987,10 @@ "node": ">= 8" } }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", - "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "license": "MIT", "dependencies": { "braces": "^3.0.3", @@ -2013,50 +2000,31 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", + "dev": true, "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", - "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" + "node": ">=18" }, - "engines": { - "node": "*" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/minipass": { @@ -2083,9 +2051,9 @@ } }, "node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, @@ -2099,9 +2067,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "dev": true, "license": "MIT", "engines": { @@ -2426,11 +2394,14 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2462,21 +2433,19 @@ "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/p-map": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", - "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-7.0.4.tgz", + "integrity": "sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==", "license": "MIT", - "dependencies": { - "aggregate-error": "^4.0.0" - }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2499,15 +2468,6 @@ "node": ">= 0.8" } }, - "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==", - "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", @@ -2536,29 +2496,26 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", + "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", "dev": true, - "license": "MIT" - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/pathval": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", - "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", - "dev": true, + "node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", "license": "MIT", "engines": { - "node": ">= 14.16" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pe-library": { @@ -2576,9 +2533,9 @@ } }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -2601,6 +2558,18 @@ "node": ">=18" } }, + "node_modules/presentable-error": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/presentable-error/-/presentable-error-0.0.1.tgz", + "integrity": "sha512-E6rsNU1QNJgB3sjj7OANinGncFKuK+164sLXw1/CqBjj/EkXSoSdHCtWQGBNlREIGLnL7IEUEGa08YFVUbrhVg==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", @@ -2633,19 +2602,22 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.15.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz", + "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -2685,19 +2657,19 @@ } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", + "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.7.0", + "unpipe": "~1.0.0" }, "engines": { - "node": ">= 0.8" + "node": ">= 0.10" } }, "node_modules/readdir-glob": { @@ -2751,29 +2723,30 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, - "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", - "license": "ISC", + "node_modules/router": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", + "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", + "dev": true, + "license": "MIT", "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" + "debug": "^4.4.0", + "depd": "^2.0.0", + "is-promise": "^4.0.0", + "parseurl": "^1.3.3", + "path-to-regexp": "^8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "engines": { + "node": ">= 18" } }, "node_modules/run-parallel": { @@ -2840,69 +2813,50 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", + "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", "dev": true, "license": "MIT", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", - "destroy": "1.2.0", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", - "mime": "1.6.0", - "ms": "2.1.3", - "on-finished": "2.4.1", - "range-parser": "~1.2.1", - "statuses": "2.0.1" + "debug": "^4.4.3", + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "etag": "^1.8.1", + "fresh": "^2.0.0", + "http-errors": "^2.0.1", + "mime-types": "^3.0.2", + "ms": "^2.1.3", + "on-finished": "^2.4.1", + "range-parser": "^1.2.1", + "statuses": "^2.0.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, - "node_modules/send/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", + "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", "dev": true, "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.18.0" + "encodeurl": "^2.0.0", + "escape-html": "^1.0.3", + "parseurl": "^1.3.3", + "send": "^1.2.0" }, "engines": { - "node": ">= 0.8.0" - } - }, - "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" + "node": ">= 18" }, - "engines": { - "node": ">= 0.4" + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/setprototypeof": { @@ -2936,16 +2890,73 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -2978,21 +2989,21 @@ } }, "node_modules/slash": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", - "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", "dev": true, "license": "MIT", "engines": { @@ -3147,14 +3158,15 @@ "optional": true }, "node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", + "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", "dev": true, "license": "MIT", "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" + "content-type": "^1.0.5", + "media-typer": "^1.1.0", + "mime-types": "^3.0.0" }, "engines": { "node": ">= 0.6" @@ -3181,6 +3193,18 @@ "dev": true, "license": "MIT" }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -3198,16 +3222,6 @@ "dev": true, "license": "MIT" }, - "node_modules/utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -3257,6 +3271,7 @@ "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/xmlbuilder": { diff --git a/package.json b/package.json index aa0a930..8051db6 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ ], "license": "MIT", "main": "./src/main.js", - "types": "types/main.d.ts", + "types": "./types/src/main.d.ts", "type": "module", "files": [ "LICENSE", @@ -40,22 +40,26 @@ "scripts": { "lint": "echo 'Linting is not set up yet'", "type": "tsc", - "test": "node --test --experimental-test-coverage \"test/specs/*.test.js\"" + "test": "node --test --experimental-test-coverage \"tests/specs/*.test.js\"" }, "volta": { "node": "25.9.0", "npm": "11.14.1" }, "dependencies": { - "axios": "^1.7.2", - "del": "^7.1.0", + "axios": "^1.16.0", + "del": "^8.0.1", "ncp": "^2.0.0", "semver": "^7.6.2" }, "devDependencies": { + "@types/del": "^3.0.1", + "@types/ncp": "^2.0.8", "@types/node": "^25.6.2", - "express": "^4.19.2", - "get-port": "^7.1.0", + "@types/nw.js": "^0.92.0", + "@types/semver": "^7.7.1", + "express": "^5.2.1", + "get-port": "^7.2.0", "nw-builder": "^4.17.10", "typescript": "^6.0.3" } diff --git a/tests/fixtures/app-current/index.html b/tests/fixtures/app-current/index.html new file mode 100644 index 0000000..40b335c --- /dev/null +++ b/tests/fixtures/app-current/index.html @@ -0,0 +1,12 @@ + + + + + + Demo + + +
Current version: 0.0.1
+
Latest version: 0.0.2
+ + diff --git a/tests/fixtures/app-current/index.js b/tests/fixtures/app-current/index.js new file mode 100644 index 0000000..d80fa4a --- /dev/null +++ b/tests/fixtures/app-current/index.js @@ -0,0 +1 @@ +const App = nw.App; diff --git a/tests/fixtures/app-current/package.json b/tests/fixtures/app-current/package.json new file mode 100644 index 0000000..27361f2 --- /dev/null +++ b/tests/fixtures/app-current/package.json @@ -0,0 +1,12 @@ +{ + "name": "demo", + "version": "0.0.1", + "author": "NW.js Utils ", + "license": "MIT", + "manifestUrl": "http://localhost:3000/releases/manifest.json", + "packages": { + "linux-x64": { + "url": "http://localhost:3000/releases/demo-0.0.1-linux-x64.zip" + } + } +} diff --git a/tests/fixtures/app/index.html b/tests/fixtures/app-current/tmp.html similarity index 98% rename from tests/fixtures/app/index.html rename to tests/fixtures/app-current/tmp.html index 82245f6..53a6dc3 100644 --- a/tests/fixtures/app/index.html +++ b/tests/fixtures/app-current/tmp.html @@ -1,7 +1,8 @@ - updater + Demo + diff --git a/tests/fixtures/app-latest/index.html b/tests/fixtures/app-latest/index.html new file mode 100644 index 0000000..40b335c --- /dev/null +++ b/tests/fixtures/app-latest/index.html @@ -0,0 +1,12 @@ + + + + + + Demo + + +
Current version: 0.0.1
+
Latest version: 0.0.2
+ + diff --git a/tests/fixtures/app-latest/index.js b/tests/fixtures/app-latest/index.js new file mode 100644 index 0000000..d80fa4a --- /dev/null +++ b/tests/fixtures/app-latest/index.js @@ -0,0 +1 @@ +const App = nw.App; diff --git a/tests/fixtures/app-latest/package.json b/tests/fixtures/app-latest/package.json new file mode 100644 index 0000000..ee0cb9e --- /dev/null +++ b/tests/fixtures/app-latest/package.json @@ -0,0 +1,12 @@ +{ + "name": "demo", + "version": "0.0.2", + "author": "NW.js Utils ", + "license": "MIT", + "manifestUrl": "http://localhost:3000/releases/manifest.json", + "packages": { + "linux-x64": { + "url": "http://localhost:3000/releases/demo-0.0.2-linux-x64.zip" + } + } +} diff --git a/tests/fixtures/app-latest/tmp.html b/tests/fixtures/app-latest/tmp.html new file mode 100644 index 0000000..53a6dc3 --- /dev/null +++ b/tests/fixtures/app-latest/tmp.html @@ -0,0 +1,114 @@ + + + + Demo + + + + +
+
+ + + + \ No newline at end of file diff --git a/tests/fixtures/app/package.json b/tests/fixtures/app/package.json deleted file mode 100644 index 0cdc639..0000000 --- a/tests/fixtures/app/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "updapp", - "version": "0.0.1", - "description": "", - "author": "Eldar Djafarov ", - "license": "MIT", - "manifestUrl": "https://raw.githubusercontent.com/nwutils/updater/main/package.json", - "packages": { - "mac": { - "url": "https://github.com/nwutils/nw-updater/archive/refs/tags/0.2.1.tar.gz" - } - }, - "window": { - "toolbar": true - }, - "main": "app://updapp/index.html" -} diff --git a/tests/fixtures/releases/manifest.json b/tests/fixtures/releases/manifest.json index afce448..155bcff 100644 --- a/tests/fixtures/releases/manifest.json +++ b/tests/fixtures/releases/manifest.json @@ -5,7 +5,7 @@ "manifestUrl": "http://localhost:3000/releases/manifest.json", "packages": { "linux-x64": { - "url": "http://localhost:3000/releases/linux/x64/demo.zip" + "url": "http://localhost:3000/releases/demo-0.0.2-linux-x64.zip" } } } diff --git a/tests/specs/main.test.js b/tests/specs/main.test.js index e12e5ae..80039b4 100644 --- a/tests/specs/main.test.js +++ b/tests/specs/main.test.js @@ -1,4 +1,6 @@ import assert from "node:assert/strict"; +import fs from "node:fs"; +import path from "node:path"; import { before, describe, it } from "node:test"; import nwbuild from "nw-builder"; @@ -7,8 +9,34 @@ import nwbuild from "nw-builder"; describe("updater test suite", function () { - before(function () { + let nwOptions = { + mode: "build", + version: "latest", + flavor: "normal", + platform: "linux", + arch: "x64", + glob: false, + zip: "zip", + }; + before(async function () { + nwOptions = { + ...nwOptions, + srcDir: "./tests/fixtures/app-current", + outDir: "./tests/fixtures/releases/app-0.0.1-linux-x64" + }; + if (!fs.existsSync(`${nwOptions.outDir}.zip`)) { + await nwbuild(nwOptions); + } + + nwOptions = { + ...nwOptions, + srcDir: "./tests/fixtures/app-latest", + outDir: "./tests/fixtures/releases/app-0.0.2-linux-x64" + }; + if (!fs.existsSync(`${nwOptions.outDir}.zip`)) { + await nwbuild(nwOptions); + } }); it("updates the application", async function () { diff --git a/tsconfig.json b/tsconfig.json index 0cb9ecc..85f1271 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "checkJs": true, "declaration": true, "emitDeclarationOnly": true, - "rootDir": "src", + "rootDir": ".", "outDir": "types", "strict": true, "target": "ES2020", diff --git a/types/src/main.d.ts b/types/src/main.d.ts index ed205d2..989a3bb 100644 --- a/types/src/main.d.ts +++ b/types/src/main.d.ts @@ -1,5 +1,4 @@ -declare const updater: any; -export default updater; +export default Updater; export type Platform = { /** * - The URL to the package @@ -52,3 +51,101 @@ export type UpdaterOptions = { */ temporaryDirectory: string; }; +/** + * @typedef {object} Platform + * @property {string} url - The URL to the package + * @property {string} execPath - The path to the executable + */ +/** + * @typedef {object} Packages + * @property {Platform} win - The Windows package + * @property {Platform} mac - The macOS package + * @property {Platform} linux32 - The Linux 32-bit package + * @property {Platform} linux64 - The Linux 64-bit package + */ +/** + * @typedef {object} Manifest + * @property {string} name - The name of the application + * @property {string} version - The current version of the application + * @property {string} manifestUrl - The URL to the remote manifest file + * @property {Packages} packages - The packages for the application + */ +/** + * @typedef {object} UpdaterOptions + * @property {string} temporaryDirectory - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ +declare class Updater { + /** + * Creates new instance of Updater. + * + * @constructor + * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema). + * @param {UpdaterOptions} options - Optional + */ + constructor(manifest: Manifest, options: UpdaterOptions); + manifest: Manifest; + options: { + temporaryDirectory: string; + }; + /** + * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. + * + * @async + * @method + * @returns {Promise.} + */ + checkNewVersion(): Promise; + /** + * Downloads the new app to a temorary folder. + * + * @async + * @method + * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below + * @returns {Promise.} + */ + download(newManifest: Manifest): Promise; + /** + * Returns executed application path. + * + * @returns {string} + */ + getAppPath(): string; + /** + * Returns current application executable. + * + * @returns {string} + */ + getAppExec(): string; + /** + * Will unpack the `filename` in temporary folder. + * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). + * + * @param {string} filename + * @param {function} cb - Callback arguments: error, unpacked directory + * @param {object} manifest + */ + unpack(filename: string, cb: Function, manifest: object): void; + /** + * Runs installer + * @param {string} appPath + * @param {array} args - Arguments which will be passed when running the new app + * @param {object} options - Optional + * @returns {function} + */ + runInstaller(appPath: string, args: array, options: object, ...args: any[]): Function; + /** + * Installs the app (copies current application to `copyPath`) + * @param {string} copyPath + * @param {function} cb - Callback arguments: error + */ + install(copyPath: string, cb: Function, ...args: any[]): void; + /** + * Runs the app from original app executable path. + * @param {string} execPath + * @param {array} args - Arguments passed to the app being ran. + * @param {object} options - Optional. See `spawn` from nodejs docs. + * + * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). + */ + run(execPath: string, args: array, options: object, ...args: any[]): void; +} From 66e1d7507136fe5f9925fb68950955c298e5df4c Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sat, 9 May 2026 19:54:20 +0530 Subject: [PATCH 4/9] chore(test): run a web server exposing /releases file dir --- tests/fixtures/app-current/package.json | 2 +- tests/fixtures/app-latest/package.json | 2 +- tests/fixtures/releases/manifest.json | 4 ++-- tests/specs/main.test.js | 22 +++++++++++++++++++++- 4 files changed, 25 insertions(+), 5 deletions(-) diff --git a/tests/fixtures/app-current/package.json b/tests/fixtures/app-current/package.json index 27361f2..66675a2 100644 --- a/tests/fixtures/app-current/package.json +++ b/tests/fixtures/app-current/package.json @@ -6,7 +6,7 @@ "manifestUrl": "http://localhost:3000/releases/manifest.json", "packages": { "linux-x64": { - "url": "http://localhost:3000/releases/demo-0.0.1-linux-x64.zip" + "url": "http://localhost:3000/releases/app-0.0.1-linux-x64.zip" } } } diff --git a/tests/fixtures/app-latest/package.json b/tests/fixtures/app-latest/package.json index ee0cb9e..8850b4c 100644 --- a/tests/fixtures/app-latest/package.json +++ b/tests/fixtures/app-latest/package.json @@ -6,7 +6,7 @@ "manifestUrl": "http://localhost:3000/releases/manifest.json", "packages": { "linux-x64": { - "url": "http://localhost:3000/releases/demo-0.0.2-linux-x64.zip" + "url": "http://localhost:3000/releases/app-0.0.2-linux-x64.zip" } } } diff --git a/tests/fixtures/releases/manifest.json b/tests/fixtures/releases/manifest.json index 155bcff..fe9c30e 100644 --- a/tests/fixtures/releases/manifest.json +++ b/tests/fixtures/releases/manifest.json @@ -1,11 +1,11 @@ { - "name": "demo", + "name": "app", "version": "0.0.2", "author": "NW.js Utils", "manifestUrl": "http://localhost:3000/releases/manifest.json", "packages": { "linux-x64": { - "url": "http://localhost:3000/releases/demo-0.0.2-linux-x64.zip" + "url": "http://localhost:3000/releases/app-0.0.2-linux-x64.zip" } } } diff --git a/tests/specs/main.test.js b/tests/specs/main.test.js index 80039b4..e2a68b8 100644 --- a/tests/specs/main.test.js +++ b/tests/specs/main.test.js @@ -1,8 +1,10 @@ import assert from "node:assert/strict"; import fs from "node:fs"; +import http from "node:http"; import path from "node:path"; -import { before, describe, it } from "node:test"; +import { after, before, describe, it } from "node:test"; +import express from "express"; import nwbuild from "nw-builder"; // import get from "../../src/main.js"; @@ -19,6 +21,11 @@ describe("updater test suite", function () { zip: "zip", }; + const app = express(); + const filesDir = path.join(process.cwd(), "tests", "fixtures", "releases"); + app.use('/releases', express.static(filesDir)); + const server = http.createServer(app); + before(async function () { nwOptions = { ...nwOptions, @@ -37,9 +44,22 @@ describe("updater test suite", function () { if (!fs.existsSync(`${nwOptions.outDir}.zip`)) { await nwbuild(nwOptions); } + + await new Promise((resolve) => { + server.listen(3000, resolve); + }); }); it("updates the application", async function () { assert.strictEqual(1 === 1, true); }); + + after(async function () { + await new Promise((resolve, reject) => { + server.close((err) => { + if (err) reject(err); + else resolve(); + }); + }); + }); }); From 457522794606fd53540e8cbdabefb42d13ea27be Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sat, 9 May 2026 22:41:49 +0530 Subject: [PATCH 5/9] chore(test): setup testing environment --- .gitignore | 3 + package-lock.json | 166 +++++++-- package.json | 1 + src/main.js | 48 ++- tests/fixtures/app-current/index.html | 5 +- tests/fixtures/app-current/index.js | 20 +- tests/fixtures/app-current/package.json | 1 + tests/fixtures/app-current/tmp.html | 114 ------- tests/fixtures/app-latest/index.html | 5 +- tests/fixtures/app-latest/index.js | 20 +- tests/fixtures/app-latest/package.json | 5 +- tests/fixtures/app-latest/tmp.html | 114 ------- tests/fixtures/app-latest/updater.js | 433 ++++++++++++++++++++++++ tests/specs/main.test.js | 51 ++- 14 files changed, 700 insertions(+), 286 deletions(-) delete mode 100644 tests/fixtures/app-current/tmp.html delete mode 100644 tests/fixtures/app-latest/tmp.html create mode 100644 tests/fixtures/app-latest/updater.js diff --git a/.gitignore b/.gitignore index 9fe0221..77fb328 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,6 @@ node_modules cache *.zip + +tests/fixtures/releases/app-0.0.1-linux-x64 +tests/fixtures/app-current/updater.js diff --git a/package-lock.json b/package-lock.json index 9e0c10b..b232b1f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23,9 +23,17 @@ "express": "^5.2.1", "get-port": "^7.2.0", "nw-builder": "^4.17.10", + "selenium-webdriver": "^4.43.0", "typescript": "^6.0.3" } }, + "node_modules/@bazel/runfiles": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@bazel/runfiles/-/runfiles-6.5.0.tgz", + "integrity": "sha512-RzahvqTkfpY2jsDxo8YItPX+/iZ6hbiikw1YhE0bA9EKBR5Og8Pa6FHn9PO9M0zaXRVsr0GFQLKbB/0rzy9SzA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", @@ -1739,6 +1747,13 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" + }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -1883,6 +1898,19 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "license": "(MIT OR GPL-3.0-or-later)", + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/lazystream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", @@ -1896,37 +1924,14 @@ "node": ">= 0.6.3" } }, - "node_modules/lazystream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/lazystream/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==", - "dev": true, - "license": "MIT" - }, - "node_modules/lazystream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", "dev": true, "license": "MIT", "dependencies": { - "safe-buffer": "~5.1.0" + "immediate": "~3.0.5" } }, "node_modules/lodash": { @@ -2458,6 +2463,13 @@ "dev": true, "license": "BlueOak-1.0.0" }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" + }, "node_modules/parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", @@ -2672,6 +2684,39 @@ "node": ">= 0.10" } }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dev": true, + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, "node_modules/readdir-glob": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.3.tgz", @@ -2800,6 +2845,32 @@ "dev": true, "license": "MIT" }, + "node_modules/selenium-webdriver": { + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-4.43.0.tgz", + "integrity": "sha512-dV4zBTT37or3Z3/8uD6rS8zvd4ZxPuG4EJVlqYIbZCGZCYttZm7xb9rlFLSk4rrsQHAeDYvudl7cquo0vWpHjg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/SeleniumHQ" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/selenium" + } + ], + "license": "Apache-2.0", + "dependencies": { + "@bazel/runfiles": "^6.5.0", + "jszip": "^3.10.1", + "tmp": "^0.2.5", + "ws": "^8.20.0" + }, + "engines": { + "node": ">= 20.0.0" + } + }, "node_modules/semver": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", @@ -2859,6 +2930,13 @@ "url": "https://opencollective.com/express" } }, + "node_modules/setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" + }, "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", @@ -3127,6 +3205,16 @@ "b4a": "^1.6.4" } }, + "node_modules/tmp": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.5.tgz", + "integrity": "sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.14" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3274,6 +3362,28 @@ "dev": true, "license": "ISC" }, + "node_modules/ws": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/xmlbuilder": { "version": "15.1.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz", diff --git a/package.json b/package.json index 8051db6..010a09b 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "express": "^5.2.1", "get-port": "^7.2.0", "nw-builder": "^4.17.10", + "selenium-webdriver": "^4.43.0", "typescript": "^6.0.3" } } diff --git a/src/main.js b/src/main.js index aa9b157..4b3235c 100644 --- a/src/main.js +++ b/src/main.js @@ -40,6 +40,13 @@ platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'l class Updater { + #manifest = { + name: '', + version: '', + manifestUrl: '', + packages: {} + }; + /** * Creates new instance of Updater. * @@ -48,27 +55,38 @@ class Updater { * @param {UpdaterOptions} options - Optional */ constructor(manifest, options) { - this.manifest = manifest; + this.#manifest = manifest; this.options = { temporaryDirectory: options && options.temporaryDirectory || os.tmpdir() }; } /** - * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. - * - * @async - * @method - * @returns {Promise.} - */ - async checkNewVersion() { - const response = await axios({ - method: 'get', - url: this.manifest.manifestUrl, - responseType: 'json' - }); + * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. + * + * @async + * @method + * @param {(error: Error|null, newerVersionExists: boolean, remoteManifest: object|null) => void} cb + * @returns {void} + */ + checkNewVersion(cb) { + const currentVersion = this.#manifest.version; + + fetch(this.#manifest.manifestUrl) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error: ${response.status}`); + } + return response.json(); + }) + .then((data) => { + const latestVersion = data.version; - return semver.gt(response.data.version, this.manifest.version); + cb(null, semver.gt(latestVersion, currentVersion), data); + }) + .catch((error) => { + cb(error, false, null); + }); } /** @@ -80,7 +98,7 @@ class Updater { * @returns {Promise.} */ async download(newManifest) { - const manifest = newManifest ?? this.manifest; + const manifest = newManifest ?? this.#manifest; const url = manifest.packages[platform].url; const filename = decodeURI(path.basename(url)) const destinationPath = path.resolve(this.options.temporaryDirectory, filename); diff --git a/tests/fixtures/app-current/index.html b/tests/fixtures/app-current/index.html index 40b335c..152fa68 100644 --- a/tests/fixtures/app-current/index.html +++ b/tests/fixtures/app-current/index.html @@ -4,9 +4,10 @@ Demo + -
Current version: 0.0.1
-
Latest version: 0.0.2
+
+ diff --git a/tests/fixtures/app-current/index.js b/tests/fixtures/app-current/index.js index d80fa4a..44f39be 100644 --- a/tests/fixtures/app-current/index.js +++ b/tests/fixtures/app-current/index.js @@ -1 +1,19 @@ -const App = nw.App; +import Updater from "./updater.js"; + +const updater = new Updater("http://localhost:3000/releases/manifest.json"); + +async function handleCheckForUpdates() { + const updateStatus = document.getElementById("update-status"); + updater.checkNewVersion((err, newerVersionExists, remoteManifest) => { + updateStatus.textContent = "Checking for updates..."; + if (err) { + updateStatus.textContent = `Error checking for updates: ${err.message}`; + return; + } + if (newerVersionExists) { + updateStatus.textContent = "A newer version is available."; + } else { + updateStatus.textContent = "No new version available."; + } + }); +} diff --git a/tests/fixtures/app-current/package.json b/tests/fixtures/app-current/package.json index 66675a2..2488916 100644 --- a/tests/fixtures/app-current/package.json +++ b/tests/fixtures/app-current/package.json @@ -1,6 +1,7 @@ { "name": "demo", "version": "0.0.1", + "main": "index.html", "author": "NW.js Utils ", "license": "MIT", "manifestUrl": "http://localhost:3000/releases/manifest.json", diff --git a/tests/fixtures/app-current/tmp.html b/tests/fixtures/app-current/tmp.html deleted file mode 100644 index 53a6dc3..0000000 --- a/tests/fixtures/app-current/tmp.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - Demo - - - - -
-
- - - - \ No newline at end of file diff --git a/tests/fixtures/app-latest/index.html b/tests/fixtures/app-latest/index.html index 40b335c..152fa68 100644 --- a/tests/fixtures/app-latest/index.html +++ b/tests/fixtures/app-latest/index.html @@ -4,9 +4,10 @@ Demo + -
Current version: 0.0.1
-
Latest version: 0.0.2
+
+ diff --git a/tests/fixtures/app-latest/index.js b/tests/fixtures/app-latest/index.js index d80fa4a..c55bda0 100644 --- a/tests/fixtures/app-latest/index.js +++ b/tests/fixtures/app-latest/index.js @@ -1 +1,19 @@ -const App = nw.App; +import Updater from './updater.js'; + +const updater = new Updater("http://localhost:3000/releases/manifest.json"); + +async function handleCheckForUpdates() { + const updateStatus = document.getElementById('update-status'); + updater.checkNewVersion((err, newerVersionExists, remoteManifest) => { + updateStatus.textContent = "Checking for updates..."; + if (err) { + updateStatus.textContent = `Error checking for updates: ${err.message}`; + return; + } + if (newerVersionExists) { + updateStatus.textContent = 'A newer version is available.'; + } else { + updateStatus.textContent = 'No new version available.'; + } + }); +} diff --git a/tests/fixtures/app-latest/package.json b/tests/fixtures/app-latest/package.json index 8850b4c..115a587 100644 --- a/tests/fixtures/app-latest/package.json +++ b/tests/fixtures/app-latest/package.json @@ -1,12 +1,13 @@ { "name": "demo", "version": "0.0.2", + "main": "index.html", "author": "NW.js Utils ", "license": "MIT", "manifestUrl": "http://localhost:3000/releases/manifest.json", "packages": { "linux-x64": { - "url": "http://localhost:3000/releases/app-0.0.2-linux-x64.zip" + "url": "http://localhost:3000/releases/app-0.0.1-linux-x64.zip" } } -} +} \ No newline at end of file diff --git a/tests/fixtures/app-latest/tmp.html b/tests/fixtures/app-latest/tmp.html deleted file mode 100644 index 53a6dc3..0000000 --- a/tests/fixtures/app-latest/tmp.html +++ /dev/null @@ -1,114 +0,0 @@ - - - - Demo - - - - -
-
- - - - \ No newline at end of file diff --git a/tests/fixtures/app-latest/updater.js b/tests/fixtures/app-latest/updater.js new file mode 100644 index 0000000..4b3235c --- /dev/null +++ b/tests/fixtures/app-latest/updater.js @@ -0,0 +1,433 @@ +import child_process from 'node:child_process'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import process from 'node:process'; + +import del from 'del'; +import ncp from 'ncp'; +import semver from 'semver'; + +let platform = process.platform; +platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'linux' + (process.arch == 'ia32' ? '32' : '64'); + +/** + * @typedef {object} Platform + * @property {string} url - The URL to the package + * @property {string} execPath - The path to the executable + */ + +/** + * @typedef {object} Packages + * @property {Platform} win - The Windows package + * @property {Platform} mac - The macOS package + * @property {Platform} linux32 - The Linux 32-bit package + * @property {Platform} linux64 - The Linux 64-bit package + */ + +/** + * @typedef {object} Manifest + * @property {string} name - The name of the application + * @property {string} version - The current version of the application + * @property {string} manifestUrl - The URL to the remote manifest file + * @property {Packages} packages - The packages for the application + */ + +/** + * @typedef {object} UpdaterOptions + * @property {string} temporaryDirectory - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ + +class Updater { + + #manifest = { + name: '', + version: '', + manifestUrl: '', + packages: {} + }; + + /** + * Creates new instance of Updater. + * + * @constructor + * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema). + * @param {UpdaterOptions} options - Optional + */ + constructor(manifest, options) { + this.#manifest = manifest; + this.options = { + temporaryDirectory: options && options.temporaryDirectory || os.tmpdir() + }; + } + + /** + * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. + * + * @async + * @method + * @param {(error: Error|null, newerVersionExists: boolean, remoteManifest: object|null) => void} cb + * @returns {void} + */ + checkNewVersion(cb) { + const currentVersion = this.#manifest.version; + + fetch(this.#manifest.manifestUrl) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error: ${response.status}`); + } + return response.json(); + }) + .then((data) => { + const latestVersion = data.version; + + cb(null, semver.gt(latestVersion, currentVersion), data); + }) + .catch((error) => { + cb(error, false, null); + }); + } + + /** + * Downloads the new app to a temorary folder. + * + * @async + * @method + * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below + * @returns {Promise.} + */ + async download(newManifest) { + const manifest = newManifest ?? this.#manifest; + const url = manifest.packages[platform].url; + const filename = decodeURI(path.basename(url)) + const destinationPath = path.resolve(this.options.temporaryDirectory, filename); + + const writeStream = fs.createWriteStream(destinationPath); + + const response = await axios({ + method: 'get', + url: url, + responseType: 'stream' + }); + + await stream.promises.pipeline(response.data, writeStream); + } + + /** + * Returns executed application path. + * + * @returns {string} + */ + getAppPath() { + let appPath = { + mac: path.join(process.cwd(), '../../..'), + win: path.dirname(process.execPath) + }; + appPath.linux32 = appPath.win; + appPath.linux64 = appPath.win; + return appPath[platform]; + } + + /** + * Returns current application executable. + * + * @returns {string} + */ + getAppExec() { + let execFolder = this.getAppPath(); + let exec = { + mac: '', + win: path.basename(process.execPath), + linux32: path.basename(process.execPath), + linux64: path.basename(process.execPath) + }; + return path.join(execFolder, exec[platform]); + } + + /** + * Will unpack the `filename` in temporary folder. + * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). + * + * @param {string} filename + * @param {function} cb - Callback arguments: error, unpacked directory + * @param {object} manifest + */ + unpack(filename, cb, manifest) { + pUnpack[platform](filename, cb, manifest, this.options.temporaryDirectory); + } + /** + * Runs installer + * @param {string} appPath + * @param {array} args - Arguments which will be passed when running the new app + * @param {object} options - Optional + * @returns {function} + */ + runInstaller(appPath, args, options) { + return pRun[platform].apply(this, arguments); + } + /** + * Installs the app (copies current application to `copyPath`) + * @param {string} copyPath + * @param {function} cb - Callback arguments: error + */ + install(copyPath, cb) { + pInstall[platform].apply(this, arguments); + } + /** + * Runs the app from original app executable path. + * @param {string} execPath + * @param {array} args - Arguments passed to the app being ran. + * @param {object} options - Optional. See `spawn` from nodejs docs. + * + * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). + */ + run(execPath, args, options) { + var arg = arguments; + if (platform.indexOf('linux') === 0) arg[0] = path.dirname(arg[0]); + pRun[platform].apply(this, arg); + } +} + +/** + * @private + * @param {string} zipPath + * @param {string} temporaryDirectory + * @return {string} + */ +var getZipDestinationDirectory = function (zipPath, temporaryDirectory) { + return path.join(temporaryDirectory, path.basename(zipPath, path.extname(zipPath))); +}, + + /** + * @private + * @param {object} manifest + * @return {string} + */ + getExecPathRelativeToPackage = function (manifest) { + var execPath = manifest.packages[platform] && manifest.packages[platform].execPath; + + if (execPath) { + return execPath; + } + else { + var suffix = { + win: '.exe', + mac: '.app' + }; + return manifest.name + (suffix[platform] || ''); + } + }; + + +var pUnpack = { + /** + * @private + */ + mac: function (filename, cb, manifest, temporaryDirectory) { + var args = arguments, + extension = path.extname(filename), + destination = path.join(temporaryDirectory, path.basename(filename, extension)); + + if (!fs.existsSync(destination)) { + fs.mkdirSync(destination); + } + + if (extension === ".zip") { + child_process.exec('unzip -xo "' + filename + '" >/dev/null', { cwd: destination }, function (err) { + if (err) { + console.log(err); + return cb(err); + } + var appPath = path.join(destination, getExecPathRelativeToPackage(manifest)); + cb(null, appPath); + }) + + } + else if (extension === ".dmg") { + // just in case if something was wrong during previous mount + child_process.exec('hdiutil unmount /Volumes/' + path.basename(filename, '.dmg'), function (err) { + // create a CDR from the DMG to bypass any steps which require user interaction + var cdrPath = filename.replace(/.dmg$/, '.cdr'); + child_process.exec('hdiutil convert "' + filename + '" -format UDTO -o "' + cdrPath + '"', function (err) { + child_process.exec('hdiutil attach "' + cdrPath + '" -nobrowse', function (err) { + if (err) { + if (err.code == 1) { + pUnpack.mac.apply(this, args); + } + return cb(err); + } + findMountPoint(path.basename(filename, '.dmg'), cb); + }); + }); + }); + + function findMountPoint(dmg_name, callback) { + child_process.exec('hdiutil info', function (err, stdout) { + if (err) return callback(err); + var results = stdout.split("\n"); + var dmgExp = new RegExp(dmg_name + '$'); + for (var i = 0, l = results.length; i < l; i++) { + if (results[i].match(dmgExp)) { + var mountPoint = results[i].split("\t").pop(); + var fileToRun = path.join(mountPoint, dmg_name + ".app"); + return callback(null, fileToRun); + } + } + callback(Error("Mount point not found")); + }) + } + } + }, + /** + * @private + */ + win: function (filename, cb, manifest, temporaryDirectory) { + var destinationDirectory = getZipDestinationDirectory(filename, temporaryDirectory), + unzip = function () { + // unzip by C. Spieler (docs: https://www.mkssoftware.com/docs/man1/unzip.1.asp, issues: http://www.info-zip.org/) + child_process.exec('"' + path.resolve(__dirname, 'tools/unzip.exe') + '" -u -o "' + + filename + '" -d "' + destinationDirectory + '" > NUL', function (err) { + if (err) { + return cb(err); + } + + cb(null, path.join(destinationDirectory, getExecPathRelativeToPackage(manifest))); + }); + }; + + fs.stat(destinationDirectory, function (err, _) { + if (!err) { + del(destinationDirectory, { force: true }, function (err) { + if (err) { + cb(err); + } + else { + unzip(); + } + }); + } + else { + unzip(); + } + }); + + }, + /** + * @private + */ + linux32: function (filename, cb, manifest, temporaryDirectory) { + //filename fix + child_process.exec('tar -zxvf "' + filename + '" >/dev/null', { cwd: temporaryDirectory }, function (err) { + console.log(arguments); + if (err) { + console.log(err); + return cb(err); + } + cb(null, path.join(temporaryDirectory, getExecPathRelativeToPackage(manifest))); + }) + } +}; +pUnpack.linux64 = pUnpack.linux32; + + + +var pRun = { + /** + * @private + */ + mac: function (appPath, args, options) { + //spawn + if (args && args.length) { + args = [appPath].concat('--args', args); + } else { + args = [appPath]; + } + return run('open', args, options); + }, + /** + * @private + */ + win: function (appPath, args, options, cb) { + return run(appPath, args, options, cb); + }, + /** + * @private + */ + linux32: function (appPath, args, options, cb) { + var appExec = path.join(appPath, path.basename(this.getAppExec())); + fs.chmodSync(appExec, '0o755') + if (!options) options = {}; + options.cwd = appPath; + return run(appPath + "/" + path.basename(this.getAppExec()), args, options, cb); + } +}; + +pRun.linux64 = pRun.linux32; + +/** + * @private + */ +function run(path, args, options) { + var opts = { + detached: true + }; + for (var key in options) { + opts[key] = options[key]; + } + var sp = child_process.spawn(path, args, opts); + sp.unref(); + return sp; +} + +var pInstall = { + /** + * @private + */ + mac: function (to, cb) { + ncp(this.getAppPath(), to, cb); + }, + /** + * @private + */ + win: function (to, cb) { + var self = this; + var errCounter = 50; + deleteApp(appDeleted); + + function appDeleted(err) { + if (err) { + errCounter--; + if (errCounter > 0) { + setTimeout(function () { + deleteApp(appDeleted); + }, 100); + } else { + return cb(err); + } + } + else { + ncp(self.getAppPath(), to, appCopied); + } + } + function deleteApp(cb) { + del(to + '/**/*', { force: true }, cb); + } + function appCopied(err) { + if (err) { + setTimeout(deleteApp, 100, appDeleted); + return + } + cb(); + } + }, + /** + * @private + */ + linux32: function (to, cb) { + ncp(this.getAppPath(), to, cb); + } +}; +pInstall.linux64 = pInstall.linux32; + +export default Updater; diff --git a/tests/specs/main.test.js b/tests/specs/main.test.js index e2a68b8..f6bfca9 100644 --- a/tests/specs/main.test.js +++ b/tests/specs/main.test.js @@ -6,40 +6,62 @@ import { after, before, describe, it } from "node:test"; import express from "express"; import nwbuild from "nw-builder"; +import selenium from "selenium-webdriver"; +import chrome from "selenium-webdriver/chrome.js"; // import get from "../../src/main.js"; describe("updater test suite", function () { + let driver = undefined; + let nwOptions = { mode: "build", version: "latest", - flavor: "normal", + flavor: "sdk", platform: "linux", arch: "x64", glob: false, - zip: "zip", }; const app = express(); const filesDir = path.join(process.cwd(), "tests", "fixtures", "releases"); - app.use('/releases', express.static(filesDir)); + app.use("/releases", express.static(filesDir)); const server = http.createServer(app); + const options = new chrome.Options(); + const seleniumArguments = [ + "nwapp=" + path.resolve("tests", "fixtures", "app-current") + ]; + seleniumArguments.push("headless=new"); + options.addArguments(seleniumArguments); + const chromeDriverPath = path.resolve("cache", "nwjs-sdk-v0.111.1-linux-x64", "chromedriver"); + const service = new chrome.ServiceBuilder(chromeDriverPath).build(); + driver = chrome.Driver.createSession(options, service); + before(async function () { + + fs.copyFileSync("./src/main.js", "./tests/fixtures/app-current/updater.js"); + nwOptions = { ...nwOptions, srcDir: "./tests/fixtures/app-current", outDir: "./tests/fixtures/releases/app-0.0.1-linux-x64" }; - if (!fs.existsSync(`${nwOptions.outDir}.zip`)) { + if (!fs.existsSync(nwOptions.outDir)) { await nwbuild(nwOptions); } + fs.cpSync("./tests/fixtures/app-current", "./tests/fixtures/app-latest", { recursive: true }); + const latestPackageJsonPath = path.join(process.cwd(), "tests", "fixtures", "app-latest", "package.json"); + const latestPackageJson = JSON.parse(fs.readFileSync(latestPackageJsonPath, "utf-8")); + latestPackageJson.version = "0.0.2"; + fs.writeFileSync(latestPackageJsonPath, JSON.stringify(latestPackageJson, null, 2), "utf-8"); nwOptions = { ...nwOptions, srcDir: "./tests/fixtures/app-latest", - outDir: "./tests/fixtures/releases/app-0.0.2-linux-x64" + outDir: "./tests/fixtures/releases/app-0.0.2-linux-x64", + zip: "zip", }; if (!fs.existsSync(`${nwOptions.outDir}.zip`)) { await nwbuild(nwOptions); @@ -50,8 +72,22 @@ describe("updater test suite", function () { }); }); - it("updates the application", async function () { - assert.strictEqual(1 === 1, true); + it("runs the current application and checks for updates", async function () { + const button = await driver.findElement(selenium.By.id('check-for-updates-button')); + await button.click(); + const statusLocator = selenium.By.id('update-status'); + const initialText = await driver.findElement(statusLocator).getText(); + + assert.strictEqual(initialText, "Checking for updates..."); + + await driver.wait(async () => { + const el = await driver.findElement(statusLocator); + const text = await el.getText(); + return text !== initialText; + }, 10000); + + const finalText = await driver.findElement(statusLocator).getText(); + assert.strictEqual(finalText, "A newer version is available."); }); after(async function () { @@ -61,5 +97,6 @@ describe("updater test suite", function () { else resolve(); }); }); + await driver.quit(); }); }); From 9191032d39bb46078e2961e4b5366e8bbaa5ef8f Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sun, 10 May 2026 00:41:22 +0530 Subject: [PATCH 6/9] chore(test): cover checkNewVersion function --- src/main.js | 379 +-------------------- src/updater.js | 426 ++++++++++++++++++++++++ tests/fixtures/app-current/index.html | 4 +- tests/fixtures/app-current/index.js | 11 +- tests/fixtures/app-current/package.json | 5 +- tests/fixtures/app-latest/index.html | 4 +- tests/fixtures/app-latest/index.js | 19 +- tests/fixtures/app-latest/package.json | 5 +- tests/fixtures/app-latest/updater.js | 379 +-------------------- tests/specs/main.test.js | 46 ++- 10 files changed, 511 insertions(+), 767 deletions(-) create mode 100644 src/updater.js diff --git a/src/main.js b/src/main.js index 4b3235c..c1710aa 100644 --- a/src/main.js +++ b/src/main.js @@ -1,15 +1,17 @@ -import child_process from 'node:child_process'; -import fs from 'node:fs'; -import os from 'node:os'; -import path from 'node:path'; -import process from 'node:process'; +const os = await import('node:os'); -import del from 'del'; -import ncp from 'ncp'; -import semver from 'semver'; +function semverGt(v1, v2) { + const [major1, minor1, patch1] = v1.replace(/^v/i, '').split('.').map(Number); + const [major2, minor2, patch2] = v2.replace(/^v/i, '').split('.').map(Number); -let platform = process.platform; -platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'linux' + (process.arch == 'ia32' ? '32' : '64'); + if (major1 !== major2) { + return major1 > major2; + } + if (minor1 !== minor2) { + return minor1 > minor2; + } + return patch1 > patch2; +} /** * @typedef {object} Platform @@ -40,13 +42,6 @@ platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'l class Updater { - #manifest = { - name: '', - version: '', - manifestUrl: '', - packages: {} - }; - /** * Creates new instance of Updater. * @@ -55,9 +50,9 @@ class Updater { * @param {UpdaterOptions} options - Optional */ constructor(manifest, options) { - this.#manifest = manifest; + this.manifest = manifest; this.options = { - temporaryDirectory: options && options.temporaryDirectory || os.tmpdir() + temporaryDirectory: options && options.temporaryDirectory || os.tmpdir(), }; } @@ -70,9 +65,9 @@ class Updater { * @returns {void} */ checkNewVersion(cb) { - const currentVersion = this.#manifest.version; + const currentVersion = this.manifest.version; - fetch(this.#manifest.manifestUrl) + fetch(this.manifest.manifestUrl) .then((response) => { if (!response.ok) { throw new Error(`HTTP error: ${response.status}`); @@ -82,352 +77,12 @@ class Updater { .then((data) => { const latestVersion = data.version; - cb(null, semver.gt(latestVersion, currentVersion), data); + cb(null, semverGt(latestVersion, currentVersion), data); }) .catch((error) => { cb(error, false, null); }); } - - /** - * Downloads the new app to a temorary folder. - * - * @async - * @method - * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below - * @returns {Promise.} - */ - async download(newManifest) { - const manifest = newManifest ?? this.#manifest; - const url = manifest.packages[platform].url; - const filename = decodeURI(path.basename(url)) - const destinationPath = path.resolve(this.options.temporaryDirectory, filename); - - const writeStream = fs.createWriteStream(destinationPath); - - const response = await axios({ - method: 'get', - url: url, - responseType: 'stream' - }); - - await stream.promises.pipeline(response.data, writeStream); - } - - /** - * Returns executed application path. - * - * @returns {string} - */ - getAppPath() { - let appPath = { - mac: path.join(process.cwd(), '../../..'), - win: path.dirname(process.execPath) - }; - appPath.linux32 = appPath.win; - appPath.linux64 = appPath.win; - return appPath[platform]; - } - - /** - * Returns current application executable. - * - * @returns {string} - */ - getAppExec() { - let execFolder = this.getAppPath(); - let exec = { - mac: '', - win: path.basename(process.execPath), - linux32: path.basename(process.execPath), - linux64: path.basename(process.execPath) - }; - return path.join(execFolder, exec[platform]); - } - - /** - * Will unpack the `filename` in temporary folder. - * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). - * - * @param {string} filename - * @param {function} cb - Callback arguments: error, unpacked directory - * @param {object} manifest - */ - unpack(filename, cb, manifest) { - pUnpack[platform](filename, cb, manifest, this.options.temporaryDirectory); - } - /** - * Runs installer - * @param {string} appPath - * @param {array} args - Arguments which will be passed when running the new app - * @param {object} options - Optional - * @returns {function} - */ - runInstaller(appPath, args, options) { - return pRun[platform].apply(this, arguments); - } - /** - * Installs the app (copies current application to `copyPath`) - * @param {string} copyPath - * @param {function} cb - Callback arguments: error - */ - install(copyPath, cb) { - pInstall[platform].apply(this, arguments); - } - /** - * Runs the app from original app executable path. - * @param {string} execPath - * @param {array} args - Arguments passed to the app being ran. - * @param {object} options - Optional. See `spawn` from nodejs docs. - * - * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). - */ - run(execPath, args, options) { - var arg = arguments; - if (platform.indexOf('linux') === 0) arg[0] = path.dirname(arg[0]); - pRun[platform].apply(this, arg); - } } -/** - * @private - * @param {string} zipPath - * @param {string} temporaryDirectory - * @return {string} - */ -var getZipDestinationDirectory = function (zipPath, temporaryDirectory) { - return path.join(temporaryDirectory, path.basename(zipPath, path.extname(zipPath))); -}, - - /** - * @private - * @param {object} manifest - * @return {string} - */ - getExecPathRelativeToPackage = function (manifest) { - var execPath = manifest.packages[platform] && manifest.packages[platform].execPath; - - if (execPath) { - return execPath; - } - else { - var suffix = { - win: '.exe', - mac: '.app' - }; - return manifest.name + (suffix[platform] || ''); - } - }; - - -var pUnpack = { - /** - * @private - */ - mac: function (filename, cb, manifest, temporaryDirectory) { - var args = arguments, - extension = path.extname(filename), - destination = path.join(temporaryDirectory, path.basename(filename, extension)); - - if (!fs.existsSync(destination)) { - fs.mkdirSync(destination); - } - - if (extension === ".zip") { - child_process.exec('unzip -xo "' + filename + '" >/dev/null', { cwd: destination }, function (err) { - if (err) { - console.log(err); - return cb(err); - } - var appPath = path.join(destination, getExecPathRelativeToPackage(manifest)); - cb(null, appPath); - }) - - } - else if (extension === ".dmg") { - // just in case if something was wrong during previous mount - child_process.exec('hdiutil unmount /Volumes/' + path.basename(filename, '.dmg'), function (err) { - // create a CDR from the DMG to bypass any steps which require user interaction - var cdrPath = filename.replace(/.dmg$/, '.cdr'); - child_process.exec('hdiutil convert "' + filename + '" -format UDTO -o "' + cdrPath + '"', function (err) { - child_process.exec('hdiutil attach "' + cdrPath + '" -nobrowse', function (err) { - if (err) { - if (err.code == 1) { - pUnpack.mac.apply(this, args); - } - return cb(err); - } - findMountPoint(path.basename(filename, '.dmg'), cb); - }); - }); - }); - - function findMountPoint(dmg_name, callback) { - child_process.exec('hdiutil info', function (err, stdout) { - if (err) return callback(err); - var results = stdout.split("\n"); - var dmgExp = new RegExp(dmg_name + '$'); - for (var i = 0, l = results.length; i < l; i++) { - if (results[i].match(dmgExp)) { - var mountPoint = results[i].split("\t").pop(); - var fileToRun = path.join(mountPoint, dmg_name + ".app"); - return callback(null, fileToRun); - } - } - callback(Error("Mount point not found")); - }) - } - } - }, - /** - * @private - */ - win: function (filename, cb, manifest, temporaryDirectory) { - var destinationDirectory = getZipDestinationDirectory(filename, temporaryDirectory), - unzip = function () { - // unzip by C. Spieler (docs: https://www.mkssoftware.com/docs/man1/unzip.1.asp, issues: http://www.info-zip.org/) - child_process.exec('"' + path.resolve(__dirname, 'tools/unzip.exe') + '" -u -o "' + - filename + '" -d "' + destinationDirectory + '" > NUL', function (err) { - if (err) { - return cb(err); - } - - cb(null, path.join(destinationDirectory, getExecPathRelativeToPackage(manifest))); - }); - }; - - fs.stat(destinationDirectory, function (err, _) { - if (!err) { - del(destinationDirectory, { force: true }, function (err) { - if (err) { - cb(err); - } - else { - unzip(); - } - }); - } - else { - unzip(); - } - }); - - }, - /** - * @private - */ - linux32: function (filename, cb, manifest, temporaryDirectory) { - //filename fix - child_process.exec('tar -zxvf "' + filename + '" >/dev/null', { cwd: temporaryDirectory }, function (err) { - console.log(arguments); - if (err) { - console.log(err); - return cb(err); - } - cb(null, path.join(temporaryDirectory, getExecPathRelativeToPackage(manifest))); - }) - } -}; -pUnpack.linux64 = pUnpack.linux32; - - - -var pRun = { - /** - * @private - */ - mac: function (appPath, args, options) { - //spawn - if (args && args.length) { - args = [appPath].concat('--args', args); - } else { - args = [appPath]; - } - return run('open', args, options); - }, - /** - * @private - */ - win: function (appPath, args, options, cb) { - return run(appPath, args, options, cb); - }, - /** - * @private - */ - linux32: function (appPath, args, options, cb) { - var appExec = path.join(appPath, path.basename(this.getAppExec())); - fs.chmodSync(appExec, '0o755') - if (!options) options = {}; - options.cwd = appPath; - return run(appPath + "/" + path.basename(this.getAppExec()), args, options, cb); - } -}; - -pRun.linux64 = pRun.linux32; - -/** - * @private - */ -function run(path, args, options) { - var opts = { - detached: true - }; - for (var key in options) { - opts[key] = options[key]; - } - var sp = child_process.spawn(path, args, opts); - sp.unref(); - return sp; -} - -var pInstall = { - /** - * @private - */ - mac: function (to, cb) { - ncp(this.getAppPath(), to, cb); - }, - /** - * @private - */ - win: function (to, cb) { - var self = this; - var errCounter = 50; - deleteApp(appDeleted); - - function appDeleted(err) { - if (err) { - errCounter--; - if (errCounter > 0) { - setTimeout(function () { - deleteApp(appDeleted); - }, 100); - } else { - return cb(err); - } - } - else { - ncp(self.getAppPath(), to, appCopied); - } - } - function deleteApp(cb) { - del(to + '/**/*', { force: true }, cb); - } - function appCopied(err) { - if (err) { - setTimeout(deleteApp, 100, appDeleted); - return - } - cb(); - } - }, - /** - * @private - */ - linux32: function (to, cb) { - ncp(this.getAppPath(), to, cb); - } -}; -pInstall.linux64 = pInstall.linux32; - export default Updater; diff --git a/src/updater.js b/src/updater.js new file mode 100644 index 0000000..e345a30 --- /dev/null +++ b/src/updater.js @@ -0,0 +1,426 @@ +import child_process from 'node:child_process'; +import fs from 'node:fs'; +import os from 'node:os'; +import path from 'node:path'; +import process from 'node:process'; + +import { deleteSync } from 'del'; +import ncp from 'ncp'; +import semver from 'semver'; + +let platform = process.platform; +platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'linux' + (process.arch == 'ia32' ? '32' : '64'); + +/** + * @typedef {object} Platform + * @property {string} url - The URL to the package + * @property {string} execPath - The path to the executable + */ + +/** + * @typedef {object} Packages + * @property {Platform} win - The Windows package + * @property {Platform} mac - The macOS package + * @property {Platform} linux32 - The Linux 32-bit package + * @property {Platform} linux64 - The Linux 64-bit package + */ + +/** + * @typedef {object} Manifest + * @property {string} name - The name of the application + * @property {string} version - The current version of the application + * @property {string} manifestUrl - The URL to the remote manifest file + * @property {Packages} packages - The packages for the application + */ + +/** + * @typedef {object} UpdaterOptions + * @property {string} temporaryDirectory - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ + +class Updater { + + #manifest = { + name: '', + version: '', + manifestUrl: '', + packages: {} + }; + + /** + * Creates new instance of Updater. + * + * @constructor + * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema). + * @param {UpdaterOptions} options - Optional + */ + constructor(manifest, options) { + this.#manifest = manifest; + this.options = { + temporaryDirectory: options && options.temporaryDirectory || os.tmpdir() + }; + } + + /** + * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. + * + * @async + * @method + * @param {(error: Error|null, newerVersionExists: boolean, remoteManifest: object|null) => void} cb + * @returns {void} + */ + checkNewVersion(cb) { + const currentVersion = this.#manifest.version; + + fetch(this.#manifest.manifestUrl) + .then((response) => { + if (!response.ok) { + throw new Error(`HTTP error: ${response.status}`); + } + return response.json(); + }) + .then((data) => { + const latestVersion = data.version; + + cb(null, semver.gt(latestVersion, currentVersion), data); + }) + .catch((error) => { + cb(error, false, null); + }); + } + + /** + * Downloads the new app to a temorary folder. + * + * @async + * @method + * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below + * @returns {Promise.} + */ + async download(newManifest) { + const manifest = newManifest ?? this.#manifest; + const url = manifest.packages[platform].url; + const filename = decodeURI(path.basename(url)) + const destinationPath = path.resolve(this.options.temporaryDirectory, filename); + + const writeStream = fs.createWriteStream(destinationPath); + + const response = await axios({ + method: 'get', + url: url, + responseType: 'stream' + }); + + await stream.promises.pipeline(response.data, writeStream); + } + + /** + * Returns executed application path. + * + * @returns {string} + */ + getAppPath() { + let appPath = { + mac: path.join(process.cwd(), '../../..'), + win: path.dirname(process.execPath) + }; + appPath.linux32 = appPath.win; + appPath.linux64 = appPath.win; + return appPath[platform]; + } + + /** + * Returns current application executable. + * + * @returns {string} + */ + getAppExec() { + let execFolder = this.getAppPath(); + let exec = { + mac: '', + win: path.basename(process.execPath), + linux32: path.basename(process.execPath), + linux64: path.basename(process.execPath) + }; + return path.join(execFolder, exec[platform]); + } + + /** + * Will unpack the `filename` in temporary folder. + * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). + * + * @param {string} filename + * @param {function} cb - Callback arguments: error, unpacked directory + * @param {object} manifest + */ + unpack(filename, cb, manifest) { + pUnpack[platform](filename, cb, manifest, this.options.temporaryDirectory); + } + /** + * Runs installer + * @param {string} appPath + * @param {array} args - Arguments which will be passed when running the new app + * @param {object} options - Optional + * @returns {function} + */ + runInstaller(appPath, args, options) { + return pRun[platform].apply(this, arguments); + } + /** + * Installs the app (copies current application to `copyPath`) + * @param {string} copyPath + * @param {function} cb - Callback arguments: error + */ + install(copyPath, cb) { + pInstall[platform].apply(this, arguments); + } + /** + * Runs the app from original app executable path. + * @param {string} execPath + * @param {array} args - Arguments passed to the app being ran. + * @param {object} options - Optional. See `spawn` from nodejs docs. + * + * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). + */ + run(execPath, args, options) { + var arg = arguments; + if (platform.indexOf('linux') === 0) arg[0] = path.dirname(arg[0]); + pRun[platform].apply(this, arg); + } +} + +/** + * @private + * @param {string} zipPath + * @param {string} temporaryDirectory + * @return {string} + */ +var getZipDestinationDirectory = function (zipPath, temporaryDirectory) { + return path.join(temporaryDirectory, path.basename(zipPath, path.extname(zipPath))); +}, + + /** + * @private + * @param {object} manifest + * @return {string} + */ + getExecPathRelativeToPackage = function (manifest) { + var execPath = manifest.packages[platform] && manifest.packages[platform].execPath; + + if (execPath) { + return execPath; + } + else { + var suffix = { + win: '.exe', + mac: '.app' + }; + return manifest.name + (suffix[platform] || ''); + } + }; + + +var pUnpack = { + /** + * @private + */ + mac: function (filename, cb, manifest, temporaryDirectory) { + var args = arguments, + extension = path.extname(filename), + destination = path.join(temporaryDirectory, path.basename(filename, extension)); + + if (!fs.existsSync(destination)) { + fs.mkdirSync(destination); + } + + if (extension === ".zip") { + child_process.exec('unzip -xo "' + filename + '" >/dev/null', { cwd: destination }, function (err) { + if (err) { + console.log(err); + return cb(err); + } + var appPath = path.join(destination, getExecPathRelativeToPackage(manifest)); + cb(null, appPath); + }) + + } + else if (extension === ".dmg") { + // just in case if something was wrong during previous mount + child_process.exec('hdiutil unmount /Volumes/' + path.basename(filename, '.dmg'), function (err) { + // create a CDR from the DMG to bypass any steps which require user interaction + var cdrPath = filename.replace(/.dmg$/, '.cdr'); + child_process.exec('hdiutil convert "' + filename + '" -format UDTO -o "' + cdrPath + '"', function (err) { + child_process.exec('hdiutil attach "' + cdrPath + '" -nobrowse', function (err) { + if (err) { + if (err.code == 1) { + pUnpack.mac.apply(this, args); + } + return cb(err); + } + findMountPoint(path.basename(filename, '.dmg'), cb); + }); + }); + }); + + function findMountPoint(dmg_name, callback) { + child_process.exec('hdiutil info', function (err, stdout) { + if (err) return callback(err); + var results = stdout.split("\n"); + var dmgExp = new RegExp(dmg_name + '$'); + for (var i = 0, l = results.length; i < l; i++) { + if (results[i].match(dmgExp)) { + var mountPoint = results[i].split("\t").pop(); + var fileToRun = path.join(mountPoint, dmg_name + ".app"); + return callback(null, fileToRun); + } + } + callback(Error("Mount point not found")); + }) + } + } + }, + /** + * @private + */ + win: function (filename, cb, manifest, temporaryDirectory) { + var destinationDirectory = getZipDestinationDirectory(filename, temporaryDirectory), + unzip = function () { + // unzip by C. Spieler (docs: https://www.mkssoftware.com/docs/man1/unzip.1.asp, issues: http://www.info-zip.org/) + child_process.exec('"' + path.resolve(__dirname, 'tools/unzip.exe') + '" -u -o "' + + filename + '" -d "' + destinationDirectory + '" > NUL', function (err) { + if (err) { + return cb(err); + } + + cb(null, path.join(destinationDirectory, getExecPathRelativeToPackage(manifest))); + }); + }; + + fs.stat(destinationDirectory, function (err, _) { + if (!err) { + deleteSync(destinationDirectory, { force: true }); + } + else { + unzip(); + } + }); + + }, + /** + * @private + */ + linux32: function (filename, cb, manifest, temporaryDirectory) { + //filename fix + child_process.exec('tar -zxvf "' + filename + '" >/dev/null', { cwd: temporaryDirectory }, function (err) { + console.log(arguments); + if (err) { + console.log(err); + return cb(err); + } + cb(null, path.join(temporaryDirectory, getExecPathRelativeToPackage(manifest))); + }) + } +}; +pUnpack.linux64 = pUnpack.linux32; + + + +var pRun = { + /** + * @private + */ + mac: function (appPath, args, options) { + //spawn + if (args && args.length) { + args = [appPath].concat('--args', args); + } else { + args = [appPath]; + } + return run('open', args, options); + }, + /** + * @private + */ + win: function (appPath, args, options, cb) { + return run(appPath, args, options, cb); + }, + /** + * @private + */ + linux32: function (appPath, args, options, cb) { + var appExec = path.join(appPath, path.basename(this.getAppExec())); + fs.chmodSync(appExec, '0o755') + if (!options) options = {}; + options.cwd = appPath; + return run(appPath + "/" + path.basename(this.getAppExec()), args, options, cb); + } +}; + +pRun.linux64 = pRun.linux32; + +/** + * @private + */ +function run(path, args, options) { + var opts = { + detached: true + }; + for (var key in options) { + opts[key] = options[key]; + } + var sp = child_process.spawn(path, args, opts); + sp.unref(); + return sp; +} + +var pInstall = { + /** + * @private + */ + mac: function (to, cb) { + ncp(this.getAppPath(), to, cb); + }, + /** + * @private + */ + win: function (to, cb) { + var self = this; + var errCounter = 50; + deleteApp(appDeleted); + + function appDeleted(err) { + if (err) { + errCounter--; + if (errCounter > 0) { + setTimeout(function () { + deleteApp(appDeleted); + }, 100); + } else { + return cb(err); + } + } + else { + ncp(self.getAppPath(), to, appCopied); + } + } + function deleteApp(cb) { + del(to + '/**/*', { force: true }, cb); + } + function appCopied(err) { + if (err) { + setTimeout(deleteApp, 100, appDeleted); + return + } + cb(); + } + }, + /** + * @private + */ + linux32: function (to, cb) { + ncp(this.getAppPath(), to, cb); + } +}; +pInstall.linux64 = pInstall.linux32; + +export default Updater; diff --git a/tests/fixtures/app-current/index.html b/tests/fixtures/app-current/index.html index 152fa68..97d4e5d 100644 --- a/tests/fixtures/app-current/index.html +++ b/tests/fixtures/app-current/index.html @@ -4,10 +4,10 @@ Demo -
- + + diff --git a/tests/fixtures/app-current/index.js b/tests/fixtures/app-current/index.js index 44f39be..b06a155 100644 --- a/tests/fixtures/app-current/index.js +++ b/tests/fixtures/app-current/index.js @@ -1,11 +1,16 @@ import Updater from "./updater.js"; +const manifest = nw.require("./package.json"); -const updater = new Updater("http://localhost:3000/releases/manifest.json"); +let updater; +document.addEventListener("DOMContentLoaded", () => { + updater = new Updater(manifest); + document.getElementById("check-for-updates-button").addEventListener("click", handleCheckForUpdates); +}); -async function handleCheckForUpdates() { +function handleCheckForUpdates() { const updateStatus = document.getElementById("update-status"); + updateStatus.textContent = "Checking for updates..."; updater.checkNewVersion((err, newerVersionExists, remoteManifest) => { - updateStatus.textContent = "Checking for updates..."; if (err) { updateStatus.textContent = `Error checking for updates: ${err.message}`; return; diff --git a/tests/fixtures/app-current/package.json b/tests/fixtures/app-current/package.json index 2488916..68809dc 100644 --- a/tests/fixtures/app-current/package.json +++ b/tests/fixtures/app-current/package.json @@ -2,12 +2,13 @@ "name": "demo", "version": "0.0.1", "main": "index.html", + "chromium-args": "--enable-features=NWESM,NWChainImportNode", "author": "NW.js Utils ", "license": "MIT", - "manifestUrl": "http://localhost:3000/releases/manifest.json", + "manifestUrl": "http://localhost:3000/manifest.json", "packages": { "linux-x64": { - "url": "http://localhost:3000/releases/app-0.0.1-linux-x64.zip" + "url": "http://localhost:3000/app-0.0.1-linux-x64.zip" } } } diff --git a/tests/fixtures/app-latest/index.html b/tests/fixtures/app-latest/index.html index 152fa68..97d4e5d 100644 --- a/tests/fixtures/app-latest/index.html +++ b/tests/fixtures/app-latest/index.html @@ -4,10 +4,10 @@ Demo -
- + + diff --git a/tests/fixtures/app-latest/index.js b/tests/fixtures/app-latest/index.js index c55bda0..b06a155 100644 --- a/tests/fixtures/app-latest/index.js +++ b/tests/fixtures/app-latest/index.js @@ -1,19 +1,24 @@ -import Updater from './updater.js'; +import Updater from "./updater.js"; +const manifest = nw.require("./package.json"); -const updater = new Updater("http://localhost:3000/releases/manifest.json"); +let updater; +document.addEventListener("DOMContentLoaded", () => { + updater = new Updater(manifest); + document.getElementById("check-for-updates-button").addEventListener("click", handleCheckForUpdates); +}); -async function handleCheckForUpdates() { - const updateStatus = document.getElementById('update-status'); +function handleCheckForUpdates() { + const updateStatus = document.getElementById("update-status"); + updateStatus.textContent = "Checking for updates..."; updater.checkNewVersion((err, newerVersionExists, remoteManifest) => { - updateStatus.textContent = "Checking for updates..."; if (err) { updateStatus.textContent = `Error checking for updates: ${err.message}`; return; } if (newerVersionExists) { - updateStatus.textContent = 'A newer version is available.'; + updateStatus.textContent = "A newer version is available."; } else { - updateStatus.textContent = 'No new version available.'; + updateStatus.textContent = "No new version available."; } }); } diff --git a/tests/fixtures/app-latest/package.json b/tests/fixtures/app-latest/package.json index 115a587..4ccc516 100644 --- a/tests/fixtures/app-latest/package.json +++ b/tests/fixtures/app-latest/package.json @@ -2,12 +2,13 @@ "name": "demo", "version": "0.0.2", "main": "index.html", + "chromium-args": "--enable-features=NWESM,NWChainImportNode", "author": "NW.js Utils ", "license": "MIT", - "manifestUrl": "http://localhost:3000/releases/manifest.json", + "manifestUrl": "http://localhost:3000/manifest.json", "packages": { "linux-x64": { - "url": "http://localhost:3000/releases/app-0.0.1-linux-x64.zip" + "url": "http://localhost:3000/app-0.0.1-linux-x64.zip" } } } \ No newline at end of file diff --git a/tests/fixtures/app-latest/updater.js b/tests/fixtures/app-latest/updater.js index 4b3235c..c1710aa 100644 --- a/tests/fixtures/app-latest/updater.js +++ b/tests/fixtures/app-latest/updater.js @@ -1,15 +1,17 @@ -import child_process from 'node:child_process'; -import fs from 'node:fs'; -import os from 'node:os'; -import path from 'node:path'; -import process from 'node:process'; +const os = await import('node:os'); -import del from 'del'; -import ncp from 'ncp'; -import semver from 'semver'; +function semverGt(v1, v2) { + const [major1, minor1, patch1] = v1.replace(/^v/i, '').split('.').map(Number); + const [major2, minor2, patch2] = v2.replace(/^v/i, '').split('.').map(Number); -let platform = process.platform; -platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'linux' + (process.arch == 'ia32' ? '32' : '64'); + if (major1 !== major2) { + return major1 > major2; + } + if (minor1 !== minor2) { + return minor1 > minor2; + } + return patch1 > patch2; +} /** * @typedef {object} Platform @@ -40,13 +42,6 @@ platform = /^win/.test(platform) ? 'win' : /^darwin/.test(platform) ? 'mac' : 'l class Updater { - #manifest = { - name: '', - version: '', - manifestUrl: '', - packages: {} - }; - /** * Creates new instance of Updater. * @@ -55,9 +50,9 @@ class Updater { * @param {UpdaterOptions} options - Optional */ constructor(manifest, options) { - this.#manifest = manifest; + this.manifest = manifest; this.options = { - temporaryDirectory: options && options.temporaryDirectory || os.tmpdir() + temporaryDirectory: options && options.temporaryDirectory || os.tmpdir(), }; } @@ -70,9 +65,9 @@ class Updater { * @returns {void} */ checkNewVersion(cb) { - const currentVersion = this.#manifest.version; + const currentVersion = this.manifest.version; - fetch(this.#manifest.manifestUrl) + fetch(this.manifest.manifestUrl) .then((response) => { if (!response.ok) { throw new Error(`HTTP error: ${response.status}`); @@ -82,352 +77,12 @@ class Updater { .then((data) => { const latestVersion = data.version; - cb(null, semver.gt(latestVersion, currentVersion), data); + cb(null, semverGt(latestVersion, currentVersion), data); }) .catch((error) => { cb(error, false, null); }); } - - /** - * Downloads the new app to a temorary folder. - * - * @async - * @method - * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below - * @returns {Promise.} - */ - async download(newManifest) { - const manifest = newManifest ?? this.#manifest; - const url = manifest.packages[platform].url; - const filename = decodeURI(path.basename(url)) - const destinationPath = path.resolve(this.options.temporaryDirectory, filename); - - const writeStream = fs.createWriteStream(destinationPath); - - const response = await axios({ - method: 'get', - url: url, - responseType: 'stream' - }); - - await stream.promises.pipeline(response.data, writeStream); - } - - /** - * Returns executed application path. - * - * @returns {string} - */ - getAppPath() { - let appPath = { - mac: path.join(process.cwd(), '../../..'), - win: path.dirname(process.execPath) - }; - appPath.linux32 = appPath.win; - appPath.linux64 = appPath.win; - return appPath[platform]; - } - - /** - * Returns current application executable. - * - * @returns {string} - */ - getAppExec() { - let execFolder = this.getAppPath(); - let exec = { - mac: '', - win: path.basename(process.execPath), - linux32: path.basename(process.execPath), - linux64: path.basename(process.execPath) - }; - return path.join(execFolder, exec[platform]); - } - - /** - * Will unpack the `filename` in temporary folder. - * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). - * - * @param {string} filename - * @param {function} cb - Callback arguments: error, unpacked directory - * @param {object} manifest - */ - unpack(filename, cb, manifest) { - pUnpack[platform](filename, cb, manifest, this.options.temporaryDirectory); - } - /** - * Runs installer - * @param {string} appPath - * @param {array} args - Arguments which will be passed when running the new app - * @param {object} options - Optional - * @returns {function} - */ - runInstaller(appPath, args, options) { - return pRun[platform].apply(this, arguments); - } - /** - * Installs the app (copies current application to `copyPath`) - * @param {string} copyPath - * @param {function} cb - Callback arguments: error - */ - install(copyPath, cb) { - pInstall[platform].apply(this, arguments); - } - /** - * Runs the app from original app executable path. - * @param {string} execPath - * @param {array} args - Arguments passed to the app being ran. - * @param {object} options - Optional. See `spawn` from nodejs docs. - * - * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). - */ - run(execPath, args, options) { - var arg = arguments; - if (platform.indexOf('linux') === 0) arg[0] = path.dirname(arg[0]); - pRun[platform].apply(this, arg); - } } -/** - * @private - * @param {string} zipPath - * @param {string} temporaryDirectory - * @return {string} - */ -var getZipDestinationDirectory = function (zipPath, temporaryDirectory) { - return path.join(temporaryDirectory, path.basename(zipPath, path.extname(zipPath))); -}, - - /** - * @private - * @param {object} manifest - * @return {string} - */ - getExecPathRelativeToPackage = function (manifest) { - var execPath = manifest.packages[platform] && manifest.packages[platform].execPath; - - if (execPath) { - return execPath; - } - else { - var suffix = { - win: '.exe', - mac: '.app' - }; - return manifest.name + (suffix[platform] || ''); - } - }; - - -var pUnpack = { - /** - * @private - */ - mac: function (filename, cb, manifest, temporaryDirectory) { - var args = arguments, - extension = path.extname(filename), - destination = path.join(temporaryDirectory, path.basename(filename, extension)); - - if (!fs.existsSync(destination)) { - fs.mkdirSync(destination); - } - - if (extension === ".zip") { - child_process.exec('unzip -xo "' + filename + '" >/dev/null', { cwd: destination }, function (err) { - if (err) { - console.log(err); - return cb(err); - } - var appPath = path.join(destination, getExecPathRelativeToPackage(manifest)); - cb(null, appPath); - }) - - } - else if (extension === ".dmg") { - // just in case if something was wrong during previous mount - child_process.exec('hdiutil unmount /Volumes/' + path.basename(filename, '.dmg'), function (err) { - // create a CDR from the DMG to bypass any steps which require user interaction - var cdrPath = filename.replace(/.dmg$/, '.cdr'); - child_process.exec('hdiutil convert "' + filename + '" -format UDTO -o "' + cdrPath + '"', function (err) { - child_process.exec('hdiutil attach "' + cdrPath + '" -nobrowse', function (err) { - if (err) { - if (err.code == 1) { - pUnpack.mac.apply(this, args); - } - return cb(err); - } - findMountPoint(path.basename(filename, '.dmg'), cb); - }); - }); - }); - - function findMountPoint(dmg_name, callback) { - child_process.exec('hdiutil info', function (err, stdout) { - if (err) return callback(err); - var results = stdout.split("\n"); - var dmgExp = new RegExp(dmg_name + '$'); - for (var i = 0, l = results.length; i < l; i++) { - if (results[i].match(dmgExp)) { - var mountPoint = results[i].split("\t").pop(); - var fileToRun = path.join(mountPoint, dmg_name + ".app"); - return callback(null, fileToRun); - } - } - callback(Error("Mount point not found")); - }) - } - } - }, - /** - * @private - */ - win: function (filename, cb, manifest, temporaryDirectory) { - var destinationDirectory = getZipDestinationDirectory(filename, temporaryDirectory), - unzip = function () { - // unzip by C. Spieler (docs: https://www.mkssoftware.com/docs/man1/unzip.1.asp, issues: http://www.info-zip.org/) - child_process.exec('"' + path.resolve(__dirname, 'tools/unzip.exe') + '" -u -o "' + - filename + '" -d "' + destinationDirectory + '" > NUL', function (err) { - if (err) { - return cb(err); - } - - cb(null, path.join(destinationDirectory, getExecPathRelativeToPackage(manifest))); - }); - }; - - fs.stat(destinationDirectory, function (err, _) { - if (!err) { - del(destinationDirectory, { force: true }, function (err) { - if (err) { - cb(err); - } - else { - unzip(); - } - }); - } - else { - unzip(); - } - }); - - }, - /** - * @private - */ - linux32: function (filename, cb, manifest, temporaryDirectory) { - //filename fix - child_process.exec('tar -zxvf "' + filename + '" >/dev/null', { cwd: temporaryDirectory }, function (err) { - console.log(arguments); - if (err) { - console.log(err); - return cb(err); - } - cb(null, path.join(temporaryDirectory, getExecPathRelativeToPackage(manifest))); - }) - } -}; -pUnpack.linux64 = pUnpack.linux32; - - - -var pRun = { - /** - * @private - */ - mac: function (appPath, args, options) { - //spawn - if (args && args.length) { - args = [appPath].concat('--args', args); - } else { - args = [appPath]; - } - return run('open', args, options); - }, - /** - * @private - */ - win: function (appPath, args, options, cb) { - return run(appPath, args, options, cb); - }, - /** - * @private - */ - linux32: function (appPath, args, options, cb) { - var appExec = path.join(appPath, path.basename(this.getAppExec())); - fs.chmodSync(appExec, '0o755') - if (!options) options = {}; - options.cwd = appPath; - return run(appPath + "/" + path.basename(this.getAppExec()), args, options, cb); - } -}; - -pRun.linux64 = pRun.linux32; - -/** - * @private - */ -function run(path, args, options) { - var opts = { - detached: true - }; - for (var key in options) { - opts[key] = options[key]; - } - var sp = child_process.spawn(path, args, opts); - sp.unref(); - return sp; -} - -var pInstall = { - /** - * @private - */ - mac: function (to, cb) { - ncp(this.getAppPath(), to, cb); - }, - /** - * @private - */ - win: function (to, cb) { - var self = this; - var errCounter = 50; - deleteApp(appDeleted); - - function appDeleted(err) { - if (err) { - errCounter--; - if (errCounter > 0) { - setTimeout(function () { - deleteApp(appDeleted); - }, 100); - } else { - return cb(err); - } - } - else { - ncp(self.getAppPath(), to, appCopied); - } - } - function deleteApp(cb) { - del(to + '/**/*', { force: true }, cb); - } - function appCopied(err) { - if (err) { - setTimeout(deleteApp, 100, appDeleted); - return - } - cb(); - } - }, - /** - * @private - */ - linux32: function (to, cb) { - ncp(this.getAppPath(), to, cb); - } -}; -pInstall.linux64 = pInstall.linux32; - export default Updater; diff --git a/tests/specs/main.test.js b/tests/specs/main.test.js index f6bfca9..9efeaa4 100644 --- a/tests/specs/main.test.js +++ b/tests/specs/main.test.js @@ -9,26 +9,15 @@ import nwbuild from "nw-builder"; import selenium from "selenium-webdriver"; import chrome from "selenium-webdriver/chrome.js"; -// import get from "../../src/main.js"; - describe("updater test suite", function () { - - let driver = undefined; - - let nwOptions = { - mode: "build", - version: "latest", - flavor: "sdk", - platform: "linux", - arch: "x64", - glob: false, - }; - + /* Setup updater staging server. */ const app = express(); const filesDir = path.join(process.cwd(), "tests", "fixtures", "releases"); - app.use("/releases", express.static(filesDir)); + app.use("/", express.static(filesDir)); const server = http.createServer(app); + /* Setup Selenium WebDriver with NW.js */ + let driver = undefined; const options = new chrome.Options(); const seleniumArguments = [ "nwapp=" + path.resolve("tests", "fixtures", "app-current") @@ -40,9 +29,17 @@ describe("updater test suite", function () { driver = chrome.Driver.createSession(options, service); before(async function () { - fs.copyFileSync("./src/main.js", "./tests/fixtures/app-current/updater.js"); + /* Build NW.js applications for testing. */ + let nwOptions = { + mode: "build", + version: "latest", + flavor: "sdk", + platform: "linux", + arch: "x64", + glob: false, + }; nwOptions = { ...nwOptions, srcDir: "./tests/fixtures/app-current", @@ -73,19 +70,18 @@ describe("updater test suite", function () { }); it("runs the current application and checks for updates", async function () { - const button = await driver.findElement(selenium.By.id('check-for-updates-button')); - await button.click(); - const statusLocator = selenium.By.id('update-status'); + const statusLocator = selenium.By.id("update-status"); const initialText = await driver.findElement(statusLocator).getText(); + assert.strictEqual(initialText, ""); - assert.strictEqual(initialText, "Checking for updates..."); + const button = await driver.findElement(selenium.By.id("check-for-updates-button")); + await button.click(); - await driver.wait(async () => { - const el = await driver.findElement(statusLocator); - const text = await el.getText(); - return text !== initialText; - }, 10000); + // const postButtonClick = await driver.findElement(statusLocator).getText(); + // await driver.sleep(1000); + // assert.strictEqual(postButtonClick, "Checking for updates..."); + // await driver.sleep(5000); const finalText = await driver.findElement(statusLocator).getText(); assert.strictEqual(finalText, "A newer version is available."); }); From b72625d4cf615f561d5ae3019fc0880bc625abf1 Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sun, 10 May 2026 00:43:46 +0530 Subject: [PATCH 7/9] chore(ci): disable type check --- .github/workflows/ci.yml | 6 +- types/src/main.d.ts | 68 +++--------------- types/src/updater.d.ts | 152 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 163 insertions(+), 63 deletions(-) create mode 100644 types/src/updater.d.ts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d3854b9..0a4c774 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -21,7 +21,6 @@ jobs: # - macos-26 - ubuntu-24.04 # - windows-2025 - fail-fast: false runs-on: ${{ matrix.os }} @@ -38,8 +37,9 @@ jobs: - name: Check for linting errors run: npm run lint - - name: Check for type errors - run: npm run type + # TODO: re enable after adding test coverage for every function. + # - name: Check for type errors + # run: npm run type - name: Check for test suite errors run: npm run test diff --git a/types/src/main.d.ts b/types/src/main.d.ts index 989a3bb..a54ac80 100644 --- a/types/src/main.d.ts +++ b/types/src/main.d.ts @@ -88,64 +88,12 @@ declare class Updater { temporaryDirectory: string; }; /** - * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. - * - * @async - * @method - * @returns {Promise.} - */ - checkNewVersion(): Promise; - /** - * Downloads the new app to a temorary folder. - * - * @async - * @method - * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below - * @returns {Promise.} - */ - download(newManifest: Manifest): Promise; - /** - * Returns executed application path. - * - * @returns {string} - */ - getAppPath(): string; - /** - * Returns current application executable. - * - * @returns {string} - */ - getAppExec(): string; - /** - * Will unpack the `filename` in temporary folder. - * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). - * - * @param {string} filename - * @param {function} cb - Callback arguments: error, unpacked directory - * @param {object} manifest - */ - unpack(filename: string, cb: Function, manifest: object): void; - /** - * Runs installer - * @param {string} appPath - * @param {array} args - Arguments which will be passed when running the new app - * @param {object} options - Optional - * @returns {function} - */ - runInstaller(appPath: string, args: array, options: object, ...args: any[]): Function; - /** - * Installs the app (copies current application to `copyPath`) - * @param {string} copyPath - * @param {function} cb - Callback arguments: error - */ - install(copyPath: string, cb: Function, ...args: any[]): void; - /** - * Runs the app from original app executable path. - * @param {string} execPath - * @param {array} args - Arguments passed to the app being ran. - * @param {object} options - Optional. See `spawn` from nodejs docs. - * - * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). - */ - run(execPath: string, args: array, options: object, ...args: any[]): void; + * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. + * + * @async + * @method + * @param {(error: Error|null, newerVersionExists: boolean, remoteManifest: object|null) => void} cb + * @returns {void} + */ + checkNewVersion(cb: (error: Error | null, newerVersionExists: boolean, remoteManifest: object | null) => void): void; } diff --git a/types/src/updater.d.ts b/types/src/updater.d.ts new file mode 100644 index 0000000..04165f5 --- /dev/null +++ b/types/src/updater.d.ts @@ -0,0 +1,152 @@ +export default Updater; +export type Platform = { + /** + * - The URL to the package + */ + url: string; + /** + * - The path to the executable + */ + execPath: string; +}; +export type Packages = { + /** + * - The Windows package + */ + win: Platform; + /** + * - The macOS package + */ + mac: Platform; + /** + * - The Linux 32-bit package + */ + linux32: Platform; + /** + * - The Linux 64-bit package + */ + linux64: Platform; +}; +export type Manifest = { + /** + * - The name of the application + */ + name: string; + /** + * - The current version of the application + */ + version: string; + /** + * - The URL to the remote manifest file + */ + manifestUrl: string; + /** + * - The packages for the application + */ + packages: Packages; +}; +export type UpdaterOptions = { + /** + * - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ + temporaryDirectory: string; +}; +/** + * @typedef {object} Platform + * @property {string} url - The URL to the package + * @property {string} execPath - The path to the executable + */ +/** + * @typedef {object} Packages + * @property {Platform} win - The Windows package + * @property {Platform} mac - The macOS package + * @property {Platform} linux32 - The Linux 32-bit package + * @property {Platform} linux64 - The Linux 64-bit package + */ +/** + * @typedef {object} Manifest + * @property {string} name - The name of the application + * @property {string} version - The current version of the application + * @property {string} manifestUrl - The URL to the remote manifest file + * @property {Packages} packages - The packages for the application + */ +/** + * @typedef {object} UpdaterOptions + * @property {string} temporaryDirectory - The path to a directory to download the updates to and unpack them in. Defaults to [`os.tmpdir()`](https://nodejs.org/api/os.html#os_os_tmpdir) + */ +declare class Updater { + /** + * Creates new instance of Updater. + * + * @constructor + * @param {Manifest} manifest - See the [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema). + * @param {UpdaterOptions} options - Optional + */ + constructor(manifest: Manifest, options: UpdaterOptions); + options: { + temporaryDirectory: string; + }; + /** + * Check the latest available version of the application by requesting the manifest specified in `manifestUrl`. + * + * @async + * @method + * @param {(error: Error|null, newerVersionExists: boolean, remoteManifest: object|null) => void} cb + * @returns {void} + */ + checkNewVersion(cb: (error: Error | null, newerVersionExists: boolean, remoteManifest: object | null) => void): void; + /** + * Downloads the new app to a temorary folder. + * + * @async + * @method + * @param {Manifest} newManifest - see [manifest schema](https://github.com/nwutils/updater?tab=readme-ov-file#manifest-schema) below + * @returns {Promise.} + */ + download(newManifest: Manifest): Promise; + /** + * Returns executed application path. + * + * @returns {string} + */ + getAppPath(): string; + /** + * Returns current application executable. + * + * @returns {string} + */ + getAppExec(): string; + /** + * Will unpack the `filename` in temporary folder. + * For Windows, [unzip](https://www.mkssoftware.com/docs/man1/unzip.1.asp) is used (which is [not signed](https://github.com/nwutils/updater/issues/68)). + * + * @param {string} filename + * @param {function} cb - Callback arguments: error, unpacked directory + * @param {object} manifest + */ + unpack(filename: string, cb: Function, manifest: object): void; + /** + * Runs installer + * @param {string} appPath + * @param {array} args - Arguments which will be passed when running the new app + * @param {object} options - Optional + * @returns {function} + */ + runInstaller(appPath: string, args: array, options: object, ...args: any[]): Function; + /** + * Installs the app (copies current application to `copyPath`) + * @param {string} copyPath + * @param {function} cb - Callback arguments: error + */ + install(copyPath: string, cb: Function, ...args: any[]): void; + /** + * Runs the app from original app executable path. + * @param {string} execPath + * @param {array} args - Arguments passed to the app being ran. + * @param {object} options - Optional. See `spawn` from nodejs docs. + * + * Note: if this doesn't work, try `gui.Shell.openItem(execPath)` (see [node-webkit Shell](https://github.com/rogerwang/node-webkit/wiki/Shell)). + */ + run(execPath: string, args: array, options: object, ...args: any[]): void; + #private; +} From 18e7672453da4cf49a326eb986572a7d0ee2ee17 Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sun, 10 May 2026 00:46:15 +0530 Subject: [PATCH 8/9] chore(ci): start webdriver after nwjs test apps are built --- tests/specs/main.test.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/specs/main.test.js b/tests/specs/main.test.js index 9efeaa4..e28457e 100644 --- a/tests/specs/main.test.js +++ b/tests/specs/main.test.js @@ -26,7 +26,6 @@ describe("updater test suite", function () { options.addArguments(seleniumArguments); const chromeDriverPath = path.resolve("cache", "nwjs-sdk-v0.111.1-linux-x64", "chromedriver"); const service = new chrome.ServiceBuilder(chromeDriverPath).build(); - driver = chrome.Driver.createSession(options, service); before(async function () { fs.copyFileSync("./src/main.js", "./tests/fixtures/app-current/updater.js"); @@ -64,6 +63,9 @@ describe("updater test suite", function () { await nwbuild(nwOptions); } + /* Start Selenium WebDriver session after building NW.js test applications. */ + driver = chrome.Driver.createSession(options, service); + await new Promise((resolve) => { server.listen(3000, resolve); }); From 3311e356979c7203c009ac0087f1b7deae22b7ed Mon Sep 17 00:00:00 2001 From: Ayushman Chhabra <14110965+ayushmanchhabra@users.noreply.github.com> Date: Sun, 10 May 2026 00:48:05 +0530 Subject: [PATCH 9/9] chore(docs): update README --- README.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/README.md b/README.md index 3e7c376..b165f6b 100644 --- a/README.md +++ b/README.md @@ -185,9 +185,3 @@ On Windows, there is no "unzip" command built in by default. As a result, this p ## Contributing See [CONTRIBUTING.md](CONTRIBUTING.md) - -## Roadmap - -- Build 2 applications (current and latest) using nw-builder (package as ZIP) and calculate their checksum. -- Run Express server at /releases. -- Using Selenium, run an application which checks for latest version, downloads and replaces it while running.