diff --git a/README.md b/README.md index b8c00e0..2f8edb7 100644 --- a/README.md +++ b/README.md @@ -2,9 +2,11 @@ **philtv-js** is a TypeScript library for pairing a Philips Android TV with the latest versions (6) using the **JointSpace** protocol. -This library simplifies the pairing process, allowing you to interact with your Philips television securely and efficiently. With full TypeScript support, `philtv-js` provides type safety, helping to prevent runtime errors and improve code quality. +This library simplifies the pairing process, allowing you to interact with your Philips television securely and efficiently. -This library leverages the lightweight [ky](https://github.com/sindresorhus/ky) HTTP client, which is built on top of Fetch API, for making secure and intuitive HTTP requests. +With full TypeScript support, `philtv-js` provides type safety, helping to prevent runtime errors and improve code quality. + +This library leverages the lightweight [urllib](https://www.npmjs.com/package/urllib) HTTP client, which is built on top of Fetch API, for making secure and intuitive HTTP requests. **Works only in secure environments (HTTPS) and with versions 6 of the JointSpace protocol.** diff --git a/docs/get-started.md b/docs/get-started.md index afc5c08..1771b6c 100644 --- a/docs/get-started.md +++ b/docs/get-started.md @@ -6,7 +6,7 @@ This library simplifies the pairing process, allowing you to interact with your With full TypeScript support, `philtv-js` provides type safety, helping to prevent runtime errors and improve code quality. -This library leverages the lightweight [ky](https://github.com/sindresorhus/ky) HTTP client, which is built on top of Fetch API, for making secure and intuitive HTTP requests. +This library leverages the lightweight [urllib](https://www.npmjs.com/package/urllib) HTTP client, which is built on top of Fetch API, for making secure and intuitive HTTP requests. ::: warning **Works only in secure environments (HTTPS) and with versions 6 of the JointSpace protocol.** @@ -19,3 +19,12 @@ To install `philtv-js`, you can use npm: ```bash npm install philtv-js ``` + +## Useful resources +- https://jointspace.sourceforge.net/projectdata/jointSPACE_API_Reference_Manual.pdf +- https://github.com/lucasvdh/codes.lucasvdh.philips-jointspace +- https://gist.github.com/marcelrv/ee9a7cf97c227d069e4ee88d26691019 +- https://github.com/suborb/philips_android_tv/blob/master/philips.py +- https://github.com/jomwells/ambilights/blob/master/custom_components/philips_ambilight/light.py +- https://github.com/eslavnov/pylips +- https://jointspace.sourceforge.net/projectdata/documentation/jasonApi/1/doc/API.html diff --git a/docs/pairing.md b/docs/pairing.md index 3095859..e6a9bf3 100644 --- a/docs/pairing.md +++ b/docs/pairing.md @@ -5,10 +5,8 @@ To use `philtv-js`, you need to import the PhilTVPairing class from the library: ```typescript import { PhilTVPairing } from 'philtv-js'; -// @ts-ignore -process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0; // Disable TLS certificate verification - -const pjs = new PhilTVPairing({ tvIp: '192.168.0.22', apiPort: 1926 }); +// instantiate the class with the TV's IP address. Default port is 1926 +const pjs = new PhilTVPairing({ tvIp: '192.168.0.22' }); // `startPairing` returns a function to prompt for the pin, can be useful const { promptForPin } = await pjs.startPairing(); @@ -34,10 +32,3 @@ Result example of `config`: } ``` You can store the `user` and `password` in a secure location and use them to interact with your TV. - -::: info -Usage of `NODE_TLS_REJECT_UNAUTHORIZED`: -Setting `NODE_TLS_REJECT_UNAUTHORIZED = 0` disables TLS certificate verification, which can expose your application to "man-in-the-middle" attacks. Use it with caution and only in development environments. - -For more information on managing TLS certificates, refer to the Node.js documentation. -::: diff --git a/package.json b/package.json index d6e7418..e7cb8d7 100644 --- a/package.json +++ b/package.json @@ -2,18 +2,34 @@ "name": "philtv-js", "version": "1.0.0", "description": "A simple library to pair and interact with Philips TV", - "main": "dist/index.js", + "main": "dist/index.cjs", + "module": "dist/index.js", "types": "dist/index.d.ts", "type": "module", "engines": { "node": ">=18" }, + "bin": { + "philtv-js-pairing": "./dist/bin/pairing.cjs", + "philtv-js": "./dist/pairing.cjs" + }, "exports": { - ".": "./dist/index.js", + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs" + }, + "./constants": { + "import": "./dist/constants.js", + "require": "./dist/constants.cjs" + }, + "./utils": { + "import": "./dist/utils.js", + "require": "./dist/utils.cjs" + }, "./package.json": "./package.json" }, "scripts": { - "build": "pnpm tsup --dts --clean --minify --format esm src/index.ts", + "build": "tsup", "watch": "pnpm build --watch", "docs:build": "vitepress build docs", "docs:dev": "vitepress dev docs", @@ -26,11 +42,9 @@ }, "dependencies": { "consola": "3.2.3", - "digest-fetch": "3.1.1", - "ky": "1.7.2", - "node-fetch": "3.3.2", + "figlet": "1.8.0", "radash": "12.1.0", - "unstorage": "1.13.1", + "urllib": "4.4.0", "zod": "3.23.8" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec04f82..2ff9884 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,21 +11,15 @@ importers: consola: specifier: 3.2.3 version: 3.2.3 - digest-fetch: - specifier: 3.1.1 - version: 3.1.1 - ky: - specifier: 1.7.2 - version: 1.7.2 - node-fetch: - specifier: 3.3.2 - version: 3.3.2 + figlet: + specifier: 1.8.0 + version: 1.8.0 radash: specifier: 12.1.0 version: 12.1.0 - unstorage: - specifier: 1.13.1 - version: 1.13.1 + urllib: + specifier: 4.4.0 + version: 4.4.0 zod: specifier: 3.23.8 version: 3.23.8 @@ -759,88 +753,6 @@ packages: '@octokit/types@13.6.1': resolution: {integrity: sha512-PHZE9Z+kWXb23Ndik8MKPirBPziOc0D2/3KH1P+6jK5nGWe96kadZuE4jev2/Jq7FvIfTlT2Ltg8Fv2x1v0a5g==} - '@parcel/watcher-android-arm64@2.4.1': - resolution: {integrity: sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [android] - - '@parcel/watcher-darwin-arm64@2.4.1': - resolution: {integrity: sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [darwin] - - '@parcel/watcher-darwin-x64@2.4.1': - resolution: {integrity: sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [darwin] - - '@parcel/watcher-freebsd-x64@2.4.1': - resolution: {integrity: sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [freebsd] - - '@parcel/watcher-linux-arm-glibc@2.4.1': - resolution: {integrity: sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==} - engines: {node: '>= 10.0.0'} - cpu: [arm] - os: [linux] - - '@parcel/watcher-linux-arm64-glibc@2.4.1': - resolution: {integrity: sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-arm64-musl@2.4.1': - resolution: {integrity: sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [linux] - - '@parcel/watcher-linux-x64-glibc@2.4.1': - resolution: {integrity: sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-linux-x64-musl@2.4.1': - resolution: {integrity: sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [linux] - - '@parcel/watcher-wasm@2.4.1': - resolution: {integrity: sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==} - engines: {node: '>= 10.0.0'} - bundledDependencies: - - napi-wasm - - '@parcel/watcher-win32-arm64@2.4.1': - resolution: {integrity: sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==} - engines: {node: '>= 10.0.0'} - cpu: [arm64] - os: [win32] - - '@parcel/watcher-win32-ia32@2.4.1': - resolution: {integrity: sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==} - engines: {node: '>= 10.0.0'} - cpu: [ia32] - os: [win32] - - '@parcel/watcher-win32-x64@2.4.1': - resolution: {integrity: sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==} - engines: {node: '>= 10.0.0'} - cpu: [x64] - os: [win32] - - '@parcel/watcher@2.4.1': - resolution: {integrity: sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==} - engines: {node: '>= 10.0.0'} - '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -857,41 +769,21 @@ packages: resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} engines: {node: '>=12'} - '@rollup/rollup-android-arm-eabi@4.24.0': - resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.24.4': resolution: {integrity: sha512-jfUJrFct/hTA0XDM5p/htWKoNNTbDLY0KRwEt6pyOA6k2fmk0WVwl65PdUdJZgzGEHWx+49LilkcSaumQRyNQw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.24.0': - resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.24.4': resolution: {integrity: sha512-j4nrEO6nHU1nZUuCfRKoCcvh7PIywQPUCBa2UsootTHvTHIoIu2BzueInGJhhvQO/2FTRdNYpf63xsgEqH9IhA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.24.0': - resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.24.4': resolution: {integrity: sha512-GmU/QgGtBTeraKyldC7cDVVvAJEOr3dFLKneez/n7BvX57UdhOqDsVwzU7UOnYA7AAOt+Xb26lk79PldDHgMIQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.24.0': - resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.24.4': resolution: {integrity: sha512-N6oDBiZCBKlwYcsEPXGDE4g9RoxZLK6vT98M8111cW7VsVJFpNEqvJeIPfsCzbf0XEakPslh72X0gnlMi4Ddgg==} cpu: [x64] @@ -907,121 +799,61 @@ packages: cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': - resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.24.4': resolution: {integrity: sha512-10ICosOwYChROdQoQo589N5idQIisxjaFE/PAnX2i0Zr84mY0k9zul1ArH0rnJ/fpgiqfu13TFZR5A5YJLOYZA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.0': - resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.4': resolution: {integrity: sha512-ySAfWs69LYC7QhRDZNKqNhz2UKN8LDfbKSMAEtoEI0jitwfAG2iZwVqGACJT+kfYvvz3/JgsLlcBP+WWoKCLcw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.0': - resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.4': resolution: {integrity: sha512-uHYJ0HNOI6pGEeZ/5mgm5arNVTI0nLlmrbdph+pGXpC9tFHFDQmDMOEqkmUObRfosJqpU8RliYoGz06qSdtcjg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.0': - resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.4': resolution: {integrity: sha512-38yiWLemQf7aLHDgTg85fh3hW9stJ0Muk7+s6tIkSUOMmi4Xbv5pH/5Bofnsb6spIwD5FJiR+jg71f0CH5OzoA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': - resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} - cpu: [ppc64] - os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.4': resolution: {integrity: sha512-q73XUPnkwt9ZNF2xRS4fvneSuaHw2BXuV5rI4cw0fWYVIWIBeDZX7c7FWhFQPNTnE24172K30I+dViWRVD9TwA==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.0': - resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.4': resolution: {integrity: sha512-Aie/TbmQi6UXokJqDZdmTJuZBCU3QBDA8oTKRGtd4ABi/nHgXICulfg1KI6n9/koDsiDbvHAiQO3YAUNa/7BCw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.0': - resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.4': resolution: {integrity: sha512-P8MPErVO/y8ohWSP9JY7lLQ8+YMHfTI4bAdtCi3pC2hTeqFJco2jYspzOzTUB8hwUWIIu1xwOrJE11nP+0JFAQ==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.0': - resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.4': resolution: {integrity: sha512-K03TljaaoPK5FOyNMZAAEmhlyO49LaE4qCsr0lYHUKyb6QacTNF9pnfPpXnFlFD3TXuFbFbz7tJ51FujUXkXYA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.0': - resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.4': resolution: {integrity: sha512-VJYl4xSl/wqG2D5xTYncVWW+26ICV4wubwN9Gs5NrqhJtayikwCXzPL8GDsLnaLU3WwhQ8W02IinYSFJfyo34Q==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.24.0': - resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.24.4': resolution: {integrity: sha512-ku2GvtPwQfCqoPFIJCqZ8o7bJcj+Y54cZSr43hHca6jLwAiCbZdBUOrqE6y29QFajNAzzpIOwsckaTFmN6/8TA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.0': - resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.4': resolution: {integrity: sha512-V3nCe+eTt/W6UYNr/wGvO1fLpHUrnlirlypZfKCT1fG6hWfqhPgQV/K/mRBXBpxc0eKLIF18pIOFVPh0mqHjlg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.0': - resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.4': resolution: {integrity: sha512-LTw1Dfd0mBIEqUVCxbvTE/LLo+9ZxVC9k99v1v4ahg9Aak6FpqOfNu5kRkeTAn0wphoC4JU7No1/rL+bBCEwhg==} cpu: [x64] @@ -1229,11 +1061,6 @@ packages: '@vueuse/shared@11.2.0': resolution: {integrity: sha512-VxFjie0EanOudYSgMErxXfq6fo8vhr5ICI+BuE3I9FnX7ePllEsVrRQ7O6Q1TLgApeLuPKcHQxAXpP+KnlrJsg==} - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - agent-base@7.1.1: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} @@ -1277,10 +1104,6 @@ packages: any-promise@1.3.0: resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -1293,16 +1116,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - base-64@0.1.0: - resolution: {integrity: sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA==} - before-after-hook@3.0.2: resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - birpc@0.2.19: resolution: {integrity: sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==} @@ -1326,6 +1142,10 @@ packages: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -1355,20 +1175,10 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - charenc@0.0.2: - resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - chokidar@4.0.1: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} - citty@0.1.6: - resolution: {integrity: sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==} - clean-stack@2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1386,10 +1196,6 @@ packages: resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} engines: {node: 10.* || >= 12.*} - clipboardy@4.0.0: - resolution: {integrity: sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==} - engines: {node: '>=18'} - cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -1420,9 +1226,6 @@ packages: compare-func@2.0.0: resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -1452,9 +1255,6 @@ packages: resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} engines: {node: '>=12'} - cookie-es@1.2.2: - resolution: {integrity: sha512-+W7VmiVINB+ywl1HGXJXmrqkOhpKrIiVZV6tQuV54ZyQC7MMuBt81Vc336GMLoHBq5hV/F9eXgt5Mnx0Rha5Fg==} - copy-anything@3.0.5: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} @@ -1475,12 +1275,6 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - crossws@0.3.1: - resolution: {integrity: sha512-HsZgeVYaG+b5zA+9PbIPGq4+J/CJynJuearykPsXx4V/eMhyQ5EDVg3Ak2FBZtVXCiOLu/U7IiwDHTr9MA+IKw==} - - crypt@0.0.2: - resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} - crypto-random-string@4.0.0: resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} engines: {node: '>=12'} @@ -1488,10 +1282,6 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - data-uri-to-buffer@4.0.1: - resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} - engines: {node: '>= 12'} - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -1505,27 +1295,21 @@ packages: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - defu@6.1.4: - resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} - destr@2.0.3: - resolution: {integrity: sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==} - - detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} - hasBin: true + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - digest-fetch@3.1.1: - resolution: {integrity: sha512-sfMKKDctvDUTljFnqTBeDl/20vZtKKNZ3XQleht2j3Ky1xuQLuvE9lT+Fvp3EZxJHwAk6RXeEEL4DCmKDSd8xA==} - dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -1568,6 +1352,14 @@ packages: error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + esbuild@0.21.5: resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} engines: {node: '>=12'} @@ -1621,9 +1413,10 @@ packages: picomatch: optional: true - fetch-blob@3.2.0: - resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} - engines: {node: ^12.20 || >= 14.13} + figlet@1.8.0: + resolution: {integrity: sha512-chzvGjd+Sp7KUvPHZv6EXV5Ir3Q7kYNpCr4aHrRW79qFtTefmQZNny+W1pW9kf5zeE6dikku2W50W/wAH2xWgw==} + engines: {node: '>= 0.4.0'} + hasBin: true figures@2.0.0: resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} @@ -1656,9 +1449,8 @@ packages: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} - formdata-polyfill@4.0.10: - resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} - engines: {node: '>=12.20.0'} + formstream@1.5.1: + resolution: {integrity: sha512-q7ORzFqotpwn3Y/GBK2lK7PjtZZwJHz9QE9Phv8zb5IrL9ftGLyi2zjGURON3voK8TaZ+mqJKERYN4lrHYTkUQ==} from2@2.3.0: resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} @@ -1672,6 +1464,9 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@1.0.2: resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} engines: {node: '>=18'} @@ -1680,8 +1475,9 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-port-please@3.1.2: - resolution: {integrity: sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==} + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -1717,15 +1513,15 @@ packages: resolution: {integrity: sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==} engines: {node: '>=18'} + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + graceful-fs@4.2.10: resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - h3@1.13.0: - resolution: {integrity: sha512-vFEAu/yf8UMUcB4s43OaDaigcqpQd14yanmOsn+NcRX3/guSKncyE2rOYhq8RIchgJrPSs/QiIddnTTR1ddiAg==} - handlebars@4.7.8: resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} engines: {node: '>=0.4.7'} @@ -1739,6 +1535,21 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + hast-util-to-html@9.0.3: resolution: {integrity: sha512-M17uBDzMJ9RPCqLMO92gNNUDuBSq10a25SDBI08iCCxmorf4Yy6sYHK57n9WAbRAAaU+DuR4W6GN9K4DFZesYg==} @@ -1770,10 +1581,6 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} - http-shutdown@1.2.2: - resolution: {integrity: sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - https-proxy-agent@7.0.5: resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} engines: {node: '>= 14'} @@ -1823,24 +1630,9 @@ packages: resolution: {integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==} engines: {node: '>=12'} - iron-webcrypto@1.2.1: - resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} - is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-buffer@1.1.6: - resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} - - is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -1853,11 +1645,6 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} - is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -1886,14 +1673,6 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-wsl@3.1.0: - resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} - engines: {node: '>=16'} - - is64bit@2.0.0: - resolution: {integrity: sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==} - engines: {node: '>=18'} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -1919,12 +1698,6 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - js-sha256@0.9.0: - resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} - - js-sha512@0.8.0: - resolution: {integrity: sha512-PWsmefG6Jkodqt+ePTvBZCSMFgN7Clckjd0O7su3I0+BW2QWUTJNzjktHsztGLhncP2h8mcF9V9Y2Ha59pAViQ==} - js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -1941,10 +1714,6 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - ky@1.7.2: - resolution: {integrity: sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg==} - engines: {node: '>=18'} - lilconfig@3.1.2: resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} engines: {node: '>=14'} @@ -1955,10 +1724,6 @@ packages: linkify-it@5.0.0: resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} - listhen@1.9.0: - resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} - hasBin: true - load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -2022,9 +1787,6 @@ packages: engines: {node: '>= 18'} hasBin: true - md5@2.3.0: - resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} - mdast-util-to-hast@13.2.0: resolution: {integrity: sha512-QGYKEuUsYT9ykKBCMOEDLsU5JRObWQusAolFMeko/tYPufNkRffBAQjIE+99jbA87xv6FgmjLtwjh9wBWajwAA==} @@ -2061,9 +1823,17 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} - mime@3.0.0: - resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} - engines: {node: '>=10.0.0'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} hasBin: true mime@4.0.4: @@ -2092,9 +1862,6 @@ packages: mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - mlly@1.7.2: - resolution: {integrity: sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -2112,36 +1879,18 @@ packages: nerf-dart@1.0.0: resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} - node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - - node-domexception@1.0.0: - resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} - engines: {node: '>=10.5.0'} - node-emoji@2.1.3: resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} engines: {node: '>=18'} - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - - node-fetch@3.3.2: - resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} + node-hex@1.0.1: + resolution: {integrity: sha512-iwpZdvW6Umz12ICmu9IYPRxg0tOLGmU3Tq2tKetejCj3oZd7b2nUXwP3a7QA5M9glWy8wlPS1G3RwM/CdsUbdQ==} + engines: {node: '>=8.0.0'} normalize-package-data@6.0.2: resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} engines: {node: ^16.14.0 || >=18.0.0} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - normalize-url@8.0.1: resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} engines: {node: '>=14.16'} @@ -2232,11 +1981,9 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - ofetch@1.4.1: - resolution: {integrity: sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==} - - ohash@1.1.4: - resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + object-inspect@1.13.3: + resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} + engines: {node: '>= 0.4'} onetime@6.0.0: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} @@ -2333,8 +2080,8 @@ packages: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pause-stream@0.0.11: + resolution: {integrity: sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==} perfect-debounce@1.0.0: resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} @@ -2362,9 +2109,6 @@ packages: resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} engines: {node: '>=4'} - pkg-types@1.2.1: - resolution: {integrity: sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==} - postcss-load-config@6.0.1: resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==} engines: {node: '>= 18'} @@ -2411,6 +2155,10 @@ packages: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} + qs@6.13.0: + resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} + engines: {node: '>=0.6'} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -2418,9 +2166,6 @@ packages: resolution: {integrity: sha512-b0Zcf09AhqKS83btmUeYBS8tFK7XL2e3RvLmZcm0sTdF1/UUlHSsjXdCcWNxe7yfmAlPve5ym0DmKGtTzP6kVQ==} engines: {node: '>=14.18.0'} - radix3@1.1.2: - resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} - rc@1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -2436,10 +2181,6 @@ packages: readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - readdirp@4.0.2: resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} @@ -2473,11 +2214,6 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rollup@4.24.0: - resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.24.4: resolution: {integrity: sha512-vGorVWIsWfX3xbcyAS+I047kFKapHYivmkaT63Smj77XwvLSJos6M1xGqZnBPFQFBRZDOcG1QnYEIxAvTr/HjA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -2510,6 +2246,10 @@ packages: engines: {node: '>=10'} hasBin: true + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -2521,6 +2261,10 @@ packages: shiki@1.22.2: resolution: {integrity: sha512-3IZau0NdGKXhH2bBlUk4w1IHNxPh6A5B2sUpyY+8utLu2j/h1QpFkAaUA1bAMxOWWGtTWcAh531vnS4NJKS/lA==} + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -2574,9 +2318,6 @@ packages: split2@1.0.0: resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} @@ -2643,10 +2384,6 @@ packages: resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} engines: {node: '>=14.18'} - system-architecture@0.1.0: - resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} - engines: {node: '>=18'} - tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} @@ -2668,6 +2405,9 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + time-span@5.1.0: resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} engines: {node: '>=12'} @@ -2762,22 +2502,17 @@ packages: uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true - uncrypto@0.1.3: - resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} - undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - unenv@1.10.0: - resolution: {integrity: sha512-wY5bskBQFL9n3Eca5XnhH6KbUo/tfvkwm9OpcdCvLaeA7piBNbavbOKJySEwQ1V0RH6HvNlSAFRTpvTqgKRQXQ==} + undici@6.20.1: + resolution: {integrity: sha512-AjQF1QsmqfJys+LXfGTNum+qw4S88CojRInG/6t31W/1fk6G59s92bnAvGz5Cmur+kQv2SURXEvvudLmbrE8QA==} + engines: {node: '>=18.17'} unicode-emoji-modifier-base@1.0.0: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} @@ -2817,61 +2552,14 @@ packages: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} - unstorage@1.13.1: - resolution: {integrity: sha512-ELexQHUrG05QVIM/iUeQNdl9FXDZhqLJ4yP59fnmn2jGUh0TEulwOgov1ubOb3Gt2ZGK/VMchJwPDNVEGWQpRg==} - peerDependencies: - '@azure/app-configuration': ^1.7.0 - '@azure/cosmos': ^4.1.1 - '@azure/data-tables': ^13.2.2 - '@azure/identity': ^4.5.0 - '@azure/keyvault-secrets': ^4.9.0 - '@azure/storage-blob': ^12.25.0 - '@capacitor/preferences': ^6.0.2 - '@netlify/blobs': ^6.5.0 || ^7.0.0 || ^8.1.0 - '@planetscale/database': ^1.19.0 - '@upstash/redis': ^1.34.3 - '@vercel/kv': ^1.0.1 - idb-keyval: ^6.2.1 - ioredis: ^5.4.1 - peerDependenciesMeta: - '@azure/app-configuration': - optional: true - '@azure/cosmos': - optional: true - '@azure/data-tables': - optional: true - '@azure/identity': - optional: true - '@azure/keyvault-secrets': - optional: true - '@azure/storage-blob': - optional: true - '@capacitor/preferences': - optional: true - '@netlify/blobs': - optional: true - '@planetscale/database': - optional: true - '@upstash/redis': - optional: true - '@vercel/kv': - optional: true - idb-keyval: - optional: true - ioredis: - optional: true - - untun@0.1.3: - resolution: {integrity: sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==} - hasBin: true - - uqr@0.1.2: - resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} - url-join@5.0.0: resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + urllib@4.4.0: + resolution: {integrity: sha512-q5RQ0Wt3H4DXVFQZFiEzlrL0IEtJ7bIot9yyQ9otAhh0XTxdZMI9xkmv4COFnb1wICcyc+bpagl3QND3AF46Cw==} + engines: {node: '>= 18.19.0'} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} @@ -2946,10 +2634,6 @@ packages: typescript: optional: true - web-streams-polyfill@3.3.3: - resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} - engines: {node: '>= 8'} - webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -3001,6 +2685,10 @@ packages: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} + ylru@2.0.0: + resolution: {integrity: sha512-T6hTrKcr9lKeUG0MQ/tO72D3UGptWVohgzpHG8ljU1jeBt2RCjcWxvsTPD8ZzUq1t1FvwROAw1kxg2euvg/THg==} + engines: {node: '>= 18.19.0'} + yoctocolors@2.1.1: resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} engines: {node: '>=18'} @@ -3513,67 +3201,6 @@ snapshots: dependencies: '@octokit/openapi-types': 22.2.0 - '@parcel/watcher-android-arm64@2.4.1': - optional: true - - '@parcel/watcher-darwin-arm64@2.4.1': - optional: true - - '@parcel/watcher-darwin-x64@2.4.1': - optional: true - - '@parcel/watcher-freebsd-x64@2.4.1': - optional: true - - '@parcel/watcher-linux-arm-glibc@2.4.1': - optional: true - - '@parcel/watcher-linux-arm64-glibc@2.4.1': - optional: true - - '@parcel/watcher-linux-arm64-musl@2.4.1': - optional: true - - '@parcel/watcher-linux-x64-glibc@2.4.1': - optional: true - - '@parcel/watcher-linux-x64-musl@2.4.1': - optional: true - - '@parcel/watcher-wasm@2.4.1': - dependencies: - is-glob: 4.0.3 - micromatch: 4.0.8 - - '@parcel/watcher-win32-arm64@2.4.1': - optional: true - - '@parcel/watcher-win32-ia32@2.4.1': - optional: true - - '@parcel/watcher-win32-x64@2.4.1': - optional: true - - '@parcel/watcher@2.4.1': - dependencies: - detect-libc: 1.0.3 - is-glob: 4.0.3 - micromatch: 4.0.8 - node-addon-api: 7.1.1 - optionalDependencies: - '@parcel/watcher-android-arm64': 2.4.1 - '@parcel/watcher-darwin-arm64': 2.4.1 - '@parcel/watcher-darwin-x64': 2.4.1 - '@parcel/watcher-freebsd-x64': 2.4.1 - '@parcel/watcher-linux-arm-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-glibc': 2.4.1 - '@parcel/watcher-linux-arm64-musl': 2.4.1 - '@parcel/watcher-linux-x64-glibc': 2.4.1 - '@parcel/watcher-linux-x64-musl': 2.4.1 - '@parcel/watcher-win32-arm64': 2.4.1 - '@parcel/watcher-win32-ia32': 2.4.1 - '@parcel/watcher-win32-x64': 2.4.1 - '@pkgjs/parseargs@0.11.0': optional: true @@ -3589,27 +3216,15 @@ snapshots: '@pnpm/network.ca-file': 1.0.2 config-chain: 1.1.13 - '@rollup/rollup-android-arm-eabi@4.24.0': - optional: true - '@rollup/rollup-android-arm-eabi@4.24.4': optional: true - '@rollup/rollup-android-arm64@4.24.0': - optional: true - '@rollup/rollup-android-arm64@4.24.4': optional: true - '@rollup/rollup-darwin-arm64@4.24.0': - optional: true - '@rollup/rollup-darwin-arm64@4.24.4': optional: true - '@rollup/rollup-darwin-x64@4.24.0': - optional: true - '@rollup/rollup-darwin-x64@4.24.4': optional: true @@ -3619,75 +3234,39 @@ snapshots: '@rollup/rollup-freebsd-x64@4.24.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.0': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.0': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.24.0': - optional: true - '@rollup/rollup-linux-arm64-musl@4.24.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': - optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.0': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.0': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.24.0': - optional: true - '@rollup/rollup-linux-x64-gnu@4.24.4': optional: true - '@rollup/rollup-linux-x64-musl@4.24.0': - optional: true - '@rollup/rollup-linux-x64-musl@4.24.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.0': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.0': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.24.0': - optional: true - '@rollup/rollup-win32-x64-msvc@4.24.4': optional: true @@ -3951,8 +3530,6 @@ snapshots: - '@vue/composition-api' - vue - acorn@8.14.0: {} - agent-base@7.1.1: dependencies: debug: 4.3.7 @@ -4005,11 +3582,6 @@ snapshots: any-promise@1.3.0: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - argparse@2.0.1: {} argv-formatter@1.0.0: {} @@ -4018,12 +3590,8 @@ snapshots: balanced-match@1.0.2: {} - base-64@0.1.0: {} - before-after-hook@3.0.2: {} - binary-extensions@2.3.0: {} - birpc@0.2.19: {} bottleneck@2.19.5: {} @@ -4043,6 +3611,14 @@ snapshots: cac@6.7.14: {} + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + callsites@3.1.0: {} ccount@2.0.1: {} @@ -4066,28 +3642,10 @@ snapshots: character-entities-legacy@3.0.0: {} - charenc@0.0.2: {} - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - chokidar@4.0.1: dependencies: readdirp: 4.0.2 - citty@0.1.6: - dependencies: - consola: 3.2.3 - clean-stack@2.2.0: {} clean-stack@5.2.0: @@ -4109,12 +3667,6 @@ snapshots: optionalDependencies: '@colors/colors': 1.5.0 - clipboardy@4.0.0: - dependencies: - execa: 8.0.1 - is-wsl: 3.1.0 - is64bit: 2.0.0 - cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -4148,8 +3700,6 @@ snapshots: array-ify: 1.0.0 dot-prop: 5.3.0 - confbox@0.1.8: {} - config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -4177,8 +3727,6 @@ snapshots: convert-hrtime@5.0.0: {} - cookie-es@1.2.2: {} - copy-anything@3.0.5: dependencies: is-what: 4.1.16 @@ -4200,45 +3748,32 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - crossws@0.3.1: - dependencies: - uncrypto: 0.1.3 - - crypt@0.0.2: {} - crypto-random-string@4.0.0: dependencies: type-fest: 1.4.0 csstype@3.1.3: {} - data-uri-to-buffer@4.0.1: {} - debug@4.3.7: dependencies: ms: 2.1.3 deep-extend@0.6.0: {} - defu@6.1.4: {} + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 dequal@2.0.3: {} - destr@2.0.3: {} - - detect-libc@1.0.3: {} + destroy@1.2.0: {} devlop@1.1.0: dependencies: dequal: 2.0.3 - digest-fetch@3.1.1: - dependencies: - base-64: 0.1.0 - js-sha256: 0.9.0 - js-sha512: 0.8.0 - md5: 2.3.0 - dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -4274,6 +3809,12 @@ snapshots: dependencies: is-arrayish: 0.2.1 + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + esbuild@0.21.5: optionalDependencies: '@esbuild/aix-ppc64': 0.21.5 @@ -4405,10 +3946,7 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fetch-blob@3.2.0: - dependencies: - node-domexception: 1.0.0 - web-streams-polyfill: 3.3.3 + figlet@1.8.0: {} figures@2.0.0: dependencies: @@ -4442,9 +3980,12 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 - formdata-polyfill@4.0.10: + formstream@1.5.1: dependencies: - fetch-blob: 3.2.0 + destroy: 1.2.0 + mime: 2.6.0 + node-hex: 1.0.1 + pause-stream: 0.0.11 from2@2.3.0: dependencies: @@ -4460,11 +4001,19 @@ snapshots: fsevents@2.3.3: optional: true + function-bind@1.1.2: {} + function-timeout@1.0.2: {} get-caller-file@2.0.5: {} - get-port-please@3.1.2: {} + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 get-stream@6.0.1: {} @@ -4512,23 +4061,14 @@ snapshots: slash: 5.1.0 unicorn-magic: 0.1.0 + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + graceful-fs@4.2.10: {} graceful-fs@4.2.11: {} - h3@1.13.0: - dependencies: - cookie-es: 1.2.2 - crossws: 0.3.1 - defu: 6.1.4 - destr: 2.0.3 - iron-webcrypto: 1.2.1 - ohash: 1.1.4 - radix3: 1.1.2 - ufo: 1.5.4 - uncrypto: 0.1.3 - unenv: 1.10.0 - handlebars@4.7.8: dependencies: minimist: 1.2.8 @@ -4542,6 +4082,18 @@ snapshots: has-flag@4.0.0: {} + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + hast-util-to-html@9.0.3: dependencies: '@types/hast': 3.0.4 @@ -4583,8 +4135,6 @@ snapshots: transitivePeerDependencies: - supports-color - http-shutdown@1.2.2: {} - https-proxy-agent@7.0.5: dependencies: agent-base: 7.1.1 @@ -4627,18 +4177,8 @@ snapshots: from2: 2.3.0 p-is-promise: 3.0.0 - iron-webcrypto@1.2.1: {} - is-arrayish@0.2.1: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-buffer@1.1.6: {} - - is-docker@3.0.0: {} - is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -4647,10 +4187,6 @@ snapshots: dependencies: is-extglob: 2.1.1 - is-inside-container@1.0.0: - dependencies: - is-docker: 3.0.0 - is-number@7.0.0: {} is-obj@2.0.0: {} @@ -4665,14 +4201,6 @@ snapshots: is-what@4.1.16: {} - is-wsl@3.1.0: - dependencies: - is-inside-container: 1.0.0 - - is64bit@2.0.0: - dependencies: - system-architecture: 0.1.0 - isarray@1.0.0: {} isexe@2.0.0: {} @@ -4693,14 +4221,11 @@ snapshots: java-properties@1.0.2: {} - jiti@2.4.0: {} + jiti@2.4.0: + optional: true joycon@3.1.1: {} - js-sha256@0.9.0: {} - - js-sha512@0.8.0: {} - js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -4717,8 +4242,6 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 - ky@1.7.2: {} - lilconfig@3.1.2: {} lines-and-columns@1.2.4: {} @@ -4727,27 +4250,6 @@ snapshots: dependencies: uc.micro: 2.1.0 - listhen@1.9.0: - dependencies: - '@parcel/watcher': 2.4.1 - '@parcel/watcher-wasm': 2.4.1 - citty: 0.1.6 - clipboardy: 4.0.0 - consola: 3.2.3 - crossws: 0.3.1 - defu: 6.1.4 - get-port-please: 3.1.2 - h3: 1.13.0 - http-shutdown: 1.2.2 - jiti: 2.4.0 - mlly: 1.7.2 - node-forge: 1.3.1 - pathe: 1.1.2 - std-env: 3.7.0 - ufo: 1.5.4 - untun: 0.1.3 - uqr: 0.1.2 - load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 @@ -4810,12 +4312,6 @@ snapshots: marked@12.0.2: {} - md5@2.3.0: - dependencies: - charenc: 0.0.2 - crypt: 0.0.2 - is-buffer: 1.1.6 - mdast-util-to-hast@13.2.0: dependencies: '@types/hast': 3.0.4 @@ -4858,7 +4354,13 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 - mime@3.0.0: {} + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@2.6.0: {} mime@4.0.4: {} @@ -4876,13 +4378,6 @@ snapshots: mitt@3.0.1: {} - mlly@1.7.2: - dependencies: - acorn: 8.14.0 - pathe: 1.1.2 - pkg-types: 1.2.1 - ufo: 1.5.4 - ms@2.1.3: {} mz@2.7.0: @@ -4897,10 +4392,6 @@ snapshots: nerf-dart@1.0.0: {} - node-addon-api@7.1.1: {} - - node-domexception@1.0.0: {} - node-emoji@2.1.3: dependencies: '@sindresorhus/is': 4.6.0 @@ -4908,15 +4399,7 @@ snapshots: emojilib: 2.4.0 skin-tone: 2.0.0 - node-fetch-native@1.6.4: {} - - node-fetch@3.3.2: - dependencies: - data-uri-to-buffer: 4.0.1 - fetch-blob: 3.2.0 - formdata-polyfill: 4.0.10 - - node-forge@1.3.1: {} + node-hex@1.0.1: {} normalize-package-data@6.0.2: dependencies: @@ -4924,8 +4407,6 @@ snapshots: semver: 7.6.3 validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - normalize-url@8.0.1: {} npm-run-path@5.3.0: @@ -4941,13 +4422,7 @@ snapshots: object-assign@4.1.1: {} - ofetch@1.4.1: - dependencies: - destr: 2.0.3 - node-fetch-native: 1.6.4 - ufo: 1.5.4 - - ohash@1.1.4: {} + object-inspect@1.13.3: {} onetime@6.0.0: dependencies: @@ -5028,7 +4503,9 @@ snapshots: path-type@5.0.0: {} - pathe@1.1.2: {} + pause-stream@0.0.11: + dependencies: + through: 2.3.8 perfect-debounce@1.0.0: {} @@ -5047,12 +4524,6 @@ snapshots: find-up: 2.1.0 load-json-file: 4.0.0 - pkg-types@1.2.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.2 - pathe: 1.1.2 - postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.47)(tsx@4.19.2)(yaml@2.6.0): dependencies: lilconfig: 3.1.2 @@ -5084,12 +4555,14 @@ snapshots: punycode@2.3.1: {} + qs@6.13.0: + dependencies: + side-channel: 1.0.6 + queue-microtask@1.2.3: {} radash@12.1.0: {} - radix3@1.1.2: {} - rc@1.2.8: dependencies: deep-extend: 0.6.0 @@ -5121,10 +4594,6 @@ snapshots: string_decoder: 1.1.1 util-deprecate: 1.0.2 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - readdirp@4.0.2: {} regex@4.4.0: {} @@ -5145,28 +4614,6 @@ snapshots: rfdc@1.4.1: {} - rollup@4.24.0: - dependencies: - '@types/estree': 1.0.6 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.24.0 - '@rollup/rollup-android-arm64': 4.24.0 - '@rollup/rollup-darwin-arm64': 4.24.0 - '@rollup/rollup-darwin-x64': 4.24.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 - '@rollup/rollup-linux-arm-musleabihf': 4.24.0 - '@rollup/rollup-linux-arm64-gnu': 4.24.0 - '@rollup/rollup-linux-arm64-musl': 4.24.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 - '@rollup/rollup-linux-riscv64-gnu': 4.24.0 - '@rollup/rollup-linux-s390x-gnu': 4.24.0 - '@rollup/rollup-linux-x64-gnu': 4.24.0 - '@rollup/rollup-linux-x64-musl': 4.24.0 - '@rollup/rollup-win32-arm64-msvc': 4.24.0 - '@rollup/rollup-win32-ia32-msvc': 4.24.0 - '@rollup/rollup-win32-x64-msvc': 4.24.0 - fsevents: 2.3.3 - rollup@4.24.4: dependencies: '@types/estree': 1.0.6 @@ -5242,6 +4689,15 @@ snapshots: semver@7.6.3: {} + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -5257,6 +4713,13 @@ snapshots: '@shikijs/vscode-textmate': 9.3.0 '@types/hast': 3.0.4 + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.3 + signal-exit@4.1.0: {} signale@1.4.0: @@ -5303,8 +4766,6 @@ snapshots: dependencies: through2: 2.0.5 - std-env@3.7.0: {} - stream-combiner2@1.1.1: dependencies: duplexer2: 0.1.4 @@ -5379,8 +4840,6 @@ snapshots: has-flag: 4.0.0 supports-color: 7.2.0 - system-architecture@0.1.0: {} - tabbable@6.2.0: {} temp-dir@3.0.0: {} @@ -5405,6 +4864,8 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 + through@2.3.8: {} + time-span@5.1.0: dependencies: convert-hrtime: 5.0.0 @@ -5444,7 +4905,7 @@ snapshots: picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.4.0)(postcss@8.4.47)(tsx@4.19.2)(yaml@2.6.0) resolve-from: 5.0.0 - rollup: 4.24.0 + rollup: 4.24.4 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.1 @@ -5493,22 +4954,12 @@ snapshots: uc.micro@2.1.0: {} - ufo@1.5.4: {} - uglify-js@3.19.3: optional: true - uncrypto@0.1.3: {} - undici-types@6.19.8: {} - unenv@1.10.0: - dependencies: - consola: 3.2.3 - defu: 6.1.4 - mime: 3.0.0 - node-fetch-native: 1.6.4 - pathe: 1.1.2 + undici@6.20.1: {} unicode-emoji-modifier-base@1.0.0: {} @@ -5547,28 +4998,16 @@ snapshots: universalify@2.0.1: {} - unstorage@1.13.1: - dependencies: - anymatch: 3.1.3 - chokidar: 3.6.0 - citty: 0.1.6 - destr: 2.0.3 - h3: 1.13.0 - listhen: 1.9.0 - lru-cache: 10.4.3 - node-fetch-native: 1.6.4 - ofetch: 1.4.1 - ufo: 1.5.4 + url-join@5.0.0: {} - untun@0.1.3: + urllib@4.4.0: dependencies: - citty: 0.1.6 - consola: 3.2.3 - pathe: 1.1.2 - - uqr@0.1.2: {} - - url-join@5.0.0: {} + formstream: 1.5.1 + mime-types: 2.1.35 + qs: 6.13.0 + type-fest: 4.26.1 + undici: 6.20.1 + ylru: 2.0.0 util-deprecate@1.0.2: {} @@ -5659,8 +5098,6 @@ snapshots: optionalDependencies: typescript: 5.6.3 - web-streams-polyfill@3.3.3: {} - webidl-conversions@4.0.2: {} whatwg-url@7.1.0: @@ -5717,6 +5154,8 @@ snapshots: y18n: 5.0.8 yargs-parser: 21.1.1 + ylru@2.0.0: {} + yoctocolors@2.1.1: {} zod@3.23.8: {} diff --git a/src/bin/pairing.ts b/src/bin/pairing.ts new file mode 100644 index 0000000..da86536 --- /dev/null +++ b/src/bin/pairing.ts @@ -0,0 +1,42 @@ +import { consola } from 'consola'; +// @ts-ignore +import figlet from 'figlet'; +import { PhilTVPairing } from '../lib/PhilTVPairing'; + +async function runPairing() { + figlet('philtv-js', (err: any, data: any) => { + if (err) { + console.log('Something went wrong...'); + console.dir(err); + return; + } + console.log(data); + }); + + const promptForIp = async () => + await consola.prompt('Enter TV ip address:', { + type: 'text', + }); + + const ipAddress = await promptForIp(); + + console.log('promptForIp', ipAddress); + + const pjs = new PhilTVPairing({ tvIp: ipAddress }); + + // `startPairing` returns a function to prompt for the pin, can be useful + const { promptForPin } = await pjs.startPairing(); + const pin = await promptForPin(); + + // `completePairing` returns the configuration object, or an error + const [error, config] = await pjs.completePairing(pin); + + if (!error) { + consola.success('Pairing successful'); + consola.box(JSON.stringify(config, null, 2)); + } else { + consola.error(`${error.message}\nBye.`); + } +} + +runPairing(); diff --git a/src/constants/index.ts b/src/constants/index.ts index 141a539..9ec3dec 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -1 +1,2 @@ export const JS_SECRET_KEY = 'ZmVay1EQVFOaZhwQ4Kv81ypLAZNczV9sG4KkseXWn1NEk6cXmPKO/MCa9sryslvLCFMnNe4Z4CPXzToowvhHvA=='; +export * from './jointspace'; diff --git a/src/constants/jointspace.ts b/src/constants/jointspace.ts new file mode 100644 index 0000000..71051e5 --- /dev/null +++ b/src/constants/jointspace.ts @@ -0,0 +1,72 @@ +const inputKeys = [ + 'Adjust', + 'AmbilightOnOff', + 'Back', + 'BlueColour', + 'ChannelStepDown', + 'ChannelStepUp', + 'Confirm', + 'CursorDown', + 'CursorLeft', + 'CursorRight', + 'CursorUp', + 'Digit0', + 'Digit1', + 'Digit2', + 'Digit3', + 'Digit4', + 'Digit5', + 'Digit6', + 'Digit7', + 'Digit8', + 'Digit9', + 'Dot', + 'FastForward', + 'Find', + 'GreenColour', + 'Home', + 'Info', + 'Mute', + 'Next', + 'Online', + 'Options', + 'Pause', + 'PlayPause', + 'Previous', + 'Record', + 'RedColour', + 'Rewind', + 'Source', + 'Standby', + 'Stop', + 'Subtitle', + 'Teletext', + 'Viewmode', + 'VolumeDown', + 'VolumeUp', + 'WatchTV', + 'YellowColour', +] as const; + +const ambilightFollowVideoModeEnum = ['COMFORT', 'GAME', 'IMMERSIVE', 'NATURAL', 'RELAX', 'STANDARD', 'VIVID'] as const; + +const ambilightFollowAudioModeEnum = [ + 'ENERGY_ADAPTIVE_BRIGHTNESS', + 'ENERGY_ADAPTIVE_COLORS', + 'KNIGHT_RIDER_ALTERNATING', + 'MODE_RANDOM', + 'RANDOM_PIXEL_FLASH', + 'SPECTRUM_ANALYSER', + 'VU_METER', +] as const; + +const ambilightChangeBrightnessAvailableValues = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'increase', 'decrease'] as const; + +export const JOINTSPACE_CONSTANTS = { + ambilight: { + followAudioMode: ambilightFollowAudioModeEnum, + followVideoMode: ambilightFollowVideoModeEnum, + brightnessAvailableValues: ambilightChangeBrightnessAvailableValues, + }, + inputKeys, +} as const; diff --git a/src/http-clients/index.ts b/src/http-clients/index.ts index f7796e4..8385dd3 100644 --- a/src/http-clients/index.ts +++ b/src/http-clients/index.ts @@ -1,26 +1,56 @@ -import DigestClient from 'digest-fetch'; -import ky from 'ky'; - -export function createKyDigestClient(baseURL: string, username: string, password: string) { - const digestClient = new DigestClient(username, password); - - return ky.create({ - throwHttpErrors: true, - prefixUrl: baseURL, - hooks: { - beforeRequest: [ - async (request) => { - const authResponse = await digestClient.fetch(request.url, { - method: request.method, - headers: request.headers, - }); - - const authorizationHeader = authResponse.headers.get('authorization'); - if (authorizationHeader) { - request.headers.set('authorization', authorizationHeader); - } - }, - ], +import { tryit } from 'radash'; +import { HttpClient, type RequestOptions } from 'urllib'; + +type GetHttpDigestClient = { + user: string; + password: string; + baseUrl: string; + options?: { + rejectUnauthorized?: boolean; + }; +}; + +export async function handleRequest(url: string, baseUrl: string, client: HttpClient, reqOptions: RequestOptions = {}) { + const fullUrl = `${baseUrl}/${url}`; + + const resp = await client.request(fullUrl, reqOptions); + + const ok = resp.status >= 200 && resp.status < 300; + + if (!ok) { + return [new Error(`Request failed with status ${resp.status} (${resp.url})`), undefined, resp] as const; + } + + const [errJsonParse, triedJson] = await tryit(JSON.parse)(resp.data.toString()); + const realData = !errJsonParse ? triedJson : resp.data.toString(); + + return [undefined, realData, { ok, ...resp, data: realData }] as const; +} + +export function getHttpDigestClient(config: GetHttpDigestClient) { + const client = new HttpClient({ + connect: { + rejectUnauthorized: config?.options?.rejectUnauthorized ?? false, + }, + defaultArgs: { + digestAuth: `${config.user}:${config.password}`, + contentType: 'json', + }, + }); + + return { + client, + request: (url: string, reqOptions: RequestOptions = {}) => handleRequest(url, config.baseUrl, client, reqOptions), + }; +} + +export function getHttpClient() { + return new HttpClient({ + connect: { + rejectUnauthorized: false, + }, + defaultArgs: { + contentType: 'json', }, }); } diff --git a/src/index.ts b/src/index.ts index 40e1349..90531d0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ export { PhilTVPairing } from './lib/PhilTVPairing'; export { PhilTVApi } from './lib/PhilTVApi'; export type * from './types'; +export type * from './lib/PhilTVPairing'; diff --git a/src/lib/PhilTVApi.ts b/src/lib/PhilTVApi.ts index 73096d0..3422ecf 100644 --- a/src/lib/PhilTVApi.ts +++ b/src/lib/PhilTVApi.ts @@ -1,21 +1,20 @@ -import { get, tryit } from 'radash'; +import { get } from 'radash'; import { z } from 'zod'; -import { - type AmbilightFollowAudioMode, - AmbilightFollowAudioModeEnum, - type AmbilightFollowVideoMode, - AmbilightFollowVideoModeEnum, - type InputKeys, -} from '../types/jointspace'; +import { JOINTSPACE_CONSTANTS } from '../constants'; +import type { AmbilightFollowAudioMode, AmbilightFollowVideoMode, InputKeys } from '../types/jointspace'; import { PhilTVApiBase } from './PhilTVApiBase'; export class PhilTVApi extends PhilTVApiBase { - getSystem() { - return tryit(this.digestClient.get('system').json)(); - } - - getAmbilightConfiguration() { - return tryit(this.digestClient.get('ambilight/currentconfiguration').json)(); + async getSystem() { + const [err, data, resp] = await this.digestClient.request('system'); + + return [ + err, + { + ...data, + fullApiVersion: `${data.api_version.Major}.${data.api_version.Minor}.${data.api_version.Patch}`, + }, + ] as const; } async setAmbilightBrightness(brightness: number) { @@ -24,17 +23,42 @@ export class PhilTVApi extends PhilTVApiBase { }); } - async changeAmbilightBrightness(move: 'increase' | 'decrease') { - const [, currentBrightness] = await this.getAmbilightBrightness(); + async changeAmbilightBrightness(move: string | number) { + const [, currentBrightness] = await this.getAmbilightBrightnessValue(); + + const realValue = (Number.isNaN(Number(move)) ? move : Number(move)) as any; + + const isValid = JOINTSPACE_CONSTANTS.ambilight.brightnessAvailableValues.includes(realValue); + + if (!isValid) { + return this.renderResponse(new Error('Invalid value'), undefined); + } + + if (typeof realValue === 'string') { + const computedBrightness = + realValue === 'increase' ? Number(currentBrightness) + 1 : Number(currentBrightness) - 1; + const realBrightness = Math.min(10, Math.max(0, computedBrightness)); + + return this.setAmbilightBrightness(realBrightness); + } + + return this.setAmbilightBrightness(realValue); + } + + increaseAmbilightBrightness() { + return this.changeAmbilightBrightness('increase'); + } - const computedBrightness = move === 'increase' ? Number(currentBrightness) + 1 : Number(currentBrightness) - 1; - const realBrightness = Math.min(10, Math.max(0, computedBrightness)); + decreaseAmbilightBrightness() { + return this.changeAmbilightBrightness('decrease'); + } - return this.setAmbilightBrightness(realBrightness); + getAmbilightConfiguration() { + return this.digestClient.request('ambilight/currentconfiguration'); } - async getAmbilightBrightness() { - const [errorGetStructureItem, item] = await this.getMenuStructureItems('ambilight_brightness'); + async getAmbilightBrightnessInformation() { + const [errorGetStructureItem, item] = await this.getMenuStructureItemByContext('ambilight_brightness'); if (errorGetStructureItem) { return this.renderResponse(errorGetStructureItem, undefined); @@ -47,12 +71,55 @@ export class PhilTVApi extends PhilTVApiBase { return this.renderResponse(errCurrentSetting, undefined); } - return [undefined, Number(get(values, '0.value.data.value'))] as const; + return [undefined, get(values, '0.value', undefined)] as const; + } + + async getAmbilightBrightnessValue() { + const [err, info] = await this.getAmbilightBrightnessInformation(); + + return [err, Number(get(info, 'data.value', undefined))] as const; + } + + getAmbilightMode() { + return this.digestClient.request('ambilight/mode'); + } + + async getAmbilightFullInformation() { + const [ + getAmbilightConfiguration, + getAmbilightBrightnessInformation, + getAmbilightMode, + getAmbilightCached, + getAmbiHue, + ] = await Promise.all([ + this.getAmbilightConfiguration(), + this.getAmbilightBrightnessInformation(), + this.getAmbilightMode(), + this.getAmbilightCached(), + this.getAmbiHue(), + ]); + + const [err1, ambilightConfiguration] = getAmbilightConfiguration; + const [err2, ambilightBrightnessInformation] = getAmbilightBrightnessInformation; + const [err3, ambilightMode] = getAmbilightMode; + const [err4, ambilightCached] = getAmbilightCached; + const [err5, ambiHue] = getAmbiHue; + + const result = { + configuration: ambilightConfiguration, + mode: ambilightMode, + brightness: ambilightBrightnessInformation, + cached: ambilightCached, + ambiHue, + }; + + return [err1 || err2 || err3 || err4 || err5, result] as const; } protected async setAmbilightCurrentConfiguration(options: Record) { - return tryit(this.digestClient.post)('ambilight/currentconfiguration', { - json: { + return this.digestClient.request('ambilight/currentconfiguration', { + method: 'POST', + data: { styleName: options?.styleName, isExpert: options?.isExpert ?? false, menuSetting: options?.menuSetting, @@ -61,7 +128,7 @@ export class PhilTVApi extends PhilTVApiBase { } async setAmbilightFollowVideoMode(mode: AmbilightFollowVideoMode) { - const validator = z.enum(AmbilightFollowVideoModeEnum).safeParse(mode); + const validator = z.enum(JOINTSPACE_CONSTANTS.ambilight.followVideoMode).safeParse(mode); if (validator.error) { return this.renderResponse(validator.error, undefined); @@ -74,7 +141,7 @@ export class PhilTVApi extends PhilTVApiBase { } async setAmbilightFollowAudioMode(mode: AmbilightFollowAudioMode) { - const validator = z.enum(AmbilightFollowAudioModeEnum).safeParse(mode); + const validator = z.enum(JOINTSPACE_CONSTANTS.ambilight.followAudioMode).safeParse(mode); if (validator.error) { return this.renderResponse(validator.error, undefined); @@ -86,56 +153,45 @@ export class PhilTVApi extends PhilTVApiBase { }); } - getAmbilightMode() { - return tryit(this.digestClient.get('ambilight/mode').json)(); - } - setAmbilightMode(mode: 'manual' | 'internal' | 'expert') { - return this.digestClient.post('ambilight/mode', { - json: { + return this.digestClient.request('ambilight/mode', { + method: 'POST', + data: { current: mode, }, }); } getAmbilightCached() { - return tryit(this.digestClient.get('ambilight/cached').json)(); - } - - getSource() { - return tryit(this.digestClient.get('sources/current').json)(); - } - - getChannels() { - return tryit(this.digestClient.get('channeldb/tv/channelLists/all').json)(); + return this.digestClient.request('ambilight/cached'); } getCurrentActivity() { - return tryit(this.digestClient.get('activities/current').json)(); + return this.digestClient.request('activities/current'); } getApplications() { - return tryit(this.digestClient.get('applications').json)(); + return this.digestClient.request('applications'); } sendKey(key: InputKeys) { - return this.digestClient.post('input/key', { - json: { key: key }, + return this.digestClient.request('input/key', { + method: 'POST', + data: { + key: key, + }, }); } getAmbiHue() { - return tryit(this.digestClient.get('HueLamp/power').json)(); + return this.digestClient.request('HueLamp/power'); } async getCurrentSetting(nodeId: number) { - const node: any = await this.digestClient - .post('menuitems/settings/current', { - json: { - nodes: [{ nodeid: nodeId }], - }, - }) - .json(); + const [, node] = await this.digestClient.request('menuitems/settings/current', { + method: 'POST', + data: { nodes: [{ nodeid: nodeId }] }, + }); const values = node?.values as any[]; const hasValues = values?.length > 0; diff --git a/src/lib/PhilTVApiBase.ts b/src/lib/PhilTVApiBase.ts index e460eec..1b37ab3 100644 --- a/src/lib/PhilTVApiBase.ts +++ b/src/lib/PhilTVApiBase.ts @@ -1,27 +1,19 @@ -import type { KyInstance } from 'ky'; -import { get, tryit } from 'radash'; -import { createStorage } from 'unstorage'; -import fsLiteDriver from 'unstorage/drivers/fs-lite'; -import { createKyDigestClient } from '../http-clients'; +import { getHttpDigestClient } from '../http-clients'; import type { FlatNode, PhilTVApiParams } from '../types'; import { getFlattenNodes } from '../utils'; -function getStorage(storagePath: string) { - return createStorage({ - driver: fsLiteDriver({ base: `./.lib-cache/${storagePath}` }), - }); -} - /** * Class representing the base API for interacting with Philips TV. */ export class PhilTVApiBase { - protected digestClient: KyInstance; - protected instanceOptions: PhilTVApiParams['options']; + protected digestClient: ReturnType; constructor(params: PhilTVApiParams) { - this.digestClient = createKyDigestClient(params.apiUrl, params.user, params.password); - this.instanceOptions = params.options; + this.digestClient = getHttpDigestClient({ + user: params.user, + password: params.password, + baseUrl: params.apiUrl, + }); } /** @@ -37,90 +29,79 @@ export class PhilTVApiBase { return [error, body] as const; } - /** - * Retrieves the menu structure from the Philips TV API. - * - * @param opts - Options for the request. - * @param opts.flat - Whether to return the flattened structure. Default is false. - * @returns A promise that resolves to a tuple of error (if any) and the menu structure. - */ async getMenuStructure(opts: { flat?: boolean } = { flat: false }) { - const cacheStructure = get(this.instanceOptions, 'cacheStructure'); - const storage = getStorage(''); - if (cacheStructure) { - const existentCache = await storage.getItem('tv-structure:flat'); - if (existentCache) { - return [undefined, existentCache]; - } - } - - const [errorRaw, rawStructure] = await tryit( - this.digestClient.get('menuitems/settings/structure').json, - )(); + const [errorRaw, data, resp] = await this.digestClient.request('menuitems/settings/structure'); if (errorRaw) { return [errorRaw, undefined]; } if (opts.flat) { - const flatStructure = getFlattenNodes(rawStructure.node); - if (cacheStructure) { - await storage.set('tv-structure:flat', flatStructure); - } + const flatStructure = getFlattenNodes(data.node); - return [undefined, flatStructure]; + return [undefined, flatStructure, resp]; } - return [undefined, rawStructure]; + return [undefined, data, resp]; } - async getMenuStructureItems(context: string) { + async getMenuStructureItem(context: string | undefined, nodeId: number | undefined) { const [errorFlatten, flattenStructure] = await this.getMenuStructure({ flat: true }); + const toFilterTerm = context ? 'context' : 'node_id'; + const toFilterValue = context || nodeId; + if (!errorFlatten) { return [ undefined, flattenStructure.find((node: any) => { - return String(node?.context).toLowerCase() === context; + return node?.[toFilterTerm] === toFilterValue; }), ] as [undefined, FlatNode]; } return [errorFlatten, undefined] as [Error, undefined]; } - setMenuItemSetting(item: FlatNode | undefined, value: any) { + async getMenuStructureItemByContext(context: string) { + return this.getMenuStructureItem(context, undefined); + } + + async getMenuStructureItemByNodeId(nodeId: number) { + return this.getMenuStructureItem(undefined, nodeId); + } + + async setMenuItemSetting(item: FlatNode | undefined, value: any) { if (!item) { return [new Error('Item not found'), undefined] as const; } - const req = this.digestClient - .post('menuitems/settings/update', { - json: { - values: [ - { - value: { - Nodeid: item.node_id, - data: value, - }, + const [err, data, resp] = await this.digestClient.request('menuitems/settings/update', { + method: 'POST', + data: { + values: [ + { + value: { + Nodeid: item.node_id, + data: value, }, - ], - }, - }) - .then((resp) => { - return { - status: resp.status, - statusText: resp.statusText, - body: resp.body, - item, - originalResponse: resp, - }; - }); - - return tryit(() => req)(); + }, + ], + }, + }); + + const result = { + status: resp.status, + statusText: resp.statusText, + body: data, + item, + originalResponse: resp, + }; + + return [err, result] as const; } protected async handleSetMenuItemSetting(contextName: string, value: unknown) { - const [errorGetStructureItem, item] = await this.getMenuStructureItems(contextName); + const [errorGetStructureItem, item] = await this.getMenuStructureItemByContext(contextName); const [errorSetMenuItemSetting, result] = await this.setMenuItemSetting(item, value); return [errorGetStructureItem || errorSetMenuItemSetting, result] as const; diff --git a/src/lib/PhilTVPairing.ts b/src/lib/PhilTVPairing.ts index b77766b..0686f94 100644 --- a/src/lib/PhilTVPairing.ts +++ b/src/lib/PhilTVPairing.ts @@ -1,36 +1,60 @@ import { randomBytes } from 'node:crypto'; import { consola } from 'consola'; -import ky, { type KyInstance } from 'ky'; -import { tryit } from 'radash'; import { JS_SECRET_KEY } from '../constants'; -import { createKyDigestClient } from '../http-clients'; -import type { HttpClients, PhilTVPairingParams } from '../types'; -import { createSignature, getDeviceObject } from '../utils'; - -export async function getInformationSystem(httpClient: KyInstance) { - const res = await httpClient.get('system').json(); - const { - api_version: { Major: apiVersion }, - featuring: { systemfeatures: systemFeatures }, - } = res as Record; - const isSecureTransport = systemFeatures.secured_transport === 'true'; - const isGoodPairingType = systemFeatures.pairing_type === 'digest_auth_pairing'; - const isReady = isSecureTransport && isGoodPairingType; - return { - apiVersion, - systemFeatures, - isSecureTransport, - isGoodPairingType, - isReady, - }; +import { getHttpClient, getHttpDigestClient } from '../http-clients'; +import { getDeviceObject } from '../utils'; +import { createSignature } from '../utils/server'; + +export async function getInformationSystem(apiUrl: string) { + const client = getHttpClient(); + try { + const { data: res } = await client.request(`${apiUrl}/system`, { + dataType: 'json', + timeout: 2000, + signal: AbortSignal.timeout(2000), + }); + const { + api_version: { Major: apiVersion }, + featuring: { systemfeatures: systemFeatures }, + } = res as Record; + const isSecureTransport = systemFeatures.secured_transport === 'true'; + const isGoodPairingType = systemFeatures.pairing_type === 'digest_auth_pairing'; + const isReady = isSecureTransport && isGoodPairingType; + return [ + undefined, + { + apiVersion, + systemFeatures, + isSecureTransport, + isGoodPairingType, + isReady, + }, + ] as const; + } catch (e) { + return [e as Error, undefined] as const; + } } +export type PhilTVPairingParams = { + /** + * The IP address of the Philips TV to connect to. + * Without the protocol and port number. + * @example 192.168.1.2 + */ + tvIp: string; + /** + * The port number of the Philips TV API to connect to. + * Default is `1926`. + */ + apiPort?: number; +}; + export class PhilTVPairing { private tvBase: PhilTVPairingParams; private deviceId!: string; private apiUrls: { secure: string }; private deviceInformation!: ReturnType; - private httpClients!: HttpClients; + private httpClients!: { digest?: ReturnType }; private startPairingResponse!: { authKey: any; authTimestamp: any; timeout: any }; private credentials!: { password: any; user: string | undefined }; private apiVersion!: number; @@ -38,50 +62,46 @@ export class PhilTVPairing { constructor(initParams: PhilTVPairingParams) { this.tvBase = initParams; this.apiUrls = { - secure: `https://${this.tvBase.tvIp}:${this.tvBase.apiPort}`, + secure: `https://${this.tvBase.tvIp}:${this.tvBase.apiPort || 1926}`, }; this.deviceId = randomBytes(16).toString('hex'); this.deviceInformation = getDeviceObject(this.deviceId); } private async init() { - const [errGetInfoSystem, dataInfoSystem] = await tryit(getInformationSystem)( - ky.create({ - prefixUrl: this.apiUrls.secure, - }), - ); + const [errGetSystem, dataInfoSystem] = await getInformationSystem(this.apiUrls.secure); - if (errGetInfoSystem) { + if (errGetSystem || (dataInfoSystem && !dataInfoSystem.isReady)) { consola.error(` - ${errGetInfoSystem.message}\n - ${errGetInfoSystem.cause}\n Check if the TV is on and the IP is correct. Only Philips TVs with API version 6 or higher are supported. Only secure transport and digest auth pairing are supported (https).\n + + ${errGetSystem ? errGetSystem?.message : ''} + Bye. `); process.exit(1); } - const { apiVersion, isReady } = dataInfoSystem; + if (dataInfoSystem) { + const { apiVersion, isReady } = dataInfoSystem; - this.apiVersion = apiVersion; - this.httpClients = { - secure: ky.create({ - prefixUrl: `${this.apiUrls.secure}/${apiVersion}`, - throwHttpErrors: false, - }), - digest: undefined, - }; + this.apiVersion = apiVersion; + } } async startPairing() { await this.init(); - const res = await this.httpClients?.secure - .post('pair/request', { - json: { device: this.deviceInformation, scope: ['read', 'write', 'control'] }, - }) - .json(); + const client = getHttpClient(); + const { data: res } = await client.request(`${this.apiUrls.secure}/${this.apiVersion}/pair/request`, { + method: 'POST', + data: { + device: this.deviceInformation, + scope: ['read', 'write', 'control'], + }, + dataType: 'json', + }); const { timestamp: authTimestamp, auth_key: authKey, timeout, error_id, error_text } = res as any; @@ -105,11 +125,13 @@ export class PhilTVPairing { password: authKey, }; - this.httpClients.digest = createKyDigestClient( - `${this.apiUrls.secure}/${this.apiVersion}`, - this.credentials.user as string, - this.credentials.password, - ); + this.httpClients = { + digest: getHttpDigestClient({ + user: this.credentials.user as string, + password: this.credentials.password, + baseUrl: `${this.apiUrls.secure}/${this.apiVersion}`, + }), + }; const promptForPin = async () => await consola.prompt('Enter pin code from TV:', { @@ -143,9 +165,13 @@ export class PhilTVPairing { }, }; - const [errorGrant, dataGrant] = await tryit(this.httpClients.digest?.post as KyInstance['post'])('pair/grant', { - json: authData, - timeout: false, + if (!this.httpClients.digest) { + return [new Error('No digest client'), undefined] as const; + } + + const [errorGrant, dataGrant] = await this.httpClients.digest.request('pair/grant', { + method: 'POST', + data: authData, retry: 0, }); @@ -153,10 +179,8 @@ export class PhilTVPairing { return [errorGrant, undefined] as const; } - const response = (await dataGrant?.json()) as any; - - if (response?.error_id !== 'SUCCESS') { - return [new Error(`Failed to complete pairing: ${response?.error_text}`), undefined] as const; + if (dataGrant?.error_id !== 'SUCCESS') { + return [new Error(`Failed to complete pairing: ${dataGrant?.error_text}`), undefined] as const; } const config = { diff --git a/src/types/index.ts b/src/types/index.ts index 6872cbf..8816a57 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,10 +1,3 @@ -import type { KyInstance } from 'ky'; - -export type PhilTVPairingParams = { - tvIp: string; - apiPort: number; -}; - /** * Parameters required to initialize the `PhilTVApiBase` class. * @@ -27,24 +20,6 @@ export type PhilTVApiParams = { * The password for authentication with the API. */ password: string; - - /** - * Optional parameters for API configuration. - */ - options?: { - /** - * Indicates whether to cache the menu structure locally. - * If set to `true`, the retrieved menu structure will be stored in a file using the [unstorage](https://unstorage.unjs.io/) library. - * On subsequent requests, the cached version will be checked before making a network call, which can improve performance by - * reducing unnecessary API requests. If not required, this option can be omitted or set to `false`. - */ - cacheStructure?: boolean; - }; -}; - -export type HttpClients = { - secure: KyInstance; - digest?: KyInstance; }; export type FlatNode = { @@ -52,5 +27,7 @@ export type FlatNode = { type: string; string_id?: string; context?: string; - data?: any; + data?: unknown; }; + +export type * from './jointspace'; diff --git a/src/types/jointspace.ts b/src/types/jointspace.ts index 9a26699..0bcf0cf 100644 --- a/src/types/jointspace.ts +++ b/src/types/jointspace.ts @@ -1,75 +1,11 @@ -export const InputKeys = [ - 'Adjust', - 'AmbilightOnOff', - 'Back', - 'BlueColour', - 'ChannelStepDown', - 'ChannelStepUp', - 'Confirm', - 'CursorDown', - 'CursorLeft', - 'CursorRight', - 'CursorUp', - 'Digit0', - 'Digit1', - 'Digit2', - 'Digit3', - 'Digit4', - 'Digit5', - 'Digit6', - 'Digit7', - 'Digit8', - 'Digit9', - 'Dot', - 'FastForward', - 'Find', - 'GreenColour', - 'Home', - 'Info', - 'Mute', - 'Next', - 'Online', - 'Options', - 'Pause', - 'PlayPause', - 'Previous', - 'Record', - 'RedColour', - 'Rewind', - 'Source', - 'Standby', - 'Stop', - 'Subtitle', - 'Teletext', - 'Viewmode', - 'VolumeDown', - 'VolumeUp', - 'WatchTV', - 'YellowColour', -] as const; +import type { JOINTSPACE_CONSTANTS } from '../constants'; -export type InputKeys = (typeof InputKeys)[number]; +export type InputKeys = (typeof JOINTSPACE_CONSTANTS.inputKeys)[number]; -export const AmbilightFollowVideoModeEnum = [ - 'STANDARD', - 'NATURAL', - 'IMMERSIVE', - 'VIVID', - 'GAME', - 'COMFORT', - 'RELAX', -] as const; +export type AmbilightFollowVideoMode = (typeof JOINTSPACE_CONSTANTS.ambilight.followVideoMode)[number] | string; -export type AmbilightFollowVideoMode = (typeof AmbilightFollowVideoModeEnum)[number] | string; +export type AmbilightFollowAudioMode = (typeof JOINTSPACE_CONSTANTS.ambilight.followAudioMode)[number]; -export const AmbilightFollowAudioModeEnum = [ - 'VU_METER', - 'ENERGY_ADAPTIVE_BRIGHTNESS', - 'ENERGY_ADAPTIVE_COLORS', - 'SPECTRUM_ANALYSER', - 'KNIGHT_RIDER_ALTERNATING', - 'RANDOM_PIXEL_FLASH', - 'MODE_RANDOM', -] as const; - -export type AmbilightFollowAudioMode = (typeof AmbilightFollowAudioModeEnum)[number]; +export type AmbilightChangeBrightnessAvailableValues = + | (typeof JOINTSPACE_CONSTANTS.ambilight.brightnessAvailableValues)[number] + | string; diff --git a/src/utils/index.ts b/src/utils/index.ts index a11c37a..3368fed 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -1,15 +1,7 @@ -import { createHmac } from 'node:crypto'; import { omit } from 'radash'; +import { getHttpClient } from '../http-clients'; import type { FlatNode } from '../types'; -export function createSignature(secretKey: Buffer, secret: string) { - const hmac = createHmac('sha1', secretKey); - hmac.write(secret); - hmac.end(); - // @ts-ignore - return hmac.read('binary').toString('base64'); -} - export function getDeviceObject(deviceId: string) { return { app_id: 'gapp.id', @@ -39,3 +31,14 @@ export function getFlattenNodes(allInput: any) { return result; } + +export async function checkUrl(url: string) { + const client = getHttpClient(); + try { + await client.request(url, { method: 'GET', timeout: 1000 }); + + return true; + } catch (e) { + return false; + } +} diff --git a/src/utils/server.ts b/src/utils/server.ts new file mode 100644 index 0000000..23372a9 --- /dev/null +++ b/src/utils/server.ts @@ -0,0 +1,9 @@ +import { createHmac } from 'node:crypto'; + +export function createSignature(secretKey: Buffer, secret: string) { + const hmac = createHmac('sha1', secretKey); + hmac.write(secret); + hmac.end(); + // @ts-ignore + return hmac.read('binary').toString('base64'); +} diff --git a/tsup.config.ts b/tsup.config.ts new file mode 100644 index 0000000..50b37db --- /dev/null +++ b/tsup.config.ts @@ -0,0 +1,16 @@ +import { defineConfig } from 'tsup'; + +export default defineConfig({ + entry: { + index: 'src/index.ts', + constants: 'src/constants/index.ts', + utils: 'src/utils/index.ts', + 'bin/pairing': 'src/bin/pairing.ts', + }, + clean: true, + bundle: true, + dts: true, + minify: true, + treeshake: true, + format: ['cjs', 'esm'], +});