From 2a275fc5366a1b31b83da1f5f5e06f8ccc0a8e69 Mon Sep 17 00:00:00 2001 From: PageZ948 Date: Wed, 19 Aug 2026 12:14:29 +0000 Subject: [PATCH] feat: reconcile WebAVP desktop parity and releases --- README.md | 18 +- RELEASING.md | 49 + app.py | 73 +- build/icon.icns | Bin 0 -> 16502 bytes build/icon.ico | Bin 0 -> 4301 bytes build/icon.png | Bin 0 -> 3388 bytes build/icon.svg | 4 + build/icons/1024x1024.png | Bin 0 -> 9207 bytes build/icons/128x128.png | Bin 0 -> 966 bytes build/icons/16x16.png | Bin 0 -> 172 bytes build/icons/256x256.png | Bin 0 -> 1991 bytes build/icons/32x32.png | Bin 0 -> 266 bytes build/icons/48x48.png | Bin 0 -> 356 bytes build/icons/512x512.png | Bin 0 -> 3388 bytes build/icons/64x64.png | Bin 0 -> 448 bytes electron/main.js | 210 ++- electron/preload.js | 6 + package-lock.json | 2696 +++++++++++++++++------------------- package.json | 32 +- scripts/check.js | 70 + scripts/smoke.js | 32 + static/webavp-utils.js | 140 ++ templates/index.html | 174 ++- tests/app_server_test.py | 26 + tests/browser-smoke.js | 79 ++ tests/webavp-utils.test.js | 54 + 26 files changed, 2155 insertions(+), 1508 deletions(-) create mode 100644 RELEASING.md create mode 100644 build/icon.icns create mode 100644 build/icon.ico create mode 100644 build/icon.png create mode 100644 build/icon.svg create mode 100644 build/icons/1024x1024.png create mode 100644 build/icons/128x128.png create mode 100644 build/icons/16x16.png create mode 100644 build/icons/256x256.png create mode 100644 build/icons/32x32.png create mode 100644 build/icons/48x48.png create mode 100644 build/icons/512x512.png create mode 100644 build/icons/64x64.png create mode 100644 scripts/check.js create mode 100644 scripts/smoke.js create mode 100644 static/webavp-utils.js create mode 100644 tests/app_server_test.py create mode 100644 tests/browser-smoke.js create mode 100644 tests/webavp-utils.test.js diff --git a/README.md b/README.md index 9e986e6..2b0ecbb 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ The app can run in two modes: - Import AES-encrypted ZIP exports with an in-app password prompt - Synchronize multiple camera segments on a shared timeline - Scrub, zoom, pan, change playback speed, and frame-step footage -- Reorder, hide/show, expand, and manually lay out camera tiles +- Reorder, hide/show, expand, and automatically or manually lay out up to 16 camera tiles (4x4) - Use region zoom and scroll zoom tools - Verify signed exports offline and optionally confirm certificates with Alta's cloud verification endpoint - Preserve sessions across refreshes with IndexedDB @@ -23,12 +23,14 @@ npm install npm start ``` -The Electron shell loads the existing UI through the custom `webavp://app/` protocol, so local assets are served from the packaged app instead of brittle `file://` paths. Certificate verification is bridged through Electron IPC (`window.webavpNative.verifyCertificateOnline`) and performed in the main process. +The Electron shell loads the same player template used by web mode through the custom `webavp://app/` protocol. Certificate verification and GitPeji update checks are bridged through narrowly scoped Electron IPC. **Check for Updates** compares semantic versions and opens the matching public GitPeji release asset in the system browser; installation remains an explicit user action. Packaging scripts are included: ```bash -npm run dist +npm run dist:linux # Linux x64 AppImage + deb +npm run dist:mac # macOS x64 + arm64 dmg (run on macOS) +npm run dist:win # Windows x64 NSIS installer (run on Windows) ``` `electron-builder` is configured for Linux AppImage/deb, macOS dmg, and Windows nsis. Cross-platform packaging still needs to be run on the target OS/build host. @@ -37,16 +39,18 @@ npm run dist ```bash python3 app.py -# http://0.0.0.0:5152 +# http://127.0.0.1:5152 ``` -The Python stdlib server serves `/`, `/static/*`, and `/api/verify-cert`. There are no Python package dependencies. +The Python stdlib server serves `/`, `/static/*`, and `/api/verify-cert`. It binds to `127.0.0.1` by default; set `WEBAVP_HOST=0.0.0.0` only for deliberate trusted-LAN sharing. Web mode shows **Download Desktop App**, selecting the latest compatible public GitPeji release asset when available and otherwise opening the releases page. ## Checks ```bash npm run check -xvfb-run -a npm run smoke +npm run smoke # Electron on a desktop session +npm run smoke:headless # Electron under xvfb on headless Linux +WEBAVP_SMOKE_WEB_URL=http://127.0.0.1:5152/ npm run smoke:web ``` -`check` runs Electron main/preload syntax checks and `py_compile` for the Python server. `smoke` starts Electron, waits for `webavp://app/index.html` to finish loading, then exits automatically. On a desktop session, `npm run smoke` is enough; on headless Linux, use `xvfb-run -a npm run smoke`. +`check` runs syntax, focused layout/release regressions, Python server tests, and source invariants. The smoke commands exercise the shared template in both Electron and served web modes. See `RELEASING.md` for the GitPeji publishing and asset contract. diff --git a/RELEASING.md b/RELEASING.md new file mode 100644 index 0000000..dc2f7d5 --- /dev/null +++ b/RELEASING.md @@ -0,0 +1,49 @@ +# Publishing WebAVP releases on GitPeji + +WebAVP uses GitPeji only. Both the Electron updater and web download control query the public Gitea-compatible endpoint: + +`https://git.pejicorp.com/api/v1/repos/peji/WebAVP/releases/latest` + +The repository and release must remain publicly readable; the app does not embed credentials. + +## Release gate + +1. Update `version` in both `package.json` and `package-lock.json` using semantic versioning. +2. Run `npm ci`, `npm run check`, the served web smoke, and the Electron smoke. +3. Build on each target operating system: + - Linux x64: `npm run dist:linux` + - macOS x64/arm64: `npm run dist:mac` + - Windows x64: `npm run dist:win` +4. Open each produced installer/app on its target OS and perform the manual import/playback/timeline/zoom/layout/verification checklist. +5. Obtain code-signing/notarization approval before calling macOS or Windows artifacts production-ready. Unsigned test artifacts must be labelled clearly. +6. Review the exact diff and test evidence before committing, pushing, tagging, or publishing. + +## Asset contract + +`electron-builder` emits `${productName}-${version}-${os}-${arch}.${ext}`. Keep the generated names; platform and architecture tokens are how clients select a safe asset. + +Expected examples: + +- `Alta Video Player-1.2.3-linux-x86_64.AppImage` +- `Alta Video Player-1.2.3-linux-amd64.deb` +- `Alta Video Player-1.2.3-mac-x64.dmg` +- `Alta Video Player-1.2.3-mac-arm64.dmg` +- `Alta Video Player-1.2.3-win-x64.exe` + +Linux prefers AppImage when both AppImage and deb exist. Clients deliberately fall back to the releases page instead of guessing when the current platform/architecture has no matching asset. + +## Publish after approval + +1. Commit the reviewed version and release notes to GitPeji `main`. +2. Create and push a matching tag such as `v1.2.3` to GitPeji. +3. In GitPeji, create a release from that tag. It must be published (not a draft) and public. +4. Upload every native artifact produced and validated above. Do not rename away OS or architecture tokens. +5. Publish the release, then verify: + - the latest-release API returns HTTP 200 and the expected `tag_name`; + - each `browser_download_url` returns the intended binary, not HTML; + - Electron reports current/available state correctly; + - web mode selects the current browser platform or falls back to the release page. + +## Update behaviour + +Electron performs a bounded HTTPS metadata request in the main process, validates all returned URLs against `git.pejicorp.com/peji/WebAVP/releases/download/`, compares semantic versions, and asks the system browser to download the selected artifact. It does not silently install, execute, or overwrite software. The user must close WebAVP and run the installer explicitly. diff --git a/app.py b/app.py index b618977..5be67bf 100644 --- a/app.py +++ b/app.py @@ -7,9 +7,14 @@ import os from http.server import HTTPServer, SimpleHTTPRequestHandler from urllib.parse import parse_qs, urlencode, urlparse from urllib.request import urlopen -from urllib.error import URLError +from urllib.error import HTTPError, URLError -PORT = 5152 +# Loopback is the safe default for a local footage player. Set WEBAVP_HOST +# explicitly only when sharing on a trusted network. +HOST = os.environ.get("WEBAVP_HOST", "127.0.0.1") +PORT = int(os.environ.get("WEBAVP_PORT", "5152")) +LATEST_RELEASE_URL = "https://git.pejicorp.com/api/v1/repos/peji/WebAVP/releases/latest" +MAX_RELEASE_RESPONSE_BYTES = 1024 * 1024 BASE_DIR = os.path.dirname(os.path.abspath(__file__)) STATIC_DIR = os.path.join(BASE_DIR, "static") TEMPLATES_DIR = os.path.join(BASE_DIR, "templates") @@ -25,13 +30,17 @@ class Handler(SimpleHTTPRequestHandler): elif path.startswith("/static/"): rel = path[len("/static/"):] file_path = os.path.join(STATIC_DIR, rel) - if not os.path.realpath(file_path).startswith(os.path.realpath(STATIC_DIR)): + static_root = os.path.realpath(STATIC_DIR) + requested_path = os.path.realpath(file_path) + if requested_path != static_root and not requested_path.startswith(static_root + os.sep): self.send_error(403) return mime = mimetypes.guess_type(file_path)[0] or "application/octet-stream" self._serve_file(file_path, mime) elif path == "/api/verify-cert": self._proxy_verify(parsed.query) + elif path == "/api/latest-release": + self._proxy_latest_release() else: self.send_error(404) @@ -60,17 +69,63 @@ class Handler(SimpleHTTPRequestHandler): qs = urlencode({"serial": serial, "certificateHash": cert_hash}) url = f"https://aware.avasecurity.com/api/v1/public/verifyServerCertificate?{qs}" resp = urlopen(url, timeout=10) - if 200 <= resp.status < 300: - self._json_response(200, {"verified": True}) - else: + body = resp.read() + if not 200 <= resp.status < 300: self._json_response(200, {"verified": False, "error": f"HTTP {resp.status}"}) + elif self._interpret_verify_body(body) is False: + self._json_response(200, {"verified": False, "error": "Certificate not recognized by Alta/Ava"}) + else: + self._json_response(200, {"verified": True}) + except HTTPError as e: + self._json_response(200, {"verified": False, "error": f"HTTP {e.code}"}) except URLError as e: self._json_response(200, {"verified": False, "error": str(e)}) + def _proxy_latest_release(self): + """Same-origin, credential-free proxy for the public GitPeji release.""" + try: + response = urlopen(LATEST_RELEASE_URL, timeout=10) + body = response.read(MAX_RELEASE_RESPONSE_BYTES + 1) + if len(body) > MAX_RELEASE_RESPONSE_BYTES: + self._json_response(502, {"error": "GitPeji release response exceeded size limit"}) + return + self._raw_response(response.status, body, "application/json; charset=utf-8") + except HTTPError as e: + body = e.read(MAX_RELEASE_RESPONSE_BYTES + 1) + if len(body) > MAX_RELEASE_RESPONSE_BYTES: + body = b'{"error":"GitPeji release response exceeded size limit"}' + self._raw_response(e.code, body, "application/json; charset=utf-8") + except URLError as e: + self._json_response(502, {"error": str(e)}) + + @staticmethod + def _interpret_verify_body(body): + """Return an explicit upstream result, or None for unknown schemas.""" + text = body.decode("utf-8", "replace").strip() if body else "" + if not text: + return None + lowered = text.lower() + if lowered in ("true", "false"): + return lowered == "true" + try: + data = json.loads(text) + except (ValueError, TypeError): + return None + if isinstance(data, bool): + return data + if isinstance(data, dict): + for field in ("verified", "valid", "isValid", "success", "result"): + if isinstance(data.get(field), bool): + return data[field] + return None + def _json_response(self, status, data): body = json.dumps(data).encode() + self._raw_response(status, body, "application/json") + + def _raw_response(self, status, body, content_type): self.send_response(status) - self.send_header("Content-Type", "application/json") + self.send_header("Content-Type", content_type) self.send_header("Content-Length", len(body)) self.end_headers() self.wfile.write(body) @@ -80,6 +135,6 @@ class Handler(SimpleHTTPRequestHandler): if __name__ == "__main__": - server = HTTPServer(("0.0.0.0", PORT), Handler) - print(f"Alta Video Player running on http://0.0.0.0:{PORT}") + server = HTTPServer((HOST, PORT), Handler) + print(f"Alta Video Player running on http://{HOST}:{PORT}") server.serve_forever() diff --git a/build/icon.icns b/build/icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..ecd75e949f02abacf31f5126249b0b568ea5fb24 GIT binary patch literal 16502 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 j&6krIJGRDuFB3K28}P^1f7=_rOK5tV99 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 RhVkseoLTv~C!cq2{Wlvzw*deE literal 0 HcmV?d00001 diff --git a/build/icon.svg b/build/icon.svg new file mode 100644 index 0000000..df4f323 --- /dev/null +++ b/build/icon.svg @@ -0,0 +1,4 @@ + + + + diff --git a/build/icons/1024x1024.png b/build/icons/1024x1024.png new file mode 100644 index 0000000000000000000000000000000000000000..13526953b1def6c13c8a65d2aae3b2cc4af3ed1a GIT binary patch literal 9207 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 CY)X*; literal 0 HcmV?d00001 diff --git a/build/icons/128x128.png b/build/icons/128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..f152264285c24436549fc39bf31b2d2071ddb168 GIT binary patch literal 966 zcmV;%13CPOP)-U!j_i%6ZR*p ziOj&d?!9DVvYDCp8F-5ew^+`3X6BulGZSMbXva72q^*ipb*rY;veg>(*3!nUwsB02 z@2&ljx&6T_5;%!gHomz}Nl#jp^zd0mh%WBQoXIcg?Ou!u<)IUw(c`@w5wb%hzarRP ztD17IZwPP@YDV=2Hu(zz8f6ZtoJTcvZ6GV`-Ss`xyn8`|$$*7IP3B9p&2q)C5IJ^)>*QKQS}7UBF3D z^prXP3W6c2g83gGz^R}7DIx2B@%;b-p(_9Y000000s#OB01yBm06+i`s*>A}NUAab zXWsu@UwZP1#Hs>dKK%Nlb8o({uibk=f>i-V5E08j;B(M__9RPs1 zNd$nA)KwvcXc7TnWQA6R1OOA6#89e`06^R%0>A-GqR$6R0B}H)=;Pi20EnAJ0GMf7 z@Wmtoz>M;t3JCzjO(FmQ001xr001Ts09XbB02@I7z*aB-a2Nyt90vmc1t9=HNf-c7 z6bb;8g#!Q=LjZuQVO$R7awylsxgO2~5dgpwF#y0LQ2@X*aR9(WkpRF`u>cSt06Z2g z3INZ=3j@FhBSZnN-!jq8rRxCRs=*!E3?_~0iyH&1^_uhky389 z8~Xub>;D}9lmtgYi>j%P++sYzFh3R^Gy|b9Zw`L1X3;Tl` oMu?f?J)07*qoM6N<$f=K_6wEzGB literal 0 HcmV?d00001 diff --git a/build/icons/16x16.png b/build/icons/16x16.png new file mode 100644 index 0000000000000000000000000000000000000000..4884bdb2b114052654dc43ea450e1c4030b33537 GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`#hxyXAr-fh6Bw8jIkz$>?BhT3 zzw>}XDI<>o!_`0Yd1M%jAK1-gyVEZDVSY@{bq2Y|H~u$mYI`DmKxpGH``}Lp|JPJG z0(le4WqWQmi6@luUSw-9NPaf+e@xj?<`jmTaSJpAJUiXGf|XJ$8z0^A&}3j}`=dWy Ub?4{RKYgAKL7T)(JAr~PMup{zo1Wb5nWT{kU)S|p%QK6NRRD_@ixe^rc z1y(ycHsPTiTOZV{)yQK&6F^0+La11IlLQ9Pf*|i#U{0`IGxKA5|D1Ea{q67U@0@*Z z_O@UFV}bnw0AK`d3j7NIhNc)0W@rdM_}zX0`q`jBzwOD*{cXNCo%bz$sDDd~+F5_; z$wq=W^;KY;%U<))*!TS$9NrgRJwq+N*s%8ct(?0X*0l)THYs*pm6ymB zT~D8;GQx#yB4L$!%k1#e=#WDrcK4>m+b>^O{EvN~Ml@Y0)+(R1$HeVQeUp^04$*TT z)1spK4mfSx9UCF2e9_$MHB+G)(qED7e9`lASruk$ELi=aVjAk5dtUS$(XCWZwanf+ zq_6hRiP)Z>AfctGe=%O;B<}b4LN8-(`6+(XsMo8fjL!>>1RA{7hx436NBXOrzJ6U@ z`4Qt`YUxDJ>?Lu`up6(ggrr~IwQY58v#WY^Lfe-@bh?Gl{8hG|+f0g^yH82GbEpEZ zgtsz6)omzI(%fCfm=cOFR)V{q#R(VA0L~(x4thO!@ zqm<9^zyJH1Io&d>n&)9Ta*x;Ou8HR{qZ4<4d?_J(iGNi!Vlwa4;O2utx3@W=u2#zPU{kFXx+@g$hjge-qN- zuCcPG91Z`C+4-(`4=`5pybx7$oC9h21X8xc zk#(JC0jhT~j%*A6s6^8fN0FE0Wud4Y9MTDdKH{KixB8h(xRxTqYz@ogb_iwYqzhM~ zAUhwybgRjVQfI)K$>npp`sjRfbPf004qHwldw5ie?EN+@)9XgJEsv9##fp&MljiPzr7zm=jsUW?5m~ zW@#IZ6iFqRuBBrUmZg~K7!1_>6MDN7=0e_9)M)p!wHr=dxnAv!Yp<@ElMtH5pyRc6 zwp*RXEXalGfsSp|K6`5aot0+~Zx>m_%VT2|&x+c|4#Ya@>RGB^&UKV>UxduoTnk>O zdZ^-#da6>Gs>)lXw*#oG5ySXBIFzhVdt-yo+;N>jH1diRWQgU0)aO_F1$TlqpRi+- z&efInJ_#wZQ^ncYhqkAD`G+*Yf@8K>1!vsHul27{?>UwdMNqevMnd?2M}Vt_n6fFlC^fcW8%*xQ<89= z$8ZDb7(5!INX?VxNN5QbCwm9+yfV@B{vMjepD4R$zE0CijGqoLUw`0olc#A;A(npO nn`T@R_OordC^@sbzNypcM^&L~LBr%HfWDv&!GYiV3)BA%z}P1d literal 0 HcmV?d00001 diff --git a/build/icons/32x32.png b/build/icons/32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..e8c2226eeb629aec7177e6d9a2e88676150e2881 GIT binary patch literal 266 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=ffJi=HlyAr-fh6C9YFgtC|%?l2sA z-uS~_^ke0UolHDC7y^tKJMIVHOe*0qvS*zB^#98a;S0@wZRg5Ffc^2F3Tk>W`f2R@`2=Yak z$!uuKaOi%-xVDFFkJU2Q=9B}sTbS=@$=#?s*zmoF&Gmjkz?VLDpkFx-aI>pT)n);D Oj=|H_&t;ucLK6T57iA#; literal 0 HcmV?d00001 diff --git a/build/icons/48x48.png b/build/icons/48x48.png new file mode 100644 index 0000000000000000000000000000000000000000..db1e242668bab410cebf849745d34fe705ffa249 GIT binary patch literal 356 zcmV-q0h|7bP)QABgt@@&5t9`=Rz5FpvU(8WaZ5(fB;0K#b!9fcX6&b36=#+!a8`@&AVa z4#1Uc-VYHEyvImRgD}k#%oFIP&Ho{Y4PYMVAEF-UAF9a*H5m<2$Aj^x2Szrh4P!GUjgVVWg=z4(COg?Bl0K@El zQ%TC?qaGOXNoYuC;vrj%4(W<)$TlU0Y-4UnH>Zbehh|83DTj2Yeso-DBzs`Uk4_Ky z`GKK5Lo?*($cDu%<&d8z9u_n8!(y$(uvo1!)Bpg6z>=NvRq1p90000!4y|CRAbf5;4(;Xw_7Fq;7Q5(O|l39*R-e zgPKaGh*MjswpP*9N5-kbv?gWYAZgC*+=T!F-U?te;3Zh}SufVbIk`EDi~iBxd}im+ zS4Pp+_}R0Kqkl-oJX@YC=Pu5Pza5;JJbBxjpHBXGP4bAs4QD>RT%7h*g1va(O6T28 zmsZdJ)t`R*R#Et;_0LSsBF*LKHwip(X#!X+G?U<6p z1|Jg+ym{%!RBvrDy|kD;pt4tXP_sL$o0x?P*#Xb9nr4~4meaV+3S;~!A<@5#Ee*DI zoHem|GugFwqONGHN(d~>6Hh-7ovHq!J2IQbYFbUym5}*D4C;os%Ok`+-k;JV`d?yG z@5yWrZNq7!+h>98eq;eaw&?E!b1UTv^Ku3j{G zz)U<6RWE?M^i-J8Q}Vlc zgv8PoL=Iy&9k5p@3d^tv5MkcW@2Ov_OUJ-o00qx^du5o{FaY>h4>(6&S)u}4BJ5O2 z)s`f`DAA_xSD~yipQNiqagV$r%TQAYZCLuTn4*eGAeG4mEYWRNmC)>cw^Wg4^LclY z4WMcyoJalB1~b5wL0}yMpPeLI6fh_DQ5XT%7^q2x*KdG51rWwsL>6^`6aonVr)@*P zJ`9exlWqkRJjt6)^dog@SOMGWzu^4eW+_BF>9~~Q^oF5e9|XsXhhLEie*pT*$YsM> zgd(Maci%ik`I`R~{E&wp+k8LPX0j(Lpj^0PTA6?COV_a_2kU#YQ1nB{d?pF=NTNS0 z$t+Ny1+f2?>amYQbUNgTh`9lV$%z(fESg0CH|w6n(HJTj+li@pn)G-L zP)G&5)Th^ zw+;YE2$G;q&}XP7U#MUHXw_`?jNwhcc-gm>8!ZnfYbz=vyt}M!0EVu2aIS)TGr5W@ zs;OKwJtBDwz?OTxJ2<4^p2#6>B|LM+UG4wG73H@5Gqj5nIrz}oybF+@E88IJbl^G; zv8URQ?Y465^U;=G-s0*nWPPZuyJ*s#Ye#Okm5bt=ii^%Ic`^V^I_?-zJ0-LY#cUW~ zBU$d?B;EPi<*@*L$}PPE#2y2r_bk-{W9xX1^d5pvu`}EV0=ZM39tg&kG(ag15HO%u zdV4g05lkg|>&nCUe4Qn9gyCYe{fU=fbMyt_A{rtZsi; zJs+j~&s^&dRyi$yw_z-00`3V0I;6)#`dYoJHFgzoHltx*g;_AOu)AH z7in=E`?>*W`KIYss{yvx3lnr7HBgN&q&;y8S`(No!V##J0cye?UI4(pWCKjNr6%IN zffnNLPBjkT&mwyk;MeC>#NewT6<}2xU(${r763;&)yuHAxB#k0-G95i^Hrj(iKsTH zuup@g(`{Y@=RDr5eq;c8yW59EQlom3fNgqgBd$K%>HQu+t}hmyV1{+qv$8`428ptJ z2T|R)OPwSN%DSG*!vH>asYkI{Tf()2jBx0mj+OEFL9|58BfxHQip9RzJY? z3zkOS8V=BT)q4U_6|q<1Kye2WC;@+K$8>=5=q!Mu z?q2`|0#EVc6aitr=Okc9wZ-ZixhxA%_Z`S+*|>jHzAO>e zZs~5hmzD$m(vHlVyM$Na57wZitKxpxe%2h%ES9^by4sDS8`qC+T-v)uK5xu^Is5hR RhVkseoLTv~C!cq2{Wlvzw*deE literal 0 HcmV?d00001 diff --git a/build/icons/64x64.png b/build/icons/64x64.png new file mode 100644 index 0000000000000000000000000000000000000000..5242ea7643f8cb3eefd12717e830d50035a0e218 GIT binary patch literal 448 zcmV;x0YCnUP)48 zorD;d1zFtLy?2t^ZswiL+<80mp66{bt{QEnwa|Lk3bn*Rh0*-XJe8Nm&>!-(0!IT* zl9{*v*T7p5O(}p(9Iah~R}L@peYS_%Hh3wpRMN5!3l1QR-3|rX^NF4i=k@|5|0jR| z3_yTne47n1%A61ZEYQsFcQXVy`eKhn3qVjs00ck){{x_QKfwmzy?n{>U@7(M2V4MF zmB+bUHg9nO7#)p2 { - const req = https.get(url, (res) => { - res.resume(); // drain so the socket is released - resolve(res.statusCode); + const req = https.get(url, { + headers: { + Accept: 'application/json, text/plain;q=0.9, */*;q=0.8', + 'User-Agent': `WebAVP/${app.getVersion()}`, + }, + }, (res) => { + const chunks = []; + let total = 0; + res.on('data', (chunk) => { + total += chunk.length; + if (total > MAX_RESPONSE_BYTES) { + req.destroy(new Error('Response exceeded size limit')); + return; + } + chunks.push(chunk); + }); + res.on('end', () => resolve({ + status: res.statusCode || 0, + body: Buffer.concat(chunks).toString('utf8'), + })); }); req.on('error', reject); req.setTimeout(timeoutMs, () => { @@ -111,28 +171,105 @@ function httpsGetStatus(url, timeoutMs = 10000) { }); } -async function verifyCertificateOnline(_event, { serial, certificateHash } = {}) { - if (!serial || !certificateHash) { +function interpretVerifyBody(body) { + const text = String(body || '').trim(); + if (!text) return null; + const lowered = text.toLowerCase(); + if (lowered === 'true' || lowered === 'false') return lowered === 'true'; + try { + const data = JSON.parse(text); + if (typeof data === 'boolean') return data; + if (data && typeof data === 'object') { + for (const field of ['verified', 'valid', 'isValid', 'success', 'result']) { + if (typeof data[field] === 'boolean') return data[field]; + } + } + } catch { + return null; + } + return null; +} + +async function verifyCertificateOnline(event, { serial, certificateHash } = {}) { + if (!isAuthorizedRenderer(event)) { + return { verified: false, error: 'Unauthorized certificate verification request' }; + } + const serialValue = typeof serial === 'string' ? serial.trim() : ''; + const hashValue = typeof certificateHash === 'string' ? certificateHash.trim() : ''; + if (!serialValue || !hashValue) { return { verified: false, error: 'Missing parameters' }; } + if (serialValue.length > MAX_SERIAL_LENGTH || hashValue.length > MAX_CERT_HASH_LENGTH) { + return { verified: false, error: 'Invalid parameter length' }; + } const params = new URLSearchParams({ - serial: String(serial).toLowerCase(), - certificateHash: String(certificateHash), + serial: serialValue.toLowerCase(), + certificateHash: hashValue, }); const url = `https://aware.avasecurity.com/api/v1/public/verifyServerCertificate?${params.toString()}`; try { - const status = await httpsGetStatus(url); - if (status >= 200 && status < 300) { - return { verified: true }; + const response = await httpsGetResponse(url); + if (response.status < 200 || response.status >= 300) { + return { verified: false, error: `HTTP ${response.status}` }; } - return { verified: false, error: `HTTP ${status}` }; + if (interpretVerifyBody(response.body) === false) { + return { verified: false, error: 'Certificate not recognized by Alta/Ava' }; + } + return { verified: true }; } catch (err) { return { verified: false, error: err.message || 'Certificate verification request failed' }; } } +async function checkForUpdates(event) { + if (!isAuthorizedRenderer(event)) return { status: 'error', message: 'Unauthorized update request' }; + const currentVersion = app.getVersion(); + try { + const response = await httpsGetResponse(LATEST_RELEASE_API); + if (response.status === 404) return { status: 'error', message: 'No public GitPeji release is published yet.' }; + if (response.status < 200 || response.status >= 300) { + return { status: 'error', message: `GitPeji release check failed (HTTP ${response.status}).` }; + } + const release = normalizeRelease(JSON.parse(response.body)); + const update = evaluateUpdate(release, currentVersion, process.platform, process.arch); + if (update.status === 'current') { + return { status: 'current', currentVersion, releaseVersion: release.version, pageUrl: release.pageUrl }; + } + if (update.status === 'unavailable-platform') { + return { + status: 'unavailable-platform', + currentVersion, + releaseVersion: release.version, + pageUrl: release.pageUrl, + message: `Version ${release.version} is available, but no ${process.platform}/${process.arch} installer was published.`, + }; + } + return { + status: 'available', + currentVersion, + releaseVersion: release.version, + pageUrl: release.pageUrl, + asset: update.asset, + }; + } catch (err) { + return { status: 'error', message: err.message || 'GitPeji release check failed.' }; + } +} + +async function downloadUpdate(event, { url } = {}) { + if (!isAuthorizedRenderer(event) || !isGitPejiReleaseAssetUrl(url)) { + return { opened: false, error: 'Invalid update download request' }; + } + try { + await shell.openExternal(url); + return { opened: true }; + } catch (err) { + return { opened: false, error: err.message || 'Could not open the update download' }; + } +} + function createWindow() { const win = new BrowserWindow({ width: 1440, @@ -141,26 +278,50 @@ function createWindow() { minHeight: 720, backgroundColor: '#121826', title: 'Alta Video Player', + icon: APP_ICON, webPreferences: { preload: path.join(__dirname, 'preload.js'), contextIsolation: true, nodeIntegration: false, sandbox: true, + webviewTag: false, + navigateOnDragDrop: false, }, }); + win.webContents.on('will-navigate', (event, url) => { + if (!isAppUrl(url)) { + event.preventDefault(); + console.warn('[WebAVP] Blocked navigation to:', url); + } + }); + + win.webContents.setWindowOpenHandler(({ url }) => { + if (isSafeExternalUrl(url)) { + shell.openExternal(url).catch((err) => console.warn('[WebAVP] Failed to open external URL:', err.message || err)); + } else { + console.warn('[WebAVP] Blocked external URL:', url); + } + return { action: 'deny' }; + }); + + win.webContents.session.setPermissionRequestHandler((_webContents, _permission, callback) => callback(false)); + win.loadURL(`${APP_SCHEME}://app/index.html`); if (process.env.WEBAVP_SMOKE_QUIT_AFTER_MS) { const quitAfterMs = Number(process.env.WEBAVP_SMOKE_QUIT_AFTER_MS); win.webContents.once('did-finish-load', async () => { try { - const result = await win.webContents.executeJavaScript(`({ + const result = await win.webContents.executeJavaScript(`(async () => ({ title: document.title, hasJsZip: typeof window.JSZip === 'function', - hasNativeBridge: !!window.webavpNative?.verifyCertificateOnline - })`); - if (result.title !== 'Alta Video Player' || !result.hasJsZip || !result.hasNativeBridge) { + hasNativeBridge: !!window.webavpNative?.verifyCertificateOnline, + hasUpdateBridge: !!window.webavpNative?.checkForUpdates, + hasFourByFourLayout: !!document.querySelector('[data-layout="4x4"]'), + bridgeResult: await window.webavpNative?.verifyCertificateOnline?.({ serial: '', certificateHash: '' }) + }))()`); + if (result.title !== 'Alta Video Player' || !result.hasJsZip || !result.hasNativeBridge || !result.hasUpdateBridge || !result.hasFourByFourLayout || result.bridgeResult?.error !== 'Missing parameters') { console.error('[WebAVP] Electron smoke checks failed:', JSON.stringify(result)); app.exit(1); return; @@ -178,17 +339,14 @@ function createWindow() { }); } - win.webContents.setWindowOpenHandler(({ url }) => { - shell.openExternal(url); - return { action: 'deny' }; - }); - return win; } app.whenReady().then(() => { registerAppProtocol(); ipcMain.handle('certificate:verify-online', verifyCertificateOnline); + ipcMain.handle('release:check-update', checkForUpdates); + ipcMain.handle('release:download-update', downloadUpdate); createWindow(); app.on('activate', () => { diff --git a/electron/preload.js b/electron/preload.js index a168852..69b486c 100644 --- a/electron/preload.js +++ b/electron/preload.js @@ -5,4 +5,10 @@ contextBridge.exposeInMainWorld('webavpNative', { verifyCertificateOnline({ serial, certificateHash }) { return ipcRenderer.invoke('certificate:verify-online', { serial, certificateHash }); }, + checkForUpdates() { + return ipcRenderer.invoke('release:check-update'); + }, + downloadUpdate(url) { + return ipcRenderer.invoke('release:download-update', { url }); + }, }); diff --git a/package-lock.json b/package-lock.json index a1f1cd2..7067e41 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,26 +8,18 @@ "name": "webavp-desktop", "version": "0.1.0", "devDependencies": { - "electron": "^31.7.7", - "electron-builder": "^24.13.3" + "electron": "^43.4.1", + "electron-builder": "^26.15.3" } }, - "node_modules/@develar/schema-utils": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@develar/schema-utils/-/schema-utils-2.6.5.tgz", - "integrity": "sha512-0cp4PsWQ/9avqTVMCtZ+GirikIA36ikvjtHweU4/j8yLtgObI0+JUPhYFScgwlteveGB1rt3Cm8UhN04XayDig==", + "node_modules/@electron-internal/extract-zip": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@electron-internal/extract-zip/-/extract-zip-1.0.5.tgz", + "integrity": "sha512-+bqFCP98pLI0Tt0XQo1TmlXtwjWchISndDOxCkEcIuUgXWpBnLyRI+2DU+mesvnMMX6L1XDqYNA0lXNDHd/yiA==", "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.0", - "ajv-keywords": "^3.4.1" - }, + "license": "BSD-2-Clause", "engines": { - "node": ">= 8.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "node": ">=22.12.0" } }, "node_modules/@electron/asar": { @@ -48,10 +40,17 @@ "node": ">=10.12.0" } }, + "node_modules/@electron/asar/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/@electron/asar/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -72,32 +71,109 @@ "node": "*" } }, + "node_modules/@electron/fuses": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@electron/fuses/-/fuses-1.8.0.tgz", + "integrity": "sha512-zx0EIq78WlY/lBb1uXlziZmDZI4ubcCXIMJ4uGjXzZW0nS19TjSPeXPAjzzTmKQlJUZm0SbmZhPKP7tuQ1SsEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.1", + "fs-extra": "^9.0.1", + "minimist": "^1.2.5" + }, + "bin": { + "electron-fuses": "dist/bin.js" + } + }, + "node_modules/@electron/fuses/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@electron/fuses/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/fuses/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/@electron/get": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@electron/get/-/get-2.0.3.tgz", - "integrity": "sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-5.1.0.tgz", + "integrity": "sha512-3kSBtG8ObcTVfXanm5vVJ6UnBLEVmVsRk1M+vGqCuMBV+XLCbJYuWQful+yIy0GQDsSlK0kHEriEHn7SPk4EnA==", "dev": true, "license": "MIT", "dependencies": { "debug": "^4.1.1", - "env-paths": "^2.2.0", - "fs-extra": "^8.1.0", - "got": "^11.8.5", + "env-paths": "^3.0.0", + "graceful-fs": "^4.2.11", "progress": "^2.0.3", - "semver": "^6.2.0", + "semver": "^7.6.3", "sumchecker": "^3.0.1" }, "engines": { - "node": ">=12" + "node": ">=22.12.0" }, "optionalDependencies": { - "global-agent": "^3.0.0" + "undici": "^7.24.4" + } + }, + "node_modules/@electron/get/node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@electron/get/node_modules/undici": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.29.0.tgz", + "integrity": "sha512-IDxfleLmmbSskfWSUATiN1nfn2rDuvnMOqb5CWR92iIfojA0Ud+ulOAAEQ57LPr9rWmsreUyf5lwyao+7GNNVw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=20.18.1" } }, "node_modules/@electron/notarize": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.2.1.tgz", - "integrity": "sha512-aL+bFMIkpR0cmmj5Zgy0LMKEpgy43/hw5zadEArgmAMWWlKc5buwFvFT9G/o/YJkvXAJm5q3iuTuLaiaXW39sg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@electron/notarize/-/notarize-2.5.0.tgz", + "integrity": "sha512-jNT8nwH1f9X5GEITXaQ8IF/KdskvIkOFfB2CvwumsveVidzpSc+mvhhTMdAGSYF3O+Nq49lJ7y+ssODRXu06+A==", "dev": true, "license": "MIT", "dependencies": { @@ -149,9 +225,9 @@ } }, "node_modules/@electron/osx-sign": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.0.5.tgz", - "integrity": "sha512-k9ZzUQtamSoweGQDV2jILiRIHUu7lYlJ3c6IEmjv1hC17rclE+eb9U+f6UFlOOETo0JzY1HNlXy4YOlCvl+Lww==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@electron/osx-sign/-/osx-sign-1.3.3.tgz", + "integrity": "sha512-KZ8mhXvWv2rIEgMbWZ4y33bDHyUKMXnx4M0sTyPNK/vcB81ImdeY9Ggdqy0SWbMDgmbqyQ+phgejh6V3R2QuSg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { @@ -221,50 +297,76 @@ "node": ">= 10.0.0" } }, - "node_modules/@electron/universal": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-1.5.1.tgz", - "integrity": "sha512-kbgXxyEauPJiQQUNG2VgUeyfQNFk6hBF11ISN2PNI6agUgPl55pv4eQmaqHzTAzchBvqZ2tQuRVaPStGf0mxGw==", + "node_modules/@electron/rebuild": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@electron/rebuild/-/rebuild-4.2.0.tgz", + "integrity": "sha512-RKL/O+jGoXJMxrx/5771y1n0xTKmFuOYGO3gMmwypBM6rsH0kou0mswwdXA2JrhIkE4xyC7v9vGk0n6NPzgOxQ==", "dev": true, "license": "MIT", "dependencies": { - "@electron/asar": "^3.2.1", - "@malept/cross-spawn-promise": "^1.1.0", - "debug": "^4.3.1", - "dir-compare": "^3.0.0", - "fs-extra": "^9.0.1", - "minimatch": "^3.0.4", - "plist": "^3.0.4" + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.1.1", + "node-abi": "^4.2.0", + "node-api-version": "^0.2.1", + "node-gyp": "^12.2.0", + "read-binary-file-arch": "^1.0.6" + }, + "bin": { + "electron-rebuild": "lib/cli.js" }, "engines": { - "node": ">=8.6" + "node": ">=22.12.0" } }, - "node_modules/@electron/universal/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "node_modules/@electron/universal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@electron/universal/-/universal-2.0.3.tgz", + "integrity": "sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "@electron/asar": "^3.3.1", + "@malept/cross-spawn-promise": "^2.0.0", + "debug": "^4.3.1", + "dir-compare": "^4.2.0", + "fs-extra": "^11.1.1", + "minimatch": "^9.0.3", + "plist": "^3.1.0" + }, + "engines": { + "node": ">=16.4" + } + }, + "node_modules/@electron/universal/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/@electron/universal/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" } }, "node_modules/@electron/universal/node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", "dev": true, "license": "MIT", "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, "node_modules/@electron/universal/node_modules/jsonfile": { @@ -281,16 +383,19 @@ } }, "node_modules/@electron/universal/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "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": "^1.1.7" + "brace-expansion": "^2.0.2" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@electron/universal/node_modules/universalify": { @@ -303,113 +408,89 @@ "node": ">= 10.0.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@electron/windows-sign": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@electron/windows-sign/-/windows-sign-1.2.2.tgz", + "integrity": "sha512-dfZeox66AvdPtb2lD8OsIIQh12Tp0GNCRUDfBHIKGpbmopZto2/A8nSpYYLoedPIHpqkeblZ/k8OV0Gy7PYuyQ==", + "dev": true, + "license": "BSD-2-Clause", + "optional": true, + "peer": true, + "dependencies": { + "cross-dirname": "^0.1.0", + "debug": "^4.3.4", + "fs-extra": "^11.1.1", + "minimist": "^1.2.8", + "postject": "^1.0.0-alpha.6" + }, + "bin": { + "electron-windows-sign": "bin/electron-windows-sign.js" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/fs-extra": { + "version": "11.4.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.4.0.tgz", + "integrity": "sha512-EQsFzMUJkCKGr1ePqlYADkIUmHW1s3ZXr5Yqy6wbGrfUCphpl2maM/kyOIRA2HpP3AaFQTZXD4ldjek+nccddA==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/@electron/windows-sign/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/@electron/windows-sign/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", "dev": true, "license": "ISC", "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "minipass": "^7.0.4" }, "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "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": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "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": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "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.2.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "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==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", "dev": true, "funding": [ { @@ -426,7 +507,7 @@ "cross-spawn": "^7.0.1" }, "engines": { - "node": ">= 10" + "node": ">= 12.13.0" } }, "node_modules/@malept/flatpak-bundler": { @@ -484,15 +565,69 @@ "node": ">= 10.0.0" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@noble/hashes": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-2.3.0.tgz", + "integrity": "sha512-oN+QwyX7VSHotibwubG3kpzbwKrfnyR6OOO+3Nk/53ADL7FmgHHz4TgrbaYKvvOw09u6QTx0oiH1cNCIOuN0CQ==", "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=14" + "node": ">= 20.19.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@peculiar/asn1-schema": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.9.3.tgz", + "integrity": "sha512-SOux4+jikCnOwoJvpBp/grOqzFmJPnNSwe3sAg1Bn93YdmCiDtvolZifJIhiRq0UWMTnLRPj9/ZCMAc2W9VsMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/json-schema": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.12.tgz", + "integrity": "sha512-coUfuoMeIB7B8/NMekxaDzLhaYmp0HZNPEjYRm9goRou8UZIC3z21s0sL9AWoCw4EG876QyO3kYrc61WNF9B/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@peculiar/utils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", + "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/@peculiar/webcrypto": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.7.1.tgz", + "integrity": "sha512-ODOov0sGMJMf3jPonOkgGqPknTsu+DdQ7kD++gz8aI+aFMOMHFbWAA2taqXXVTdP+OTOQR/znGvSpmkeI0WTYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "tslib": "^2.8.1", + "webcrypto-core": "^1.9.2" + }, + "engines": { + "node": ">=14.18.0" } }, "node_modules/@sindresorhus/is": { @@ -521,16 +656,6 @@ "node": ">=10" } }, - "node_modules/@tootallnate/once": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", - "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/@types/cacheable-request": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz", @@ -589,25 +714,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.41.tgz", - "integrity": "sha512-ECymXOukMnOoVkC2bb1Vc/w/836DXncOg5m8Xj1RH7xSHZJWNYY6Zh7EH477vcnD5egKNNfy2RpNOmuChhFPgQ==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~6.21.0" - } - }, - "node_modules/@types/plist": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", - "integrity": "sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*", - "xmlbuilder": ">=11.0.1" + "undici-types": "~7.18.0" } }, "node_modules/@types/responselike": { @@ -620,82 +733,53 @@ "@types/node": "*" } }, - "node_modules/@types/verror": { - "version": "1.10.11", - "resolved": "https://registry.npmjs.org/@types/verror/-/verror-1.10.11.tgz", - "integrity": "sha512-RlDm9K7+o5stv0Co8i8ZRGxDbrTxhJtgjqjFyVh/tXQyl/rYtTKlnTvZ88oSTeYREWurwx20Js4kTuKCsFkUtg==", - "dev": true, - "license": "MIT", - "optional": true - }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "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==", + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.14.tgz", + "integrity": "sha512-T4EDRUBVZYRldYApjEJiU0e1stYWaRAX7CuSnKzrpwdZKo53zGV8/pqfzV6FfwNl9YThD2OumQYvqtvjvgG7aQ==", "dev": true, "license": "MIT", "engines": { - "node": ">=14.6" + "node": ">=10.0.0" } }, - "node_modules/7zip-bin": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/7zip-bin/-/7zip-bin-5.2.0.tgz", - "integrity": "sha512-ukTPVhqG4jNzMro2qA9HSCSSVJN3aN7tlb+hfqYCt3ER0yWroeA2VR38MNrOHLQ/cVj+DaIMad0kFCtWWowh/A==", + "node_modules/abbrev": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-4.0.0.tgz", + "integrity": "sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==", "dev": true, - "license": "MIT" + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.0" + } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", "dev": true, "license": "MIT", - "dependencies": { - "debug": "4" - }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", - "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "ajv": "^6.9.1" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -722,54 +806,124 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/app-builder-bin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/app-builder-bin/-/app-builder-bin-4.0.0.tgz", - "integrity": "sha512-xwdG0FJPQMe0M0UA4Tz0zEB8rBJTRA5a476ZawAqiBkMv16GRK5xpXThOjMaEOFnZ6zabejjG4J3da0SXG63KA==", - "dev": true, - "license": "MIT" - }, "node_modules/app-builder-lib": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-24.13.3.tgz", - "integrity": "sha512-FAzX6IBit2POXYGnTCT8YHFO/lr5AapAII6zzhQO3Rw4cEDOgK+t1xhLc5tNcKlicTHlo9zxIwnYCX9X2DLkig==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/app-builder-lib/-/app-builder-lib-26.15.3.tgz", + "integrity": "sha512-2VnyWkqsP5v5XbBhL3tD5Syx8iNPBYsoU7kY4S2fz7wg8Rj/nztWKCUzGKaFRTv0Xwf3/H058CR1Kvtd/3lRow==", "dev": true, "license": "MIT", "dependencies": { - "@develar/schema-utils": "~2.6.5", - "@electron/notarize": "2.2.1", - "@electron/osx-sign": "1.0.5", - "@electron/universal": "1.5.1", + "@electron/asar": "3.4.1", + "@electron/fuses": "^1.8.0", + "@electron/get": "^3.0.0", + "@electron/notarize": "2.5.0", + "@electron/osx-sign": "1.3.3", + "@electron/rebuild": "^4.0.4", + "@electron/universal": "2.0.3", "@malept/flatpak-bundler": "^0.4.0", + "@noble/hashes": "^2.2.0", + "@peculiar/webcrypto": "^1.7.1", "@types/fs-extra": "9.0.13", + "ajv": "^8.18.0", + "asn1js": "^3.0.10", "async-exit-hook": "^2.0.1", - "bluebird-lst": "^1.0.9", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", "chromium-pickle-js": "^0.2.0", + "ci-info": "4.3.1", "debug": "^4.3.4", + "dotenv": "^16.4.5", + "dotenv-expand": "^11.0.6", "ejs": "^3.1.8", - "electron-publish": "24.13.1", - "form-data": "^4.0.0", + "electron-publish": "26.15.3", "fs-extra": "^10.1.0", "hosted-git-info": "^4.1.0", - "is-ci": "^3.0.0", "isbinaryfile": "^5.0.0", + "jiti": "^2.4.2", "js-yaml": "^4.1.0", + "json5": "^2.2.3", "lazy-val": "^1.0.5", - "minimatch": "^5.1.1", - "read-config-file": "6.3.2", - "sanitize-filename": "^1.6.3", - "semver": "^7.3.8", - "tar": "^6.1.12", - "temp-file": "^3.4.0" + "minimatch": "^10.2.5", + "pkijs": "^3.4.0", + "plist": "3.1.0", + "proper-lockfile": "^4.1.2", + "resedit": "^1.7.0", + "semver": "~7.7.3", + "tar": "^7.5.7", + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0", + "unzipper": "^0.12.3", + "which": "^5.0.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "dmg-builder": "24.13.3", - "electron-builder-squirrel-windows": "24.13.3" + "dmg-builder": "26.15.3", + "electron-builder-squirrel-windows": "26.15.3" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@electron/get/-/get-3.1.0.tgz", + "integrity": "sha512-F+nKc0xW+kVbBRhFzaMgPy3KwmuNTYX1fx6+FxxoSnNgwYX6LD7AKBTWkU0MQ6IBoe7dz069CNkR673sPAgkCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "env-paths": "^2.2.0", + "fs-extra": "^8.1.0", + "got": "^11.8.5", + "progress": "^2.0.3", + "semver": "^6.2.0", + "sumchecker": "^3.0.1" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "global-agent": "^3.0.0" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/app-builder-lib/node_modules/@electron/get/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/app-builder-lib/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" } }, "node_modules/app-builder-lib/node_modules/fs-extra": { @@ -787,7 +941,7 @@ "node": ">=12" } }, - "node_modules/app-builder-lib/node_modules/jsonfile": { + "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/jsonfile": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", @@ -800,20 +954,7 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/app-builder-lib/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/app-builder-lib/node_modules/universalify": { + "node_modules/app-builder-lib/node_modules/fs-extra/node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", @@ -823,83 +964,17 @@ "node": ">= 10.0.0" } }, - "node_modules/archiver": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.3.2.tgz", - "integrity": "sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==", + "node_modules/app-builder-lib/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "dev": true, - "license": "MIT", - "peer": true, - "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" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "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", - "peer": true, - "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", - "peer": true, - "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", - "peer": true - }, - "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", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" + "node": ">=10" } }, "node_modules/argparse": { @@ -909,26 +984,19 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "node_modules/asn1js": { + "version": "3.0.10", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", + "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", "dev": true, - "license": "MIT", - "optional": true, + "license": "BSD-3-Clause", + "dependencies": { + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.5", + "tslib": "^2.8.1" + }, "engines": { - "node": ">=0.8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=8" + "node": ">=12.0.0" } }, "node_modules/async": { @@ -965,13 +1033,23 @@ "node": ">= 4.0.0" } }, - "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==", + "node_modules/aws4": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==", "dev": true, "license": "MIT" }, + "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": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -993,19 +1071,6 @@ ], "license": "MIT" }, - "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", - "peer": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -1013,16 +1078,6 @@ "dev": true, "license": "MIT" }, - "node_modules/bluebird-lst": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/bluebird-lst/-/bluebird-lst-1.0.9.tgz", - "integrity": "sha512-7B1Rtx82hjnSD4PGLAjVWeYH3tHAcVUmChh85a3lltKQm6FresXh9ErQo6oAv6CqxttczC3/kEg8SY5NluPuUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bluebird": "^3.5.5" - } - }, "node_modules/boolean": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", @@ -1033,61 +1088,16 @@ "optional": true }, "node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", + "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "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-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-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4" + "balanced-match": "^4.0.2" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": "20 || >=22" } }, "node_modules/buffer-from": { @@ -1098,34 +1108,35 @@ "license": "MIT" }, "node_modules/builder-util": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-24.13.1.tgz", - "integrity": "sha512-NhbCSIntruNDTOVI9fdXz0dihaqX2YuE1D6zZMrwiErzH4ELZHE6mdiB40wEgZNprDia+FghRFgKoAqMZRRjSA==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/builder-util/-/builder-util-26.15.3.tgz", + "integrity": "sha512-q2hn7Mbo2nFNkVekPiHFx6Nfo3hURmES3tfBn+k5Pqxl2RkmP3QGqZUhH/q9Pch/4G05NRhPjDlVj1O8q4Txvw==", "dev": true, "license": "MIT", "dependencies": { "@types/debug": "^4.1.6", - "7zip-bin": "~5.2.0", - "app-builder-bin": "4.0.0", - "bluebird-lst": "^1.0.9", - "builder-util-runtime": "9.2.4", + "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", - "cross-spawn": "^7.0.3", + "cross-spawn": "^7.0.6", "debug": "^4.3.4", "fs-extra": "^10.1.0", - "http-proxy-agent": "^5.0.0", - "https-proxy-agent": "^5.0.1", - "is-ci": "^3.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "js-yaml": "^4.1.0", + "sanitize-filename": "^1.6.3", "source-map-support": "^0.5.19", "stat-mode": "^1.0.0", - "temp-file": "^3.4.0" + "temp-file": "^3.4.0", + "tiny-async-pool": "1.3.0" + }, + "engines": { + "node": ">=14.0.0" } }, "node_modules/builder-util-runtime": { - "version": "9.2.4", - "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.2.4.tgz", - "integrity": "sha512-upp+biKpN/XZMLim7aguUyW8s0FUpDvOtK6sbanMFDAMBzpHDqdhgVYm6zc9HJ6nWo7u2Lxk60i2M6Jd3aiNrA==", + "version": "9.7.0", + "resolved": "https://registry.npmjs.org/builder-util-runtime/-/builder-util-runtime-9.7.0.tgz", + "integrity": "sha512-g/kR520giAFYkSXTzcmF3kqQq7wi8F6N6SzeDgZrqTBN+VHdmgWOyTdD1yD7AATDId/yXLvuP34CxW46/BwCdw==", "dev": true, "license": "MIT", "dependencies": { @@ -1174,6 +1185,16 @@ "node": ">= 10.0.0" } }, + "node_modules/bytestreamjs": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", + "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/cacheable-lookup": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", @@ -1235,13 +1256,13 @@ } }, "node_modules/chownr": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", - "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": ">=18" } }, "node_modules/chromium-pickle-js": { @@ -1252,9 +1273,9 @@ "license": "MIT" }, "node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", + "integrity": "sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==", "dev": true, "funding": [ { @@ -1267,24 +1288,6 @@ "node": ">=8" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", @@ -1366,23 +1369,6 @@ "node": ">=0.10.0" } }, - "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==", - "dev": true, - "license": "MIT", - "peer": true, - "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_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1390,111 +1376,21 @@ "dev": true, "license": "MIT" }, - "node_modules/config-file-ts": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/config-file-ts/-/config-file-ts-0.2.6.tgz", - "integrity": "sha512-6boGVaglwblBgJqGyxm4+xCmEGcWgnWHSWHY5jad58awQhB6gftq0G8HbzU39YqCIYHMLAiL1yjwiZ36m/CL8w==", - "dev": true, - "license": "MIT", - "dependencies": { - "glob": "^10.3.10", - "typescript": "^5.3.3" - } - }, - "node_modules/config-file-ts/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": { - "foreground-child": "^3.1.0", - "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" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/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.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/config-file-ts/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": "BlueOak-1.0.0", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "dev": true, "license": "MIT" }, - "node_modules/crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", + "node_modules/cross-dirname": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/cross-dirname/-/cross-dirname-0.1.0.tgz", + "integrity": "sha512-+R08/oI0nl3vfPcqftZRpytksBXDzOUveBq/NBVx0sUp1axwzPQrKinNx5yd5sxPu8j1wIy8AfnVQ+5eFdha6Q==", "dev": true, "license": "MIT", "optional": true, - "dependencies": { - "buffer": "^5.1.0" - } - }, - "node_modules/crc-32": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", - "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "bin": { - "crc32": "bin/crc32.njs" - }, - "engines": { - "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", - "peer": true, - "dependencies": { - "crc-32": "^1.2.0", - "readable-stream": "^3.4.0" - }, - "engines": { - "node": ">= 10" - } + "peer": true }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -1511,6 +1407,29 @@ "node": ">= 8" } }, + "node_modules/cross-spawn/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/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", @@ -1625,20 +1544,27 @@ "optional": true }, "node_modules/dir-compare": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-3.3.0.tgz", - "integrity": "sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/dir-compare/-/dir-compare-4.2.0.tgz", + "integrity": "sha512-2xMCmOoMrdQIPHdsTawECdNPwlVFB9zGcz3kuhmBO6U3oU+UQjsue0i8ayLKpgBcm+hcXPMVSGUN9d+pvJ6+VQ==", "dev": true, "license": "MIT", "dependencies": { - "buffer-equal": "^1.0.0", - "minimatch": "^3.0.4" + "minimatch": "^3.0.5", + "p-limit": "^3.1.0 " } }, + "node_modules/dir-compare/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/dir-compare/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -1660,21 +1586,16 @@ } }, "node_modules/dmg-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-24.13.3.tgz", - "integrity": "sha512-rcJUkMfnJpfCboZoOOPf4L29TRtEieHNOeAbYPWPxlaBw/Z1RKrRA86dOI9rwaI4tQSc/RD82zTNHprfUHXsoQ==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/dmg-builder/-/dmg-builder-26.15.3.tgz", + "integrity": "sha512-O3zJUFUYHJKgzPqioHxfxzBzlSC1eXCSr79gMSBKBP5AgjjpmrydMsMLotEg9fAJF36vdUncb+4ndRNxoPdlSQ==", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", "fs-extra": "^10.1.0", - "iconv-lite": "^0.6.2", "js-yaml": "^4.1.0" - }, - "optionalDependencies": { - "dmg-license": "^1.0.11" } }, "node_modules/dmg-builder/node_modules/fs-extra": { @@ -1715,49 +1636,34 @@ "node": ">= 10.0.0" } }, - "node_modules/dmg-license": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/dmg-license/-/dmg-license-1.0.11.tgz", - "integrity": "sha512-ZdzmqwKmECOWJpqefloC5OJy1+WZBBse5+MR88z9g9Zn4VY+WYUkAyojmhzJckH5YbbZGcYIuGAkY5/Ys5OM2Q==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "@types/plist": "^3.0.1", - "@types/verror": "^1.10.3", - "ajv": "^6.10.0", - "crc": "^3.8.0", - "iconv-corefoundation": "^1.1.7", - "plist": "^3.0.4", - "smart-buffer": "^4.0.2", - "verror": "^1.10.0" - }, - "bin": { - "dmg-license": "bin/dmg-license.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/dotenv": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-9.0.2.tgz", - "integrity": "sha512-I9OvvrHp4pIARv4+x9iuewrWycX6CcZtoAu1XrzPxc5UygMJXJZYmBsynku8IkrJwgypE5DGNjDPmPRhDCptUg==", + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", "dev": true, "license": "BSD-2-Clause", "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" } }, "node_modules/dotenv-expand": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", - "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", + "version": "11.0.7", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", + "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", "dev": true, - "license": "BSD-2-Clause" + "license": "BSD-2-Clause", + "dependencies": { + "dotenv": "^16.4.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -1774,12 +1680,15 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "node_modules/duplexer2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", + "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause", + "dependencies": { + "readable-stream": "^2.0.2" + } }, "node_modules/ejs": { "version": "3.1.10", @@ -1798,40 +1707,39 @@ } }, "node_modules/electron": { - "version": "31.7.7", - "resolved": "https://registry.npmjs.org/electron/-/electron-31.7.7.tgz", - "integrity": "sha512-HZtZg8EHsDGnswFt0QeV8If8B+et63uD6RJ7I4/xhcXqmTIbI08GoubX/wm+HdY0DwcuPe1/xsgqpmYvjdjRoA==", + "version": "43.4.1", + "resolved": "https://registry.npmjs.org/electron/-/electron-43.4.1.tgz", + "integrity": "sha512-5b+EuiwkgG5iRcsEL34rimgRpkYp15SsfZOa0pC5kXs0Tb82TH4n95rpQzTZa7yRCbA7tm0WoEbuBL6NaAhAcA==", "dev": true, - "hasInstallScript": true, "license": "MIT", "dependencies": { - "@electron/get": "^2.0.0", - "@types/node": "^20.9.0", - "extract-zip": "^2.0.1" + "@electron-internal/extract-zip": "^1.0.1", + "@electron/get": "^5.0.0", + "@types/node": "^24.9.0" }, "bin": { - "electron": "cli.js" + "electron": "cli.js", + "install-electron": "install.js" }, "engines": { - "node": ">= 12.20.55" + "node": ">= 22.12.0" } }, "node_modules/electron-builder": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-24.13.3.tgz", - "integrity": "sha512-yZSgVHft5dNVlo31qmJAe4BVKQfFdwpRw7sFp1iQglDRCDD6r22zfRJuZlhtB5gp9FHUxCMEoWGq10SkCnMAIg==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder/-/electron-builder-26.15.3.tgz", + "integrity": "sha512-a1KM5heqS3gQCZzizXEI8RjJy3QVogULPdeSknt76uLDpBIW/HDGsMg/XgP0riP6PI9COsRvFITKKGDqA8fJxA==", "dev": true, "license": "MIT", "dependencies": { - "app-builder-lib": "24.13.3", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", - "dmg-builder": "24.13.3", + "ci-info": "^4.2.0", + "dmg-builder": "26.15.3", "fs-extra": "^10.1.0", - "is-ci": "^3.0.0", "lazy-val": "^1.0.5", - "read-config-file": "6.3.2", "simple-update-notifier": "2.0.0", "yargs": "^17.6.2" }, @@ -1844,58 +1752,16 @@ } }, "node_modules/electron-builder-squirrel-windows": { - "version": "24.13.3", - "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-24.13.3.tgz", - "integrity": "sha512-oHkV0iogWfyK+ah9ZIvMDpei1m9ZRpdXcvde1wTpra2U8AFDNNpqJdnin5z+PM1GbQ5BoaKCWas2HSjtR0HwMg==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-builder-squirrel-windows/-/electron-builder-squirrel-windows-26.15.3.tgz", + "integrity": "sha512-Jc19XPV9y9+2bAdZPkXuVNGNIEFBq9poHC61l8Kv6FdK7DRG3+Ic0rerC0DXOaeHNz8yW0fg/JnF8GQROOF5MA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "app-builder-lib": "24.13.3", - "archiver": "^5.3.1", - "builder-util": "24.13.1", - "fs-extra": "^10.1.0" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/fs-extra": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", - "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/jsonfile": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", - "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", - "dev": true, - "license": "MIT", - "peer": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/electron-builder-squirrel-windows/node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">= 10.0.0" + "app-builder-lib": "26.15.3", + "builder-util": "26.15.3", + "electron-winstaller": "5.4.0" } }, "node_modules/electron-builder/node_modules/fs-extra": { @@ -1937,16 +1803,18 @@ } }, "node_modules/electron-publish": { - "version": "24.13.1", - "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-24.13.1.tgz", - "integrity": "sha512-2ZgdEqJ8e9D17Hwp5LEq5mLQPjqU3lv/IALvgp+4W8VeNhryfGhYEQC/PgDPMrnWUp+l60Ou5SJLsu+k4mhQ8A==", + "version": "26.15.3", + "resolved": "https://registry.npmjs.org/electron-publish/-/electron-publish-26.15.3.tgz", + "integrity": "sha512-g/2bn8YTavY4cuS5F+jOS7zmZbXXBV8KZ8yHKfJjFPoKtzBqrpCdNPxBd3tqdBwP7BVd0lGzf7Bk2s0KesWZ4Q==", "dev": true, "license": "MIT", "dependencies": { "@types/fs-extra": "^9.0.11", - "builder-util": "24.13.1", - "builder-util-runtime": "9.2.4", + "aws4": "^1.13.2", + "builder-util": "26.15.3", + "builder-util-runtime": "9.7.0", "chalk": "^4.1.2", + "form-data": "^4.0.5", "fs-extra": "^10.1.0", "lazy-val": "^1.0.5", "mime": "^2.5.2" @@ -1990,6 +1858,44 @@ "node": ">= 10.0.0" } }, + "node_modules/electron-winstaller": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/electron-winstaller/-/electron-winstaller-5.4.0.tgz", + "integrity": "sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@electron/asar": "^3.2.1", + "debug": "^4.1.1", + "fs-extra": "^7.0.1", + "lodash": "^4.17.21", + "temp": "^0.9.0" + }, + "engines": { + "node": ">=8.0.0" + }, + "optionalDependencies": { + "@electron/windows-sign": "^1.1.2" + } + }, + "node_modules/electron-winstaller/node_modules/fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2045,9 +1951,9 @@ } }, "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==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -2105,37 +2011,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "node_modules/exponential-backoff": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", + "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==", "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, - "node_modules/extsprintf": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz", - "integrity": "sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==", - "dev": true, - "engines": [ - "node >=0.6.0" - ], - "license": "MIT", - "optional": true + "license": "Apache-2.0" }, "node_modules/fast-deep-equal": { "version": "3.1.3", @@ -2144,21 +2025,39 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "node_modules/fast-uri": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "dev": true, - "license": "MIT" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", - "dependencies": { - "pend": "~1.2.0" + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, "node_modules/filelist": { @@ -2171,89 +2070,53 @@ "minimatch": "^5.0.1" } }, - "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==", + "node_modules/filelist/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/filelist/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", "dev": true, "license": "ISC", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" + "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "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" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 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", - "peer": true - }, - "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "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/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/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2358,10 +2221,17 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob/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/glob/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", "dev": true, "license": "MIT", "dependencies": { @@ -2401,20 +2271,6 @@ "node": ">=10.0" } }, - "node_modules/global-agent/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "optional": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", @@ -2533,9 +2389,9 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { @@ -2566,18 +2422,17 @@ "license": "BSD-2-Clause" }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "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==", "dev": true, "license": "MIT", "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/http2-wrapper": { @@ -2595,71 +2450,19 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "license": "MIT", "dependencies": { - "agent-base": "6", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, - "node_modules/iconv-corefoundation": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/iconv-corefoundation/-/iconv-corefoundation-1.1.7.tgz", - "integrity": "sha512-T10qvkw0zz4wnm560lOEg0PovVqUXuOFhhHAkixw8/sycy7TJt7v/RrkEKEQnAw2viPSJu6iAkErxnzR0g8PpQ==", - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "cli-truncate": "^2.1.0", - "node-addon-api": "^1.6.3" - }, - "engines": { - "node": "^8.11.2 || >=10" - } - }, - "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", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "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/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -2679,19 +2482,6 @@ "dev": true, "license": "ISC" }, - "node_modules/is-ci": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", - "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ci-info": "^3.2.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "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", @@ -2707,8 +2497,7 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/isbinaryfile": { "version": "5.0.7", @@ -2724,26 +2513,13 @@ } }, "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/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", "dev": true, "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "engines": { + "node": ">=18" } }, "node_modules/jake": { @@ -2764,12 +2540,32 @@ "node": ">=10" } }, - "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "node_modules/jiti": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz", + "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==", "dev": true, "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-yaml": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.1.tgz", + "integrity": "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -2785,9 +2581,9 @@ "license": "MIT" }, "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, "license": "MIT" }, @@ -2839,56 +2635,6 @@ "dev": true, "license": "MIT" }, - "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", - "peer": true, - "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", - "peer": true, - "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", - "peer": true - }, - "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", - "peer": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", @@ -2896,46 +2642,6 @@ "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", - "peer": true - }, - "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", - "peer": true - }, - "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", - "peer": true - }, - "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", - "peer": true - }, - "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", - "peer": true - }, "node_modules/lowercase-keys": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", @@ -3030,16 +2736,19 @@ } }, "node_modules/minimatch": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", - "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "version": "10.2.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.6.tgz", + "integrity": "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.8" }, "engines": { - "node": ">=10" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -3053,53 +2762,40 @@ } }, "node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", "dev": true, - "license": "ISC", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=8" + "node": ">=16 || 14 >=14.17" } }, "node_modules/minizlib": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", - "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "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": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" + "minipass": "^7.1.2" }, "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==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" + "node": ">= 18" } }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", "dev": true, "license": "MIT", + "peer": true, + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/ms": { @@ -3109,23 +2805,101 @@ "dev": true, "license": "MIT" }, - "node_modules/node-addon-api": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", - "integrity": "sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==", + "node_modules/node-abi": { + "version": "4.33.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-4.33.0.tgz", + "integrity": "sha512-vLBWCKb+7LWsX+TbfzWOkw0W81m377tyx3hOweBTjO43CXZnRGS1/JPWs20fr0PgZyDXk6ROYrylsEycK8raDA==", "dev": true, "license": "MIT", - "optional": true - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "peer": true, + "dependencies": { + "semver": "^7.6.3" + }, "engines": { - "node": ">=0.10.0" + "node": ">=22.12.0" + } + }, + "node_modules/node-api-version": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.2.1.tgz", + "integrity": "sha512-2xP/IGGMmmSQpI1+O/k72jF/ykvZ89JeuKX3TLJAYPDVLUalrshrLHkeVcCCZqG/eEa635cr8IBYzgnDvM2O8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + } + }, + "node_modules/node-gyp": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-12.4.0.tgz", + "integrity": "sha512-OMcPNvqTCFUnNaBlmdgq+lfNqY7gTiSmNRDjY3uAXRyudeKZEZxu3CLtjMQrx4zZxCX2b/mpNqTtwuCJgXhHkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.0", + "exponential-backoff": "^3.1.1", + "graceful-fs": "^4.2.6", + "nopt": "^9.0.0", + "proc-log": "^6.0.0", + "semver": "^7.3.5", + "tar": "^7.5.4", + "tinyglobby": "^0.2.12", + "undici": "^6.25.0", + "which": "^6.0.0" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-gyp/node_modules/isexe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-4.0.0.tgz", + "integrity": "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=20" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/which/-/which-6.0.1.tgz", + "integrity": "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^4.0.0" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/nopt": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-9.0.0.tgz", + "integrity": "sha512-Zhq3a+yFKrYwSBluL4H9XP3m3y5uvQkB/09CwDruCiRmR/UJYnn9W4R48ry0uGC70aeTPKLynBtscP9efFFcPw==", + "dev": true, + "license": "ISC", + "dependencies": { + "abbrev": "^4.0.0" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "^20.17.0 || >=22.9.0" } }, "node_modules/normalize-url": { @@ -3172,12 +2946,21 @@ "node": ">=8" } }, - "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==", + "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": "BlueOak-1.0.0" + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/path-is-absolute": { "version": "1.0.1", @@ -3199,37 +2982,21 @@ "node": ">=8" } }, - "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==", + "node_modules/pe-library": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/pe-library/-/pe-library-0.4.1.tgz", + "integrity": "sha512-eRWB5LBz7PpDu4PUlwT0PhnQfTQJlDDdPa35urV4Osrm0t0AqQFGn+UIkU3klZvwJ8KPO3VbBFsXquA6p6kqZw==", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, + "license": "MIT", "engines": { - "node": ">=16 || 14 >=14.18" + "node": ">=12", + "npm": ">=6" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "type": "github", + "url": "https://github.com/sponsors/jet2jet" } }, - "node_modules/path-scurry/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/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", - "dev": true, - "license": "MIT" - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -3237,14 +3004,58 @@ "dev": true, "license": "ISC" }, + "node_modules/picomatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkijs": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", + "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@noble/hashes": "1.4.0", + "asn1js": "^3.0.6", + "bytestreamjs": "^2.0.1", + "pvtsutils": "^1.3.6", + "pvutils": "^1.1.3", + "tslib": "^2.8.1" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/pkijs/node_modules/@noble/hashes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", + "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/plist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.1.tgz", - "integrity": "sha512-ZIfcLJC+7E7FBFnDxm9MPmt7D+DidyQ26lewieO75AdhA2ayMtsJSES0iWzqJQbcVRSrTufQoy0DR94xHue0oA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz", + "integrity": "sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==", "dev": true, "license": "MIT", "dependencies": { - "@xmldom/xmldom": "^0.9.10", + "@xmldom/xmldom": "^0.8.8", "base64-js": "^1.5.1", "xmlbuilder": "^15.1.1" }, @@ -3252,13 +3063,52 @@ "node": ">=10.4.0" } }, + "node_modules/postject": { + "version": "1.0.0-alpha.6", + "resolved": "https://registry.npmjs.org/postject/-/postject-1.0.0-alpha.6.tgz", + "integrity": "sha512-b9Eb8h2eVqNE8edvKdwqkrY6O7kAwmI8kcnBv1NScolYJbo59XUF0noFq+lxbC1yN20bmC0WBEbDC5H/7ASb0A==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "dependencies": { + "commander": "^9.4.0" + }, + "bin": { + "postject": "dist/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/postject/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "license": "MIT", + "optional": true, + "peer": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/proc-log": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/proc-log/-/proc-log-6.1.0.tgz", + "integrity": "sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^20.17.0 || >=22.9.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", - "peer": true + "license": "MIT" }, "node_modules/progress": { "version": "2.0.3", @@ -3284,6 +3134,18 @@ "node": ">=10" } }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "node_modules/pump": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", @@ -3295,14 +3157,24 @@ "once": "^1.3.1" } }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "node_modules/pvtsutils": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", + "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.8.1" + } + }, + "node_modules/pvutils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.2.0.tgz", + "integrity": "sha512-BbubeCEyTuQjVMakvJQ/Sxbc93F2pwmbsxONT/ZRrwU7Ua38d8unYTwXpTVLAKJ4BDuH9IGztCjQcd/N/39Dvg==", "dev": true, "license": "MIT", "engines": { - "node": ">=6" + "node": ">=16.0.0" } }, "node_modules/quick-lru": { @@ -3318,49 +3190,33 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/read-config-file": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", - "integrity": "sha512-M80lpCjnE6Wt6zb98DoW8WHR09nzMSpu8XHtPkiTHrJ5Az9CybfeQhTJ8D7saeBHpGhLPIVyA8lcL6ZmdKwY6Q==", + "node_modules/read-binary-file-arch": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz", + "integrity": "sha512-BNg9EN3DD3GsDXX7Aa8O4p92sryjkmzYYgmgTAc6CA4uGLEDzFfxOxugu21akOxpcXHiEgsYkC6nPsQvLLLmEg==", "dev": true, "license": "MIT", "dependencies": { - "config-file-ts": "^0.2.4", - "dotenv": "^9.0.2", - "dotenv-expand": "^5.1.0", - "js-yaml": "^4.1.0", - "json5": "^2.2.0", - "lazy-val": "^1.0.4" + "debug": "^4.3.4" }, - "engines": { - "node": ">=12.0.0" + "bin": { + "read-binary-file-arch": "cli.js" } }, "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==", + "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", - "peer": true, "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", - "integrity": "sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "minimatch": "^5.1.0" + "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/require-directory": { @@ -3373,6 +3229,34 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resedit": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/resedit/-/resedit-1.7.2.tgz", + "integrity": "sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pe-library": "^0.4.1" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/jet2jet" + } + }, "node_modules/resolve-alpn": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", @@ -3403,6 +3287,21 @@ "node": ">= 4" } }, + "node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "peer": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, "node_modules/roarr": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", @@ -3423,31 +3322,9 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "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", - "peer": true - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "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" }, @@ -3462,9 +3339,9 @@ } }, "node_modules/sax": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.0.tgz", - "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.6.1.tgz", + "integrity": "sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==", "dev": true, "license": "BlueOak-1.0.0", "engines": { @@ -3472,13 +3349,16 @@ } }, "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-compare": { @@ -3530,17 +3410,11 @@ } }, "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } + "license": "ISC" }, "node_modules/simple-update-notifier": { "version": "2.0.0", @@ -3555,47 +3429,6 @@ "node": ">=10" } }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.0.tgz", - "integrity": "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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", - "optional": true, - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3636,14 +3469,13 @@ } }, "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==", + "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", - "peer": true, "dependencies": { - "safe-buffer": "~5.2.0" + "safe-buffer": "~5.1.0" } }, "node_modules/string-width": { @@ -3661,22 +3493,6 @@ "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", @@ -3690,20 +3506,6 @@ "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/sumchecker": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/sumchecker/-/sumchecker-3.0.1.tgz", @@ -3731,40 +3533,45 @@ } }, "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==", - "deprecated": "Old versions of tar 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", + "version": "7.5.22", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.22.tgz", + "integrity": "sha512-MFO/QzvtAOmJbkhOaCTvbGcFN9L9b+JunIsDwaKljSOdcLMea3NJ1k9Usz/rjdfSXTq4dfzfeS7W4p4YOAAHeA==", "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" + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.1.0", + "yallist": "^5.0.0" }, "engines": { - "node": ">=10" + "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/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==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", "dev": true, "license": "MIT", "peer": true, "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" + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" }, "engines": { - "node": ">=6" + "node": ">=6.0.0" } }, "node_modules/temp-file": { @@ -3816,10 +3623,47 @@ "node": ">= 10.0.0" } }, + "node_modules/tiny-async-pool": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tiny-async-pool/-/tiny-async-pool-1.3.0.tgz", + "integrity": "sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^5.5.0" + } + }, + "node_modules/tiny-async-pool/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "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==", + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.7.tgz", + "integrity": "sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==", "dev": true, "license": "MIT", "engines": { @@ -3846,6 +3690,13 @@ "utf8-byte-length": "^1.0.1" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/type-fest": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", @@ -3860,24 +3711,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typescript": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "node_modules/undici": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.28.0.tgz", + "integrity": "sha512-LIY910g9TI13YS95lrMFrs8Rm/u/irgHeTWoKCoteeJ04CUJ92eEfj0rVn+7VKMPBpUPiUoBKfhNyLI23EE/KA==", "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, + "license": "MIT", "engines": { - "node": ">=14.17" + "node": ">=18.17" } }, "node_modules/undici-types": { - "version": "6.21.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", - "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, @@ -3891,14 +3738,56 @@ "node": ">= 4.0.0" } }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "node_modules/unzipper": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.12.5.tgz", + "integrity": "sha512-tXYOi9R57Uj/2Z25SOs5RRSzq886MBQj2gY8dPL+xl/kv6s6SvByoKfAtvfVeEuhntWDgjd2o9p2lb4TVPAz0A==", "dev": true, - "license": "BSD-2-Clause", + "license": "MIT", "dependencies": { - "punycode": "^2.1.0" + "bluebird": "~3.7.2", + "duplexer2": "~0.1.4", + "fs-extra": "11.3.1", + "graceful-fs": "^4.2.2", + "node-int64": "^0.4.0" + } + }, + "node_modules/unzipper/node_modules/fs-extra": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.1.tgz", + "integrity": "sha512-eXvGGwZ5CL17ZSwHWd3bbgk7UUpF6IFHtP57NYYakPvHOs8GDgDe5KJI36jIJzDkJ6eJjuzRA8eBQb6SkKue0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/unzipper/node_modules/jsonfile": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.1.tgz", + "integrity": "sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/unzipper/node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.0.0" } }, "node_modules/utf8-byte-length": { @@ -3913,39 +3802,36 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, - "node_modules/verror": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.1.tgz", - "integrity": "sha512-veufcmxri4e3XSrT0xwfUR7kguIkaxBeosDg00yDWhk49wdwkSUrvvsm7nc75e1PUyvIeZj6nS8VQRYz2/S4Xg==", + "node_modules/webcrypto-core": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.9.2.tgz", + "integrity": "sha512-gsXecm82UQNlTBURJGuqOWy1Ww08S3kZUcr3aOJS02Pk0xLtkfeUAVC0u0xhgdonFme80edSJUIJyuvL/7250Q==", "dev": true, "license": "MIT", - "optional": true, "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - }, - "engines": { - "node": ">=0.6.0" + "@peculiar/asn1-schema": "^2.7.0", + "@peculiar/json-schema": "^1.1.12", + "@peculiar/utils": "^2.0.2", + "asn1js": "^3.0.10", + "tslib": "^2.8.1" } }, "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", "dev": true, "license": "ISC", "dependencies": { - "isexe": "^2.0.0" + "isexe": "^3.1.1" }, "bin": { - "node-which": "bin/node-which" + "node-which": "bin/which.js" }, "engines": { - "node": ">= 8" + "node": "^18.17.0 || >=20.5.0" } }, "node_modules/wrap-ansi": { @@ -3966,25 +3852,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "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/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -4048,54 +3915,17 @@ "node": ">=12" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "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", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, - "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", - "peer": true, - "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", - "peer": true, - "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" + "node": ">=10" }, - "engines": { - "node": ">= 10" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } } } diff --git a/package.json b/package.json index c206eac..04f2a9f 100644 --- a/package.json +++ b/package.json @@ -3,27 +3,47 @@ "version": "0.1.0", "private": true, "description": "Standalone desktop shell for Alta Video Player.", + "desktopName": "alta-video-player.desktop", + "homepage": "https://git.pejicorp.com/peji/WebAVP", + "author": { + "name": "Alta", + "email": "support@avasecurity.com" + }, "main": "electron/main.js", "scripts": { "start": "electron .", - "check": "node --check electron/main.js && node --check electron/preload.js && python3 -m py_compile app.py", - "smoke": "WEBAVP_DISABLE_GPU=1 WEBAVP_SMOKE_QUIT_AFTER_MS=250 electron .", - "dist": "electron-builder" + "check": "node scripts/check.js", + "test": "node scripts/check.js", + "smoke": "node scripts/smoke.js", + "smoke:web": "electron tests/browser-smoke.js", + "smoke:headless": "xvfb-run -a npm run smoke", + "dist": "electron-builder", + "dist:linux": "electron-builder --linux --x64", + "dist:mac": "electron-builder --mac --x64 --arm64", + "dist:win": "electron-builder --win --x64" }, "devDependencies": { - "electron": "^31.7.7", - "electron-builder": "^24.13.3" + "electron": "^43.4.1", + "electron-builder": "^26.15.3" }, "build": { "appId": "com.alta.webavp", "productName": "Alta Video Player", + "artifactName": "${productName}-${version}-${os}-${arch}.${ext}", + "directories": { + "buildResources": "build", + "output": "dist" + }, "files": [ "electron/**", "static/**", "templates/**", + "build/icon.png", "package.json" ], "linux": { + "icon": "build/icons", + "syncDesktopName": true, "target": [ "AppImage", "deb" @@ -31,10 +51,12 @@ "category": "AudioVideo" }, "mac": { + "icon": "build/icon.icns", "target": "dmg", "category": "public.app-category.video" }, "win": { + "icon": "build/icon.ico", "target": "nsis" } } diff --git a/scripts/check.js b/scripts/check.js new file mode 100644 index 0000000..4eb6bfc --- /dev/null +++ b/scripts/check.js @@ -0,0 +1,70 @@ +#!/usr/bin/env node +'use strict'; + +const { spawnSync } = require('node:child_process'); +const fs = require('node:fs'); +const path = require('node:path'); + +const ROOT_DIR = path.resolve(__dirname, '..'); + +function run(command, args, options = {}) { + const result = spawnSync(command, args, { + cwd: ROOT_DIR, + stdio: 'inherit', + shell: false, + windowsHide: true, + }); + if (result.error) { + if (result.error.code === 'ENOENT' && options.allowMissing) return { missing: true }; + console.error(`[WebAVP] Failed to run ${command}: ${result.error.message}`); + process.exit(1); + } + if (result.status !== 0) process.exit(result.status || 1); + return { ok: true }; +} + +for (const file of ['electron/main.js', 'electron/preload.js', 'static/webavp-utils.js', 'tests/webavp-utils.test.js']) { + run(process.execPath, ['--check', file]); +} +run(process.execPath, ['tests/webavp-utils.test.js']); + +const html = fs.readFileSync(path.join(ROOT_DIR, 'templates/index.html'), 'utf8'); +const required = [ + 'data-layout="4x4"', + 'WebAVPUtils.getAutoGrid', + 'Download Desktop App', + 'Check for Updates', + 'verifyEntryAuth', + 'activeSegmentsDirty', + 'cameraIdFromFile', +]; +for (const marker of required) { + if (!html.includes(marker)) { + console.error(`[WebAVP] Missing required template marker: ${marker}`); + process.exit(1); + } +} +if (/dewarp|fisheye/i.test(html)) { + console.error('[WebAVP] Fisheye dewarp code must not be reintroduced.'); + process.exit(1); +} + +const pythonCandidates = process.platform === 'win32' + ? [['py', ['-3']], ['python', []], ['python3', []]] + : [['python3', []], ['python', []]]; +let pythonChecked = false; +for (const [command, prefix] of pythonCandidates) { + const result = spawnSync(command, [...prefix, '-m', 'py_compile', 'app.py'], { + cwd: ROOT_DIR, + stdio: 'inherit', + shell: false, + windowsHide: true, + }); + if (result.error?.code === 'ENOENT') continue; + if (result.error || result.status !== 0) process.exit(result.status || 1); + run(command, [...prefix, '-m', 'unittest', 'discover', '-s', 'tests', '-p', '*_test.py']); + pythonChecked = true; + break; +} +if (!pythonChecked) console.warn('[WebAVP] Python unavailable; optional web-server checks skipped.'); +console.log('[WebAVP] checks passed'); diff --git a/scripts/smoke.js b/scripts/smoke.js new file mode 100644 index 0000000..e1b99ef --- /dev/null +++ b/scripts/smoke.js @@ -0,0 +1,32 @@ +#!/usr/bin/env node +'use strict'; + +const { spawn } = require('node:child_process'); +const path = require('node:path'); + +const ROOT_DIR = path.resolve(__dirname, '..'); +const electronPath = require('electron'); +const env = { + ...process.env, + WEBAVP_DISABLE_GPU: process.env.WEBAVP_DISABLE_GPU || '1', + WEBAVP_SMOKE_QUIT_AFTER_MS: process.env.WEBAVP_SMOKE_QUIT_AFTER_MS || '250', +}; + +const child = spawn(electronPath, ['.'], { + cwd: ROOT_DIR, + env, + stdio: 'inherit', + shell: false, + windowsHide: true, +}); +child.on('error', (err) => { + console.error(`[WebAVP] Failed to start Electron smoke test: ${err.message}`); + process.exit(1); +}); +child.on('exit', (code, signal) => { + if (signal) { + console.error(`[WebAVP] Electron smoke test exited via signal ${signal}`); + process.exit(1); + } + process.exit(code || 0); +}); diff --git a/static/webavp-utils.js b/static/webavp-utils.js new file mode 100644 index 0000000..a8c7c45 --- /dev/null +++ b/static/webavp-utils.js @@ -0,0 +1,140 @@ +(function initWebAVPUtils(root, factory) { + const api = factory(); + if (typeof module === 'object' && module.exports) module.exports = api; + if (root) root.WebAVPUtils = api; +}(typeof globalThis !== 'undefined' ? globalThis : this, function createWebAVPUtils() { + 'use strict'; + + const GITPEJI_ORIGIN = 'https://git.pejicorp.com'; + const RELEASES_URL = `${GITPEJI_ORIGIN}/peji/WebAVP/releases`; + const LATEST_RELEASE_API = `${GITPEJI_ORIGIN}/api/v1/repos/peji/WebAVP/releases/latest`; + + function parseVersion(value) { + const match = String(value || '').trim().match(/^v?(\d+)\.(\d+)(?:\.(\d+))?(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/); + if (!match) throw new Error(`Invalid semantic version: ${value}`); + return { + parts: [Number(match[1]), Number(match[2]), Number(match[3] || 0)], + prerelease: match[4] ? match[4].split('.') : [], + }; + } + + function compareIdentifiers(left, right) { + const leftNumber = /^\d+$/.test(left) ? Number(left) : null; + const rightNumber = /^\d+$/.test(right) ? Number(right) : null; + if (leftNumber !== null && rightNumber !== null) return Math.sign(leftNumber - rightNumber); + if (leftNumber !== null) return -1; + if (rightNumber !== null) return 1; + return left === right ? 0 : (left > right ? 1 : -1); + } + + function compareVersions(leftValue, rightValue) { + const left = parseVersion(leftValue); + const right = parseVersion(rightValue); + for (let index = 0; index < 3; index += 1) { + if (left.parts[index] !== right.parts[index]) return Math.sign(left.parts[index] - right.parts[index]); + } + if (!left.prerelease.length && !right.prerelease.length) return 0; + if (!left.prerelease.length) return 1; + if (!right.prerelease.length) return -1; + const length = Math.max(left.prerelease.length, right.prerelease.length); + for (let index = 0; index < length; index += 1) { + if (left.prerelease[index] === undefined) return -1; + if (right.prerelease[index] === undefined) return 1; + const result = compareIdentifiers(left.prerelease[index], right.prerelease[index]); + if (result) return result; + } + return 0; + } + + function getAutoGrid(countValue) { + const count = Math.max(1, Math.min(16, Number(countValue) || 1)); + if (count === 1) return { cols: 1, rows: 1 }; + if (count === 2) return { cols: 2, rows: 1 }; + if (count <= 4) return { cols: 2, rows: 2 }; + if (count <= 6) return { cols: 3, rows: 2 }; + if (count <= 9) return { cols: 3, rows: 3 }; + if (count <= 12) return { cols: 4, rows: 3 }; + return { cols: 4, rows: 4 }; + } + + function assertGitPejiUrl(rawUrl, label) { + let url; + try { + url = new URL(rawUrl); + } catch { + throw new Error(`Invalid ${label} URL`); + } + if (url.origin !== GITPEJI_ORIGIN || url.username || url.password) { + throw new Error(`Invalid ${label} host`); + } + return url.href; + } + + function normalizeRelease(rawRelease) { + if (!rawRelease || typeof rawRelease !== 'object') throw new Error('Invalid release response'); + const version = String(rawRelease.tag_name || '').replace(/^v/, ''); + parseVersion(version); + const pageUrl = assertGitPejiUrl(rawRelease.html_url || RELEASES_URL, 'release page'); + const assets = Array.isArray(rawRelease.assets) ? rawRelease.assets.map((asset) => { + if (!asset || typeof asset.name !== 'string' || !asset.name.trim()) throw new Error('Invalid release asset'); + const url = assertGitPejiUrl(asset.browser_download_url, 'release asset'); + if (!new URL(url).pathname.startsWith('/peji/WebAVP/releases/download/')) throw new Error('Invalid release asset path'); + return { name: asset.name.trim(), url }; + }) : []; + return { version, name: String(rawRelease.name || rawRelease.tag_name), pageUrl, assets }; + } + + function normalizedPlatform(platform) { + if (platform === 'darwin' || platform === 'mac' || platform === 'macos') return 'mac'; + if (platform === 'win32' || platform === 'windows' || platform === 'win') return 'win'; + return platform === 'linux' ? 'linux' : ''; + } + + function assetScore(asset, platformValue, archValue) { + const platform = normalizedPlatform(platformValue); + const arch = String(archValue || '').toLowerCase(); + const name = asset.name.toLowerCase(); + const platformMatches = platform === 'linux' + ? name.endsWith('.appimage') || name.endsWith('.deb') || /(^|[-_.])linux([-_.]|$)/.test(name) + : platform === 'mac' + ? name.endsWith('.dmg') || /(^|[-_.])(mac|macos|darwin)([-_.]|$)/.test(name) + : platform === 'win' + ? name.endsWith('.exe') || name.endsWith('.msi') || /(^|[-_.])(win|windows)([-_.]|$)/.test(name) + : false; + if (!platformMatches) return -1; + const hasArm64 = /(^|[-_.])(arm64|aarch64)([-_.]|$)/.test(name); + const hasX64 = /(^|[-_.])(x64|amd64|x86_64)([-_.]|$)/.test(name); + if ((arch === 'arm64' || arch === 'aarch64') && !hasArm64) return -1; + if ((arch === 'x64' || arch === 'amd64' || arch === 'x86_64') && !hasX64) return -1; + if (!['arm64', 'aarch64', 'x64', 'amd64', 'x86_64'].includes(arch)) return -1; + if (platform === 'linux' && name.endsWith('.appimage')) return 30; + if (platform === 'win' && name.endsWith('.exe')) return 30; + if (platform === 'mac' && name.endsWith('.dmg')) return 30; + return 10; + } + + function selectReleaseAsset(release, platform, arch) { + if (!release || !Array.isArray(release.assets)) return null; + return release.assets + .map((asset) => ({ asset, score: assetScore(asset, platform, arch) })) + .filter((candidate) => candidate.score >= 0) + .sort((left, right) => right.score - left.score || left.asset.name.localeCompare(right.asset.name))[0]?.asset || null; + } + + function evaluateUpdate(release, currentVersion, platform, arch) { + if (compareVersions(release.version, currentVersion) <= 0) return { status: 'current', asset: null }; + const asset = selectReleaseAsset(release, platform, arch); + return asset ? { status: 'available', asset } : { status: 'unavailable-platform', asset: null }; + } + + return { + GITPEJI_ORIGIN, + LATEST_RELEASE_API, + RELEASES_URL, + compareVersions, + evaluateUpdate, + getAutoGrid, + normalizeRelease, + selectReleaseAsset, + }; +})); diff --git a/templates/index.html b/templates/index.html index da666e2..58c4d06 100644 --- a/templates/index.html +++ b/templates/index.html @@ -7,6 +7,7 @@ Alta Video Player +