diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d72d4378bed08b2ce0936cd9b756984c8cfbfeec..92b7b7d87d2454ba46af9882d965e36dab7cc001 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -531,6 +531,7 @@ staging:deploy-auth: CONTAINER_NAME: denser-auth TURBO_APP_SCOPE: '@hive/auth' TURBO_APP_PATH: '/apps/auth' + EXPLORER_DOMAIN: 'https://explore.openhive.network' environment: name: staging-auth action: start @@ -551,6 +552,7 @@ staging:deploy-blog: CONTAINER_NAME: denser-blog TURBO_APP_SCOPE: '@hive/blog' TURBO_APP_PATH: '/apps/blog' + EXPLORER_DOMAIN: 'https://explore.openhive.network' environment: name: staging-blog action: start @@ -570,6 +572,7 @@ staging:deploy-wallet: CONTAINER_NAME: denser-wallet TURBO_APP_SCOPE: '@hive/wallet' TURBO_APP_PATH: '/apps/wallet' + EXPLORER_DOMAIN: 'https://explore.openhive.network' environment: name: staging-wallet action: start @@ -632,6 +635,7 @@ review:deploy-auth: SITE_DOMAIN: https://auth.fake.openhive.network LOGGING_BROWSER_ENABLED: false LOGGING_LOG_LEVEL: info + EXPLORER_DOMAIN: 'https://testexplorer.openhive.network' environment: name: review-auth action: start @@ -650,6 +654,7 @@ review:deploy-blog: BLOG_DOMAIN: https://blog.fake.openhive.network LOGGING_BROWSER_ENABLED: false LOGGING_LOG_LEVEL: info + EXPLORER_DOMAIN: 'https://testexplorer.openhive.network' environment: name: review-blog action: start @@ -668,6 +673,7 @@ review:deploy-wallet: BLOG_DOMAIN: https://blog.fake.openhive.network LOGGING_BROWSER_ENABLED: false LOGGING_LOG_LEVEL: info + EXPLORER_DOMAIN: 'https://testexplorer.openhive.network' environment: name: review-wallet action: start diff --git a/apps/blog/lib/renderer.ts b/apps/blog/lib/renderer.ts index 59857cddd51c945dce54a1f96687bc0bccd95afe..76d01e2d7fb570bb1ee9f7a59c753f83173e277e 100644 --- a/apps/blog/lib/renderer.ts +++ b/apps/blog/lib/renderer.ts @@ -1,4 +1,4 @@ -import { DefaultRenderer } from '@hiveio/content-renderer'; +import { DefaultRenderer } from '@hive/renderer'; import { getDoubleSize, proxifyImageUrl } from '@ui/lib/old-profixy'; import env from '@beam-australia/react-env'; import imageUserBlocklist from '@hive/ui/config/lists/image-user-blocklist'; diff --git a/apps/blog/next.config.js b/apps/blog/next.config.js index b678eae3f1947e49628937fa8680bfed2640d177..32bd258414bd8cf8ab584128705514c8ae707426 100644 --- a/apps/blog/next.config.js +++ b/apps/blog/next.config.js @@ -1,5 +1,5 @@ const path = require('path'); -const withTM = require('next-transpile-modules')(['@hive/smart-signer', '@hive/ui', '@hive/transaction']); +const withTM = require('next-transpile-modules')(['@hive/smart-signer', '@hive/ui', '@hive/transaction', '@hive/renderer']); const CopyPlugin = require('copy-webpack-plugin'); const removeImports = require('next-remove-imports')(); const withPWA = require('next-pwa')({ diff --git a/apps/blog/package.json b/apps/blog/package.json index 0c56898595273a39816ae66b75b1d30a082d5a11..5af519deca0761a316d6e20ec7d179ffc052d230 100644 --- a/apps/blog/package.json +++ b/apps/blog/package.json @@ -32,7 +32,7 @@ "@hive/transaction": "workspace:*", "@hive/tsconfig": "workspace:*", "@hive/ui": "workspace:*", - "@hiveio/content-renderer": "^2.2.0", + "@hive/renderer": "workspace:*", "@hiveio/wax": "1.27.6-rc6-stable.250109151100", "@hookform/resolvers": "^3.1.1", "@next/bundle-analyzer": "^14.2.2", diff --git a/haf b/haf index b7870f229cc0d45993a648ab9a15b0b4a12e7fe5..40a77e182a3a00af18479755d5eb43d8b76070d8 160000 --- a/haf +++ b/haf @@ -1 +1 @@ -Subproject commit b7870f229cc0d45993a648ab9a15b0b4a12e7fe5 +Subproject commit 40a77e182a3a00af18479755d5eb43d8b76070d8 diff --git a/package.json b/package.json index c7a85c00ee73f070058f1703de1ea004c46f09e7..38d0267f857f8a1701296dc6fde7935982362341 100644 --- a/package.json +++ b/package.json @@ -4,15 +4,15 @@ "scripts": { "dev": "turbo dev", "build": "turbo build", - "dev:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo dev --filter=@hive/blog", - "dev:3010:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo dev:3010 --filter=@hive/blog", - "devssl:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo devssl --filter=@hive/blog", - "build:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo build --filter=@hive/blog", - "start:blog": "./scripts/write-version.sh ./apps/blog/version.json &&turbo start --filter=@hive/blog", - "dev:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo dev --filter=@hive/wallet", - "devssl:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo devssl --filter=@hive/wallet", - "build:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo build --filter=@hive/wallet", - "start:wallet": "./scripts/write-version.sh ./apps/wallet/version.json &&turbo start --filter=@hive/wallet", + "dev:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo dev --filter=@hive/blog", + "dev:3010:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo dev:3010 --filter=@hive/blog", + "devssl:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo devssl --filter=@hive/blog", + "build:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo build --filter=@hive/blog", + "start:blog": "./scripts/write-version.sh ./apps/blog/version.json && turbo start --filter=@hive/blog", + "dev:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo dev --filter=@hive/wallet", + "devssl:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo devssl --filter=@hive/wallet", + "build:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo build --filter=@hive/wallet", + "start:wallet": "./scripts/write-version.sh ./apps/wallet/version.json && turbo start --filter=@hive/wallet", "dev:auth": "./scripts/write-version.sh ./apps/auth/version.json && turbo dev --filter=@hive/auth", "devssl:auth": "./scripts/write-version.sh ./apps/auth/version.json && turbo devssl --filter=@hive/auth", "build:auth": "./scripts/write-version.sh ./apps/auth/version.json && turbo build --filter=@hive/auth", diff --git a/packages/renderer/.eslintrc b/packages/renderer/.eslintrc new file mode 100644 index 0000000000000000000000000000000000000000..d114624f7eebf36f99adcd3227a15f29ffa71143 --- /dev/null +++ b/packages/renderer/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "@engrave/eslint-config-engrave", + "parserOptions": { + "project": "./tsconfig.eslint.json" + } +} \ No newline at end of file diff --git a/packages/renderer/.gitignore b/packages/renderer/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..77528e1aa12aaddce4e7271a9da07ba2c2a2d679 --- /dev/null +++ b/packages/renderer/.gitignore @@ -0,0 +1,66 @@ +.idea +.vscode +/dist +/.DS_Store + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# next.js build output +.next diff --git a/packages/renderer/.husky/commit-msg b/packages/renderer/.husky/commit-msg new file mode 100755 index 0000000000000000000000000000000000000000..22c5538077439d266caafbe1c010135e1e90d7a9 --- /dev/null +++ b/packages/renderer/.husky/commit-msg @@ -0,0 +1 @@ +npx --no-install -- commitlint --edit $1 \ No newline at end of file diff --git a/packages/renderer/.husky/pre-commit b/packages/renderer/.husky/pre-commit new file mode 100755 index 0000000000000000000000000000000000000000..18de98416e902594455f5052c280be812d433ddd --- /dev/null +++ b/packages/renderer/.husky/pre-commit @@ -0,0 +1 @@ +npm test \ No newline at end of file diff --git a/packages/renderer/.mocharc.yml b/packages/renderer/.mocharc.yml new file mode 100644 index 0000000000000000000000000000000000000000..2a09942b8846637abbf1c257682c11f695515fa0 --- /dev/null +++ b/packages/renderer/.mocharc.yml @@ -0,0 +1,2 @@ +recursive: true +require: ts-node/register \ No newline at end of file diff --git a/packages/renderer/.npmignore b/packages/renderer/.npmignore new file mode 100644 index 0000000000000000000000000000000000000000..5786aaf71335fc62e1a323ba16071d4a0382419d --- /dev/null +++ b/packages/renderer/.npmignore @@ -0,0 +1,26 @@ +/_dev +/.travis.yml +/.prettierrc.yml +/TODO +/README.md +/LICENSE +/src +/.DS_Store +/sample +/tslint.json +/tsconfig.json +/tsconfig.lint.json +/tsconfig.build.json +*.test.ts +/dist/browser/statistics.html +.gitlab-ci.yml +.mocharc.yml +.nvmrc +.eslintrc +.prettierrc.js +.husky +.run +browser-test +webpack.config.js +.idea +coverage \ No newline at end of file diff --git a/packages/renderer/.nvmrc b/packages/renderer/.nvmrc new file mode 100644 index 0000000000000000000000000000000000000000..2efc7e111f729014d1211afde5bf05b79a9909c1 --- /dev/null +++ b/packages/renderer/.nvmrc @@ -0,0 +1 @@ +v20.11.1 \ No newline at end of file diff --git a/packages/renderer/.prettierrc.js b/packages/renderer/.prettierrc.js new file mode 100644 index 0000000000000000000000000000000000000000..6006cb2941d4278aba751e770f77e222f189bb82 --- /dev/null +++ b/packages/renderer/.prettierrc.js @@ -0,0 +1 @@ +module.exports = require('@engrave/eslint-config-engrave/prettier.config'); \ No newline at end of file diff --git a/packages/renderer/.run/Run all tests.run.xml b/packages/renderer/.run/Run all tests.run.xml new file mode 100644 index 0000000000000000000000000000000000000000..f09c11ecb19d65fa665a042913e751f2b1ad2050 --- /dev/null +++ b/packages/renderer/.run/Run all tests.run.xml @@ -0,0 +1,14 @@ +<component name="ProjectRunConfigurationManager"> + <configuration default="false" name="Run all tests" type="mocha-javascript-test-runner"> + <node-interpreter>project</node-interpreter> + <node-options /> + <mocha-package>$PROJECT_DIR$/node_modules/mocha</mocha-package> + <working-directory>$PROJECT_DIR$</working-directory> + <pass-parent-env>true</pass-parent-env> + <ui>bdd</ui> + <extra-mocha-options>--require ts-node/register</extra-mocha-options> + <test-kind>PATTERN</test-kind> + <test-pattern>**/*.test.ts</test-pattern> + <method v="2" /> + </configuration> +</component> \ No newline at end of file diff --git a/packages/renderer/LICENSE b/packages/renderer/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..2a20d504c7157aad28226dd2e243745444becdb3 --- /dev/null +++ b/packages/renderer/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Wise Team + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/packages/renderer/README.md b/packages/renderer/README.md new file mode 100644 index 0000000000000000000000000000000000000000..0e567088aaa2cf4953b11e667d87d10932585964 --- /dev/null +++ b/packages/renderer/README.md @@ -0,0 +1,191 @@ +# @hiveio/content-renderer + +[](https://www.npmjs.com/package/@hiveio/content-renderer) [](https://www.npmjs.com/package/@hiveio/content-renderer) [](https://github.com/wise-team/steem-content-renderer/blob/master/LICENSE) [](https://github.com/semantic-release/semantic-release) [](http://makeapullrequest.com) + +👉 **[Online demo](https://hive.pages.syncad.com/hive-renderer/)** + +Portable library that renders Hive posts and comments to string. It supports markdown and html and mimics the behaviour of condenser frontend. + +Features: + +- supports markdown and html +- sanitizes html and protects from XSS +- embeds images, videos, and other assets via links or iframes +- ensures links are safe to display and begins with `https://` protocol +- linkify #tags and @username mentions +- proxify images if needed and appropriate function is provided +- synchronous execution with no external calls + +**Credit**: this library is based on the code from condenser. It's aim is to allow other projects display Hive content the right way without porting the same code over and over. + +## Server side usage + +Installation: + +```bash +$ npm install --save @hiveio/content-renderer +``` + +**Typescript:** + +```typescript +import { DefaultRenderer } from "@hiveio/content-renderer"; + +const renderer = new DefaultRenderer({ + baseUrl: "https://hive.blog/", + breaks: true, + skipSanitization: false, + allowInsecureScriptTags: false, + addNofollowToLinks: true, + doNotShowImages: false, + assetsWidth: 640, + assetsHeight: 480, + imageProxyFn: (url: string) => url, + usertagUrlFn: (account: string) => "/@" + account, + hashtagUrlFn: (hashtag: string) => "/trending/" + hashtag, + isLinkSafeFn: (url: string) => true, + addExternalCssClassToMatchingLinksFn: (url: string) => true, + ipfsPrefix: "https://ipfs.io/ipfs/" // IPFS gateway to display ipfs images +}); + +const safeHtmlStr = renderer.render(postContent); +``` + +## Browser usage: + +See [demo](https://hive.pages.syncad.com/hive-renderer/) and [its source](https://gitlab.syncad.com/hive/hive-renderer/-/blob/master/sample/live-demo.html). + +```html + +<script src="https://unpkg.com/@hiveio/content-renderer"></script> +<script> + const renderer = new HiveContentRenderer.DefaultRenderer({ + baseUrl: "https://hive.blog/", + breaks: true, + skipSanitization: false, + allowInsecureScriptTags: false, + addNofollowToLinks: true, + doNotShowImages: false, + cssClassForInternalLinks: "link", + cssClassForExternalLinks: "external", + assetsWidth: 640, + assetsHeight: 480, + imageProxyFn: (url) => url, + usertagUrlFn: (account) => "/@" + account, + hashtagUrlFn: (hashtag) => "/trending/" + hashtag, + isLinkSafeFn: (url) => true, + addExternalCssClassToMatchingLinksFn: (url: string) => true, + ipfsPrefix: "https://ipfs.io/ipfs/" + }); + + $(document).ready(() => { + const renderMarkdownBtnElem = $("#render-button"); + const inputElem = $("#input"); + const outputElem = $("#output"); + const outputMarkupElem = $("#output-markup"); + + renderMarkdownBtnElem.on("click", () => { + const input = inputElem.val(); + const output = renderer.render(input); + + console.log("Rendered", output); + outputElem.html(output); + outputMarkupElem.text(output); + }); + }); +</script> +</body> +</html> +``` + +## Renderer options + +You can pass options to the renderer to customize its behaviour. Here is the list of available + +```typescript +export interface RendererOptions { + baseUrl: string; + breaks: boolean; + skipSanitization: boolean; + allowInsecureScriptTags: boolean; + addNofollowToLinks: boolean; + doNotShowImages: boolean; + assetsWidth: number; + assetsHeight: number; + imageProxyFn: (url: string) => string; + hashtagUrlFn: (hashtag: string) => string; + usertagUrlFn: (account: string) => string; + isLinkSafeFn: (url: string) => boolean; + addExternalCssClassToMatchingLinksFn: (url: string) => boolean; + addTargetBlankToLinks?: boolean; + cssClassForInternalLinks?: string; + cssClassForExternalLinks?: string; + ipfsPrefix?: string; +} +``` + +## Options explained + +- `baseUrl` - base url of the website. It's used to create links. +- `breaks` - if true, newlines characters (`\n`) are converted to `<br>` tags. This only applies to markdown input. Usually you want to set this to `true`. +- `skipSanitization` - if true, html is not sanitized. This is not recommended, as it can lead to XSS attacks. Set this to `false` always for production use. +- `allowInsecureScriptTags` - if true, script tags are not removed from the input. This is not recommended, as it can lead to XSS attacks. Set this to `false` always for production use. +- `addNofollowToLinks` - if true, `rel="nofollow"` is added to all links. +- `addTargetBlankToLinks` - if true, `target="_blank"` is added to all links. +- `doNotShowImages` - if true, images are not being rendered as `<img>` tags but as `<pre>` tags with the image url. +- `assetsWidth` - width of the images and embeds in pixels. +- `assetsHeight` - height of the images and embeds in pixels. +- `imageProxyFn` - function that takes an image url and returns a proxied url. This can be useful to use a proxy to display images. It's also useful to resize images. +- `hashtagUrlFn` - function that takes a hashtag and returns a url to the hashtag page. +- `usertagUrlFn` - function that takes a usertag and returns a url to the user profile. This might be useful if you want to differentiate between internal and external links for some specific accounts, like bad actors. +- `isLinkSafeFn` - function that takes a link and returns true if the link is safe to display. This can be useful to filter out links to phishing sites or other malicious content. If this function returns false, the link is not displayed and title is set to phishing warning. +- `addExternalCssClassToMatchingLinksFn` - function that takes a link and returns true if the link should have `cssClassForExternalLinks` added to it. This can be useful to differentiate appearance between internal and external links. +- `addTargetBlankToLinks` - if true, `target="_blank"` is added to all links. +- `cssClassForInternalLinks` - if set, this class is added to all internal links. +- `cssClassForExternalLinks` - if set, this class is added to all external links if `addExternalCssClassToMatchingLinksFn` returns true. +- `ipfsPrefix` - if set, this prefix is added to all IPFS links. This can be useful if you want to use a public IPFS gateway to display ipfs images. It may or may not end with a slash. + +## Development + +Library is written in typescript and expects NodeJS v20 or higher. If you use nvm, you can run `nvm install` and `nvm use` to switch to the right version automatically. + +To start developing: + +```bash +$ npm install +$ npm run build +``` + +## Testing + +### Unit tests + +The library is tested with mocha and chai. To run unit tests: +```bash +$ npm run test +``` + +### Integration tests + +Integration tests are run with testcafe. Please note you need to rebuild the library before running the tests in order to have the latest version of the library embedded in the test page. Run `npm run build` before running the tests. + +To run integration tests with your default browser (chrome): +```bash +$ npm run verify:chrome +$ npm run verify:firefox +``` + +## Linting + +In order to provide consistent code style, the library is linted with eslint with prettier and typescript plugin. This is enforced in CI and git hooks. + +To run linter: +```bash +$ npm run lint +``` + +## Semantic versioning + +Library follows semantic versioning and is released to NPM registry automatically with CI after a merge to master. CI and husky is configured in a way to enforce [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/). Git hooks are installed to enforce this in local development. + +Versioning is done automatically with `semantic-release`. Please note that the version is bumped automatically based on the commit messages. \ No newline at end of file diff --git a/packages/renderer/browser-test/browser-test.js b/packages/renderer/browser-test/browser-test.js new file mode 100644 index 0000000000000000000000000000000000000000..3d670a6d7c8284ad7cb30f43c35e62502fc19947 --- /dev/null +++ b/packages/renderer/browser-test/browser-test.js @@ -0,0 +1,82 @@ +import {ClientFunction, Selector} from 'testcafe'; + +fixture`Getting Started`.page`./index.html`; + +const defaultOptions = { + baseUrl: 'https://hive.blog/', + breaks: true, + skipSanitization: false, + allowInsecureScriptTags: false, + addTargetBlankToLinks: true, + addNofollowToLinks: true, + cssClassForInternalLinks: 'hive-class', + cssClassForExternalLinks: 'hive-class external', + doNotShowImages: false, + assetsWidth: 640, + assetsHeight: 480, + imageProxyFn: (url) => url, + usertagUrlFn: (account) => `https://hive.blog/@${account}`, + hashtagUrlFn: (hashtag) => `/trending/${hashtag}`, + isLinkSafeFn: (url) => true, // !!url.match(/^(\/(?!\/)|https:\/\/hive.blog)/), + addExternalCssClassToMatchingLinksFn: (url) => !url.match(/^(\/(?!\/)|https:\/\/hive.blog)/) +}; + +const renderInBrowser = ClientFunction((options, markup) => { + // Create a new instance of SpoilerPlugin directly + // To test custom plugins + const spoilerPlugin = { + name: 'spoiler', + preProcess: (text) => { + return text.replace( + /^>! *\[(.*?)\] *([\s\S]*?)(?=^>! *\[|$)/gm, + (_, title, content) => { + const cleanContent = content + .split('\n') + .map(line => line.replace(/^> ?/, '').trim()) + .join('\n') + .trim(); + + return `<details class="spoiler"> + <summary>${title}</summary> + ${cleanContent} + </details>`; + } + ); + } + }; + + const mergedOptions = Object.assign({}, options, { + plugins: [spoilerPlugin] + }); + + const renderer = new HiveContentRenderer.DefaultRenderer(mergedOptions); + return renderer.render(markup); +}); + +test('Renders properly simple markup', async (t) => { + const markup = '# H1'; + + await t + .click(Selector('#awaiter')) + .expect(renderInBrowser({...defaultOptions}, markup)) + .eql('<h1>H1</h1>\n'); +}); + +test('Does not crash on mixed-img markup', async (t) => { + const markup = `<img src=""/>`; + const expected = `<p><img src="brokenimg.jpg" /></p>\n`; + + await t + .click(Selector('#awaiter')) + .expect(renderInBrowser({...defaultOptions}, markup)) + .eql(expected); +}); + +test('Renders properly simple link markup with classes hive-test, external', async (t) => { + const markup = '[Hive Link](https://hive.io)'; + + await t + .click(Selector('#awaiter')) + .expect(renderInBrowser({...defaultOptions}, markup)) + .eql(`<p><a href="https://hive.io" class="hive-class external">Hive Link</a></p>\n`); +}); diff --git a/packages/renderer/browser-test/index.html b/packages/renderer/browser-test/index.html new file mode 100644 index 0000000000000000000000000000000000000000..244ac56c0871caaaa8580f4b1d181a8c1513cf69 --- /dev/null +++ b/packages/renderer/browser-test/index.html @@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="utf-8"> + <title>Browser test of clean-stack</title> + <script> +module = { + exports: undefined, +}; + </script> + <script src="../dist/browser/hive-content-renderer.min.js"></script> + <script> + console.log(HiveContentRenderer.DefaultRenderer); + </script> + </head> + <button id="awaiter">Awaiter</button> + <body> + </body> +</html> diff --git a/packages/renderer/package.json b/packages/renderer/package.json new file mode 100755 index 0000000000000000000000000000000000000000..97a79642d328afbe7fde9b48fd731f749beb0faf --- /dev/null +++ b/packages/renderer/package.json @@ -0,0 +1,107 @@ +{ + "name": "@hive/renderer", + "version": "0.0.0-development", + "description": "Content renderer for Hive posts and comments. Markdown + HTML", + "main": "src/index.ts", + "types": "src/index.ts", + "unpkg": "dist/browser/hive-content-renderer.min.js", + "engines": { + "node": ">=20" + }, + "publishConfig": { + "access": "public" + }, + "scripts": { + "lint": "eslint ./src --ext .js,.jsx,.ts,.tsx", + "lint:fix": "eslint ./src --ext .js,.jsx,.ts,.tsx --fix", + "test": "mocha 'src/**/*.test.ts'" + }, + "dependencies": { + "@xmldom/xmldom": "0.8.10", + "ow": "0.28.2", + "react-twitter-embed": "^4.0.4", + "remarkable": "2.0.1", + "sanitize-html": "2.13.0", + "typescript-chained-error": "1.6.0", + "universe-log": "5.2.0" + }, + "devDependencies": { + "@hive/tsconfig": "workspace:*", + "@commitlint/cli": "19.3.0", + "@commitlint/config-conventional": "19.2.2", + "@engrave/eslint-config-engrave": "1.0.0", + "@semantic-release/gitlab": "13.2.0", + "@types/chai": "4.3.16", + "@types/jsdom": "21.1.7", + "@types/lodash": "4.17.6", + "@types/mocha": "10.0.7", + "@types/node": "20.14.10", + "@types/remarkable": "2.0.8", + "@types/sanitize-html": "2.11.0", + "@types/uuid": "10.0.0", + "@typescript-eslint/eslint-plugin": "7.15.0", + "chai": "4.4.1", + "eslint": "8.57.0", + "eslint-plugin-import": "2.29.1", + "husky": "9.0.11", + "jsdom": "24.1.0", + "lodash": "4.17.21", + "mocha": "10.6.0", + "nyc": "17.0.0", + "prettier": "3.3.2", + "semantic-release": "24.0.0", + "testcafe": "3.6.2", + "ts-node": "10.9.2", + "typescript": "5.5.3", + "typescript-eslint": "7.15.0", + "uuid": "10.0.0", + "webpack": "5.92.1", + "webpack-cli": "5.1.4", + "webpack-visualizer-plugin2": "1.1.0", + "ts-loader": "^9.5.1" + }, + "commitlint": { + "extends": [ + "@commitlint/config-conventional" + ], + "rules": { + "header-max-length": [ + 0 + ], + "scope-case": [ + 0 + ] + } + }, + "repository": { + "type": "git", + "url": "https://gitlab.syncad.com/hive/hive-renderer.git" + }, + "keywords": [ + "hive", + "markdown", + "renderer", + "blockchain", + "hive", + "content", + "content-renderer" + ], + "author": "Engrave (https://engrave.dev/)", + "contributors": [ + "JÄ™drzej Lewandowski <jedrzejblew@gmail.com> (https://jedrzej.lewandowski.doctor/)", + "BartÅ‚omiej Górnicki <contact@engrave.dev> (https://engrave.dev)" + ], + "license": "MIT", + "bugs": { + "url": "https://gitlab.syncad.com/hive/hive-renderer/-/issues" + }, + "homepage": "https://hive.io", + "release": { + "plugins": [ + "@semantic-release/commit-analyzer", + "@semantic-release/release-notes-generator", + "@semantic-release/gitlab", + "@semantic-release/npm" + ] + } +} diff --git a/packages/renderer/sample/demo-lib.js b/packages/renderer/sample/demo-lib.js new file mode 100644 index 0000000000000000000000000000000000000000..a31fb27692c338bf1084802da64c5d0ed3571225 --- /dev/null +++ b/packages/renderer/sample/demo-lib.js @@ -0,0 +1,40 @@ +const HiveContentRenderer = require("@hiveio/content-renderer"); + +const renderer = new HiveContentRenderer.DefaultRenderer({ + baseUrl: "https://hive.blog/", + breaks: true, + skipSanitization: false, + allowInsecureScriptTags: false, + addNofollowToLinks: true, + addTargetBlankToLink: true, + cssClassForInternalLinks: "hive-class", + doNotShowImages: false, + assetsWidth: 640, + assetsHeight: 480, + imageProxyFn: (url) => url, + usertagUrlFn: (account) => "/@" + account, + hashtagUrlFn: (hashtag) => "/trending/" + hashtag, + isLinkSafeFn: (url) => true, + addExternalCssClassToMatchingLinksFn: (url) => true, +}); + +const input = ` +# Sample post + +and some content + +Lets mention @engrave on #hive. + +[Hive Link](https://hive.io) +`; + +const output = renderer.render(input); + +console.log(); +console.log("+-------------------------------+"); +console.log("| @hiveio/content-renderer demo |"); +console.log("+-------------------------------+"); +console.log(); +console.log(output); +console.log(); +console.log(); diff --git a/packages/renderer/sample/demo-local.js b/packages/renderer/sample/demo-local.js new file mode 100644 index 0000000000000000000000000000000000000000..b54953d87bc78e47c1fde5f6778ce10e907df019 --- /dev/null +++ b/packages/renderer/sample/demo-local.js @@ -0,0 +1,41 @@ +const HiveContentRenderer = require("../dist/index"); + +const renderer = new HiveContentRenderer.DefaultRenderer({ + baseUrl: "https://hive.blog/", + breaks: true, + skipSanitization: false, + allowInsecureScriptTags: false, + addNofollowToLinks: true, + addTargetBlankToLink: true, + cssClassForInternalLinks: "hive-class", + cssClassForExternalLinks: "external", + doNotShowImages: false, + assetsWidth: 640, + assetsHeight: 480, + imageProxyFn: (url) => url, + usertagUrlFn: (account) => "/@" + account, + hashtagUrlFn: (hashtag) => "/trending/" + hashtag, + isLinkSafeFn: (url) => true, + addExternalCssClassToMatchingLinksFn: (url) => true, +}); + +const input = ` +# Sample post + +and some content + +Lets mention @engrave on #hive. + +[Hive Link](https://hive.io) +`; + +const output = renderer.render(input); + +console.log(); +console.log("+-------------------------------+"); +console.log("| @hiveio/content-renderer demo |"); +console.log("+-------------------------------+"); +console.log(); +console.log(output); +console.log(); +console.log(); diff --git a/packages/renderer/sample/live-demo.html b/packages/renderer/sample/live-demo.html new file mode 100644 index 0000000000000000000000000000000000000000..3633a8ecc2aa8c23ae122e7bd6e40de79422a279 --- /dev/null +++ b/packages/renderer/sample/live-demo.html @@ -0,0 +1,205 @@ +<!doctype html> +<html> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, height=device-height, user-scalable=no, initial-scale=1.0" /> + <title>@hiveio/content-renderer live demo</title> + <style> + /* source: https://github.com/setetres/evenbettermotherfuckingwebsite */ + body { + margin: 5% auto; + padding: 0 3rem; + background: #f2f2f2; + color: #444444; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; + font-size: 16px; + line-height: 1.8; + text-shadow: 0 1px 0 #ffffff; + max-width: 800px; + } + code { + background: white; + } + a { + border-bottom: 1px solid #444444; + color: #444444; + text-decoration: none; + } + a:hover { + border-bottom: 0; + } + /**/ + h1 { + font-size: 2.2em; + } + h2, + h3, + h4, + h5 { + margin-bottom: 0; + } + #output { + border: 1px solid #777; + padding: 0.5rem; + } + #output-markup { + width: 100%; + padding: 0.5rem; + background: #eee; + border: 1px solid #777; + overflow-x: scroll; + } + #render-button-container { + text-align: center; + } + #render-button { + padding: 0.5rem; + font-size: 1.2em; + border-radius: 0.5rem 0.5rem; + } + .load-post-form { + text-align: right; + } + header small { + color: #999; + font-size: 50%; + } + img { + max-width: 100%; + } + </style> + </head> + <body> + <header> + <h1>@hiveio/content-renderer <small>example</small></h1> + <aside> + @hiveio/content-renderer is aimed at unifying post rendering across all Hive interfaces. The rendering code was extracted from + <a href="https://gitlab.syncad.com/hive/condenser">condenser</a>, refactored, tested and bundled into a standalone library. This approach allows + independent development and continous improvement of post rendering in Hive blockchain. As for now it is fully compatible with the Hive.blog way of + rendering posts. See the <a href="https://gitlab.syncad.com/hive/hive-renderer">repository</a>, integrate into your project, star, make pull requests and + create issues. Let's make the project alive! + <hr /> + This example uses some markdown and transforms it to html. The library is loaded from the unpkg CDN: + <em><a href="https://unpkg.com/@hiveio/content-renderer">https://unpkg.com/@hiveio/content-renderer</a></em + >. + </aside> + </header> + + <h2>Render markdown:</h2> + <div class="load-post-form"> + Link to post (hive.blog, peakd.com or ecency.com): <input type="text" id="post-link-input" /> + <button id="load-post-button">Load Hive post</button> + </div> + <textarea rows="12" style="width: 100%" id="input"> +# Sample post +and some content. + +Let's mention @engrave +or include a tag #hive. + +https://youtu.be/B7C83L6iWJQ + +[Hive Link](https://hive.io) + + </textarea> + <p id="render-button-container"><button id="render-button">Render markdown</button></p> + + <h2>Output:</h2> + <p id="output">...press the button...</p> + <br /> + + <h2>Generated HTML markup</h2> + <pre id="output-markup"> + ...press the button... + </pre> + + <script src="https://cdn.jsdelivr.net/npm/@hiveio/hive-js/dist/hive.min.js"></script> + <script src="https://unpkg.com/jquery"></script> + <script src="https://unpkg.com/@hiveio/content-renderer@latest"></script> + <script> + const renderer = new HiveContentRenderer.DefaultRenderer({ + baseUrl: "https://hive.blog/", + breaks: true, + skipSanitization: false, + allowInsecureScriptTags: false, + addNofollowToLinks: true, + addTargetBlankToLinks: true, + cssClassForInternalLinks: "hive-test", + cssClassForExternalLinks: "external", + doNotShowImages: false, + assetsWidth: 640, + assetsHeight: 640, + imageProxyFn: (url) => url, + usertagUrlFn: (account) => "https://hive.blog/@" + account, + hashtagUrlFn: (hashtag) => "https://hive.blog/trending/" + hashtag, + isLinkSafeFn: (url) => true, + addExternalCssClassToMatchingLinksFn: (url) => true, + ipfsPrefix: "https://ipfs.io/ipfs/", + plugins: [ + new HiveContentRenderer.SpoilerPlugin() + ] + }); + + $(document).ready(() => { + const renderMarkdownBtnElem = $("#render-button"); + const inputElem = $("#input"); + const outputElem = $("#output"); + const outputMarkupElem = $("#output-markup"); + const loadPostButton = $("#load-post-button"); + const postLinkInput = $("#post-link-input"); + + function setOutput(output) { + outputElem.html(output); + outputMarkupElem.text(output); + } + + function render() { + const input = inputElem.val(); + const output = renderer.render(input); + + console.log("Rendered", output); + setOutput(output); + } + + function getAuthorAndPermlinkFromLink(link) { + let author = ""; + let permlink = ""; + if (link.length > 0) { + const regex = + /^\/?(?:https?:\/\/(?:hive\.blog|peakd\.com|ecency\.com))?(?:\/?[^\/\n]*\/)?@?([^\/\n]+)\/([^\/\n]+)$/giu; + const match = regex.exec(link); + if (match && match.length > 1) { + author = match[1]; + permlink = match[2]; + } + } + return { author, permlink }; + } + + renderMarkdownBtnElem.on("click", () => render()); + + loadPostButton.on("click", () => { + const postLink = postLinkInput.val(); + const { author, permlink } = getAuthorAndPermlinkFromLink(postLink); + if (!author || author.length === 0 || !permlink || permlink.length === 0) { + inputElem.text("Author or permlink is missing..."); + return; + } + + inputElem.text("Loading post @" + author + "/" + permlink + " ..."); + (async () => { + try { + const post = await hive.api.getContentAsync(author, permlink); + const postMarkdown = post.body; + console.log("Content loaded", postMarkdown); + inputElem.text(postMarkdown); + render(); + } catch (error) { + inputElem.text("Error while loading post @" + author + "/" + permlink + ": " + error); + } + })(); + }); + }); + </script> + </body> +</html> diff --git a/packages/renderer/src/Log.ts b/packages/renderer/src/Log.ts new file mode 100644 index 0000000000000000000000000000000000000000..23ed51d6b94b4003ead3eaf19059795cd8a58a4b --- /dev/null +++ b/packages/renderer/src/Log.ts @@ -0,0 +1,17 @@ +import {AbstractUniverseLog} from 'universe-log'; + +export class Log extends AbstractUniverseLog { + public static log(): Log { + return Log.INSTANCE; + } + private static INSTANCE: Log = new Log(); + + private constructor() { + super({ + levelEnvs: ['HIVE_CONTENT_RENDERER_LOG_LEVEL', 'ENGRAVE_LOG_LEVEL'], + metadata: { + library: '@hiveio/content-renderer' + } + }); + } +} diff --git a/packages/renderer/src/index.ts b/packages/renderer/src/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..ccd9d5dfe6861f969978a8183d4ecd809be3842b --- /dev/null +++ b/packages/renderer/src/index.ts @@ -0,0 +1,13 @@ +import {DefaultRenderer} from './renderers/default/DefaultRenderer'; +import {SpoilerPlugin} from './renderers/default/plugins/SpoilerPlugin'; + +export {DefaultRenderer} from './renderers/default/DefaultRenderer'; +export {SpoilerPlugin} from './renderers/default/plugins/SpoilerPlugin'; +export type {RendererPlugin} from './renderers/default/plugins/RendererPlugin'; + +export const HiveContentRenderer = { + DefaultRenderer, + SpoilerPlugin +}; + +export default HiveContentRenderer; diff --git a/packages/renderer/src/renderers/default/DefaultRenderer.test.ts b/packages/renderer/src/renderers/default/DefaultRenderer.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..31784c414bb7426bc8027493f1c2f29dbbfcb2b6 --- /dev/null +++ b/packages/renderer/src/renderers/default/DefaultRenderer.test.ts @@ -0,0 +1,322 @@ +import {expect} from 'chai'; +import {JSDOM} from 'jsdom'; +import 'mocha'; +import {Log} from '../../Log'; +import {DefaultRenderer, RendererOptions} from './DefaultRenderer'; +import {SpoilerPlugin} from './plugins/SpoilerPlugin'; + +describe('DefaultRender', () => { + const defaultOptions: RendererOptions = { + baseUrl: 'https://hive.blog/', + breaks: true, + skipSanitization: false, + allowInsecureScriptTags: false, + addTargetBlankToLinks: true, + cssClassForInternalLinks: 'hive-test', + cssClassForExternalLinks: 'hive-test external', + addNofollowToLinks: true, + doNotShowImages: false, + assetsWidth: 640, + assetsHeight: 480, + imageProxyFn: (url: string) => url, + usertagUrlFn: (account: string) => `https://hive.blog/@${account}`, + hashtagUrlFn: (hashtag: string) => `/trending/${hashtag}`, + isLinkSafeFn: (_url: string) => true, // !!url.match(/^(\/(?!\/)|https:\/\/hive.blog)/), + addExternalCssClassToMatchingLinksFn: (url: string) => !url.match(/^(\/(?!\/)|https:\/\/hive.blog)/), + plugins: [new SpoilerPlugin()] + }; + + const tests = [ + {name: 'Renders H1 headers correctly', raw: `# Header H1`, expected: '<h1>Header H1</h1>'}, + {name: 'Renders H4 headers correctly', raw: `#### Header H4`, expected: '<h4>Header H4</h4>'}, + { + name: 'Renders headers and paragraphs correctly', + raw: '# Header H1\n\nSome paragraph\n\n## Header H2\n\nAnother paragraph', + expected: '<h1>Header H1</h1>\n<p>Some paragraph</p>\n<h2>Header H2</h2>\n<p>Another paragraph</p>' + }, + { + name: 'Renders hive mentions correctly', + raw: 'Content @noisy another content', + expected: '<p>Content <a href="https://hive.blog/@noisy" class="hive-test">@noisy</a> another content</p>' + }, + { + name: 'Renders hive hashtags correctly', + raw: 'Content #pl-nuda another content', + expected: '<p>Content <a href="/trending/pl-nuda" class="hive-test">#pl-nuda</a> another content</p>' + }, + { + name: 'Allows links embedded via <a> tags', + raw: '<a href="https://hive.blog/utopian-io/@blockchainstudio/drugswars-revenue-and-transaction-analysis" class="hive-test">Drugwars - revenue and transaction analysis</a>', + expected: + '<p><a href="https://hive.blog/utopian-io/@blockchainstudio/drugswars-revenue-and-transaction-analysis" class="hive-test">Drugwars - revenue and transaction analysis</a></p>' + }, + { + name: 'Allows links embedded via <a> tags inside of markdown headers', + raw: "## <a href='https://hive.blog/utopian-io/@blockchainstudio/drugswars-revenue-and-transaction-analysis' class='hive-test'>Drugwars - revenue and transaction analysis</a>", + expected: + '<h2><a href="https://hive.blog/utopian-io/@blockchainstudio/drugswars-revenue-and-transaction-analysis" class="hive-test">Drugwars - revenue and transaction analysis</a></h2>' + }, + { + name: 'Allow for anchor id tags', + raw: "<a id='anchor'></a>", + expected: '<p><a id="anchor" class="hive-test"></a></p>' + }, + { + name: 'Allows links embedded via <a> tags with additional class added when condition is matching', + raw: '<a href="https://www.google.com" class="hive-test">Google</a>', + expected: '<p><a href="https://www.google.com" class="hive-test external">Google</a></p>' + }, + { + name: 'Should remove additional unsafe attributes from a tag', + raw: "<a fake='test'></a>", + expected: '<p><a class="hive-test"></a></p>' + }, + { + name: 'Spotify playlist link should be embedded correctly', + raw: 'https://open.spotify.com/playlist/1zLvUhumbFIEdfxYQcgUxk', + expected: + '<p><div class="videoWrapper"><iframe src="https://open.spotify.com/embed/playlist/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + }, + { + name: 'Spotify track link should be embedded correctly', + raw: 'https://open.spotify.com/track/3Qm86XLflmIXVm1wcwkgDK', + expected: + '<p><div class="videoWrapper"><iframe src="https://open.spotify.com/embed/track/3Qm86XLflmIXVm1wcwkgDK" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + }, + { + name: 'Spotify album link should be embedded correctly', + raw: 'https://open.spotify.com/album/1zLvUhumbFIEdfxYQcgUxk', + expected: + '<p><div class="videoWrapper"><iframe src="https://open.spotify.com/embed/album/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + }, + { + name: 'Spotify episode link should be embedded correctly', + raw: 'https://open.spotify.com/episode/1zLvUhumbFIEdfxYQcgUxk', + expected: + '<p><div class="videoWrapper"><iframe src="https://open.spotify.com/embed-podcast/episode/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + }, + { + name: 'Spotify show link should be embedded correctly', + raw: 'https://open.spotify.com/show/1zLvUhumbFIEdfxYQcgUxk', + expected: + '<p><div class="videoWrapper"><iframe src="https://open.spotify.com/embed-podcast/show/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + }, + { + name: 'Spotify artist link should be embedded correctly', + raw: 'https://open.spotify.com/artist/1zLvUhumbFIEdfxYQcgUxk', + expected: + '<p><div class="videoWrapper"><iframe src="https://open.spotify.com/embed/artist/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + }, + { + name: 'Spotify embed playlist via iframe should be embedded correctly', + raw: '<iframe src="https://open.spotify.com/embed/playlist/1zLvUhumbFIEdfxYQcgUxk" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe src="https://open.spotify.com/embed/playlist/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen"></iframe></div>' + }, + { + name: 'Spotify embed track via iframe should be embedded correctly', + raw: '<iframe src="https://open.spotify.com/embed/track/3Qm86XLflmIXVm1wcwkgDK" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe src="https://open.spotify.com/embed/track/3Qm86XLflmIXVm1wcwkgDK" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen"></iframe></div>' + }, + { + name: 'Spotify embed album via iframe should be embedded correctly', + raw: '<iframe src="https://open.spotify.com/embed/album/1zLvUhumbFIEdfxYQcgUxk" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe src="https://open.spotify.com/embed/album/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen"></iframe></div>' + }, + { + name: 'Spotify embed episode via iframe should be embedded correctly', + raw: '<iframe src="https://open.spotify.com/embed-podcast/episode/1zLvUhumbFIEdfxYQcgUxk" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe src="https://open.spotify.com/embed-podcast/episode/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen"></iframe></div>' + }, + { + name: 'Spotify embed show via iframe should be embedded correctly', + raw: '<iframe src="https://open.spotify.com/embed-podcast/show/1zLvUhumbFIEdfxYQcgUxk" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe src="https://open.spotify.com/embed-podcast/show/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen"></iframe></div>' + }, + { + name: 'Spotify embed artist via iframe should be embedded correctly', + raw: '<iframe src="https://open.spotify.com/embed/artist/1zLvUhumbFIEdfxYQcgUxk" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe src="https://open.spotify.com/embed/artist/1zLvUhumbFIEdfxYQcgUxk" width="640" height="480" frameborder="0" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen"></iframe></div>' + }, + { + name: 'Youtube link with www should be embedded correctly', + raw: 'https://www.youtube.com/watch?v=0nFkmd-A7jA', + expected: + '<p><div class="videoWrapper"><iframe width="640" height="480" src="https://www.youtube.com/embed/0nFkmd-A7jA" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" frameborder="0"></iframe></div></p>' + }, + { + name: 'Youtube link without www should be embedded correctly', + raw: 'https://youtube.com/watch?v=0nFkmd-A7jA', + expected: + '<p><div class="videoWrapper"><iframe width="640" height="480" src="https://www.youtube.com/embed/0nFkmd-A7jA" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" frameborder="0"></iframe></div></p>' + }, + { + name: 'Youtube link with embed should be embedded correctly', + raw: 'https://www.youtube.com/embed/0nFkmd-A7jA', + expected: + '<p><div class="videoWrapper"><iframe width="640" height="480" src="https://www.youtube.com/embed/0nFkmd-A7jA" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" frameborder="0"></iframe></div></p>' + }, + { + name: 'Youtube shorted link with watch should be embedded correctly', + raw: 'https://youtu.be/watch?v=0nFkmd-A7jA', + expected: + '<p><div class="videoWrapper"><iframe width="640" height="480" src="https://www.youtube.com/embed/0nFkmd-A7jA" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" frameborder="0"></iframe></div></p>' + }, + { + name: 'Youtube shorted link should be embedded correctly', + raw: 'https://youtu.be/0nFkmd-A7jA', + expected: + '<p><div class="videoWrapper"><iframe width="640" height="480" src="https://www.youtube.com/embed/0nFkmd-A7jA" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" frameborder="0"></iframe></div></p>' + }, + { + name: 'Youtube embed via iframe should be embedded correctly', + raw: '<iframe width="560" height="315" src="https://www.youtube.com/embed/0nFkmd-A7jA" frameborder="0" allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe width="640" height="480" src="https://www.youtube.com/embed/0nFkmd-A7jA" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" frameborder="0"></iframe></div>' + }, + { + name: 'Vimeo link via iframe should be embedded correctly', + raw: '<iframe src="https://player.vimeo.com/video/174544848?byline=0" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>', + expected: + '<div class="videoWrapper"><iframe frameborder="0" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" src="https://player.vimeo.com/video/174544848" width="640" height="480"></iframe></div>' + }, + { + name: 'Vimeo link should be embedded correctly', + raw: 'https://vimeo.com/174544848', + expected: + '<p><div class="videoWrapper"><iframe src="https://player.vimeo.com/video/174544848" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + }, + { + name: 'Vimeo link without player should be embedded correctly', + raw: 'https://vimeo.com/174544848', + expected: + '<p><div class="videoWrapper"><iframe src="https://player.vimeo.com/video/174544848" width="640" height="480" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe></div></p>' + } + ]; + + tests.forEach((test) => + it(test.name, () => { + const renderer = new DefaultRenderer(defaultOptions); + const rendered = renderer.render(test.raw).trim(); + + const renderedNode = JSDOM.fragment(rendered); + const comparisonNode = JSDOM.fragment(test.expected); + + Log.log().debug('rendered', rendered); + Log.log().debug('expected', test.expected); + + expect(renderedNode.isEqualNode(comparisonNode)).to.be.equal(true); + }) + ); + + it('Allows insecure script tags when allowInsecureScriptTags = true', () => { + const renderer = new DefaultRenderer({...defaultOptions, allowInsecureScriptTags: true}); + const insecureContent = '<script src="">'; + renderer.render(insecureContent); + }); + + it('Does not allow insecure script tags when allowInsecureScriptTags = false', () => { + const renderer = new DefaultRenderer({ + ...defaultOptions, + skipSanitization: true, + allowInsecureScriptTags: false + }); + const insecureContent = '<script src="">'; + expect(() => renderer.render(insecureContent)).to.throw(/insecure content/); + }); + + it('Rejects mixed image tag', () => { + const renderer = new DefaultRenderer({...defaultOptions}); + const markup = `<img src=""/>`; + const rendered = renderer.render(markup); + + const expected = `<p><img src="brokenimg.jpg" /></p>\n`; + expect(rendered).to.be.equal(expected); + }); + + it('Should convert new lines to <br /> tags if breaks options is set to true for markdown input', () => { + const renderer = new DefaultRenderer({...defaultOptions, breaks: true}); + const rendered = renderer.render(`test\ntest`).trim(); + expect(rendered).to.be.equal('<p>test<br />\ntest</p>'); + }); + + it('Should not convert new lines to <br> tags if breaks options is set to false for markdown input', () => { + const renderer = new DefaultRenderer({...defaultOptions, breaks: false}); + const rendered = renderer.render(`test\ntest`).trim(); + expect(rendered).to.be.equal('<p>test\ntest</p>'); + }); + + it('Should not convert new lines to <br> tags if breaks options is set to true for html input', () => { + const renderer = new DefaultRenderer({...defaultOptions, breaks: true}); + const rendered = renderer.render(`<p>test\ntest</p>`).trim(); + expect(rendered).to.be.equal('<p>test\ntest</p>'); + }); + + it('Should add <pre> tag to hide images if doNotShowImages option is set to true', () => { + const renderer = new DefaultRenderer({...defaultOptions, doNotShowImages: true}); + const rendered = renderer.render(``).trim(); + expect(rendered).to.be.equal('<p></p><pre>https://img.jpg</pre><p></p>'); + }); + + it('Should add <pre> tag to hide images if doNotShowImages option is set to true for html input', () => { + const renderer = new DefaultRenderer({...defaultOptions, doNotShowImages: true}); + const rendered = renderer.render(`<img src="https://img.jpg" />`).trim(); + expect(rendered).to.be.equal('<p></p><pre>https://img.jpg</pre><p></p>'); + }); + + [ + '/ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE', + '//ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE', + `ipfs://QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE` + ].forEach((ipfsLink) => { + it(`Should prefix ifps link (${ipfsLink}) with ipfsPrefix`, () => { + const renderer = new DefaultRenderer({...defaultOptions, ipfsPrefix: 'https://gateway.io/ipfs'}); + const rendered = renderer.render(``).trim(); + expect(rendered).to.be.equal('<p><img src="https://gateway.io/ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE" alt="img.jpg" /></p>'); + }); + }); + + it('should prefix ipfs links with ipfsPrefix regardless if the prefix contains a trailing slash or not', () => { + const renderer1 = new DefaultRenderer({...defaultOptions, ipfsPrefix: 'https://gateway.io/ipfs'}); + const renderer2 = new DefaultRenderer({...defaultOptions, ipfsPrefix: 'https://gateway.io/ipfs/'}); + const rendered1 = renderer1.render(``).trim(); + const rendered2 = renderer2.render(``).trim(); + expect(rendered1).to.be.equal('<p><img src="https://gateway.io/ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE" alt="img.jpg" /></p>'); + expect(rendered2).to.be.equal('<p><img src="https://gateway.io/ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE" alt="img.jpg" /></p>'); + }); + + it('Renders spoiler tags correctly', () => { + const renderer = new DefaultRenderer(defaultOptions); + const raw = '>! [Click to reveal] Hidden content\n> More hidden text'; + const rendered = renderer.render(raw).trim(); + + // Normalize both strings by removing extra whitespace + const normalizeHtml = (html: string) => { + return html.replace(/\s+/g, ' ').trim(); + }; + + const expected = '<p></p><details><summary>Click to reveal</summary><p>Hidden content More hidden text</p></details><p></p>'; + + expect(normalizeHtml(rendered)).to.equal(normalizeHtml(expected)); + }); + + it('Renders spoiler tags correctly with no title provided with fallback title', () => { + const renderer = new DefaultRenderer(defaultOptions); + const raw = '>! [] Hidden content\n> More hidden text'; + const rendered = renderer.render(raw).trim(); + + // Normalize both strings by removing extra whitespace + const normalizeHtml = (html: string) => { + return html.replace(/\s+/g, ' ').trim(); + }; + + const expected = '<p></p><details><summary>Reveal spoiler</summary><p>Hidden content More hidden text</p></details><p></p>'; + + expect(normalizeHtml(rendered)).to.equal(normalizeHtml(expected)); + }); +}); diff --git a/packages/renderer/src/renderers/default/DefaultRenderer.ts b/packages/renderer/src/renderers/default/DefaultRenderer.ts new file mode 100644 index 0000000000000000000000000000000000000000..7728a60aca571ab9dd27452ea58ad8fd41850baf --- /dev/null +++ b/packages/renderer/src/renderers/default/DefaultRenderer.ts @@ -0,0 +1,165 @@ +import ow from 'ow'; +import {Remarkable} from 'remarkable'; +import {SecurityChecker} from '../../security/SecurityChecker'; +import {HtmlDOMParser} from './embedder/HtmlDOMParser'; +import {Localization, LocalizationOptions} from './Localization'; +import type {RendererPlugin} from './plugins/RendererPlugin'; +import {PreliminarySanitizer} from './sanitization/PreliminarySanitizer'; +import {TagTransformingSanitizer} from './sanitization/TagTransformingSanitizer'; + +export class DefaultRenderer { + private options: RendererOptions; + private tagTransformingSanitizer: TagTransformingSanitizer; + private domParser: HtmlDOMParser; + private plugins: RendererPlugin[] = []; + + public constructor(options: RendererOptions, localization: LocalizationOptions = Localization.DEFAULT) { + this.validate(options); + this.options = options; + + Localization.validate(localization); + + this.tagTransformingSanitizer = new TagTransformingSanitizer( + { + iframeWidth: this.options.assetsWidth, + iframeHeight: this.options.assetsHeight, + addNofollowToLinks: this.options.addNofollowToLinks, + addTargetBlankToLinks: this.options.addTargetBlankToLinks, + cssClassForInternalLinks: this.options.cssClassForInternalLinks, + cssClassForExternalLinks: this.options.cssClassForExternalLinks, + noImage: this.options.doNotShowImages, + isLinkSafeFn: this.options.isLinkSafeFn, + addExternalCssClassToMatchingLinksFn: this.options.addExternalCssClassToMatchingLinksFn + }, + localization + ); + + this.domParser = new HtmlDOMParser( + { + width: this.options.assetsWidth, + height: this.options.assetsHeight, + ipfsPrefix: this.options.ipfsPrefix, + baseUrl: this.options.baseUrl, + imageProxyFn: this.options.imageProxyFn, + hashtagUrlFn: this.options.hashtagUrlFn, + usertagUrlFn: this.options.usertagUrlFn, + hideImages: this.options.doNotShowImages + }, + localization + ); + + this.plugins = options.plugins || []; + } + + public render(input: string): string { + ow(input, 'input', ow.string.nonEmpty); + return this.doRender(input); + } + + private doRender(text: string): string { + // Pre-process with plugins + text = this.runPluginPhase('preProcess', text); + + text = PreliminarySanitizer.preliminarySanitize(text); + const isHtml = this.isHtml(text); + text = isHtml ? text : this.renderMarkdown(text); + + text = this.wrapRenderedTextWithHtmlIfNeeded(text); + text = this.domParser.parse(text).getParsedDocumentAsString(); + text = this.sanitize(text); + SecurityChecker.checkSecurity(text, {allowScriptTag: this.options.allowInsecureScriptTags}); + text = this.domParser.embedder.insertAssets(text); + + // Post-process with plugins + text = this.runPluginPhase('postProcess', text); + + return text; + } + + private runPluginPhase(phase: 'preProcess' | 'postProcess', text: string): string { + return this.plugins.reduce((processedText, plugin) => { + const processor = plugin[phase]; + return processor ? processor(processedText) : processedText; + }, text); + } + + private renderMarkdown(text: string): string { + const renderer = new Remarkable({ + html: true, // remarkable renders first then sanitize runs... + breaks: this.options.breaks, + typographer: false, // https://github.com/jonschlinkert/remarkable/issues/142#issuecomment-221546793 + quotes: '“â€â€˜â€™' + }); + return renderer.render(text); + } + + private wrapRenderedTextWithHtmlIfNeeded(renderedText: string): string { + // If content isn't wrapped with an html element at this point, add it. + if (renderedText.indexOf('<html>') !== 0) { + renderedText = '<html>' + renderedText + '</html>'; + } + return renderedText; + } + + private isHtml(text: string): boolean { + let html = false; + // See also ReplyEditor isHtmlTest + const m = text.match(/^<html>([\S\s]*)<\/html>$/); + if (m && m.length === 2) { + html = true; + text = m[1]; + } else { + // See also ReplyEditor isHtmlTest + html = /^<p>[\S\s]*<\/p>/.test(text); + } + return html; + } + + private sanitize(text: string): string { + if (this.options.skipSanitization) { + return text; + } + + return this.tagTransformingSanitizer.sanitize(text); + } + + private validate(o: RendererOptions) { + ow(o, 'RendererOptions', ow.object); + ow(o.baseUrl, 'RendererOptions.baseUrl', ow.string.nonEmpty); + ow(o.breaks, 'RendererOptions.breaks', ow.boolean); + ow(o.skipSanitization, 'RendererOptions.skipSanitization', ow.boolean); + ow(o.addNofollowToLinks, 'RendererOptions.addNofollowToLinks', ow.boolean); + ow(o.addTargetBlankToLinks, 'RendererOptions.addTargetBlankToLinks', ow.optional.boolean); + ow(o.cssClassForInternalLinks, 'RendererOptions.cssClassForInternalLinks', ow.optional.string); + ow(o.cssClassForExternalLinks, 'RendererOptions.cssClassForExternalLinks', ow.optional.string); + ow(o.doNotShowImages, 'RendererOptions.doNotShowImages', ow.boolean); + ow(o.ipfsPrefix, 'RendererOptions.ipfsPrefix', ow.optional.string); + ow(o.assetsWidth, 'RendererOptions.assetsWidth', ow.number.integer.positive); + ow(o.assetsHeight, 'RendererOptions.assetsHeight', ow.number.integer.positive); + ow(o.imageProxyFn, 'RendererOptions.imageProxyFn', ow.function); + ow(o.hashtagUrlFn, 'RendererOptions.hashtagUrlFn', ow.function); + ow(o.usertagUrlFn, 'RendererOptions.usertagUrlFn', ow.function); + ow(o.isLinkSafeFn, 'RendererOptions.isLinkSafeFn', ow.function); + ow(o.addExternalCssClassToMatchingLinksFn, 'RendererOptions.addExternalCssClassToMatchingLinksFn', ow.function); + } +} +export interface RendererOptions { + baseUrl: string; + breaks: boolean; + skipSanitization: boolean; + allowInsecureScriptTags: boolean; + addNofollowToLinks: boolean; + addTargetBlankToLinks?: boolean; + cssClassForInternalLinks?: string; + cssClassForExternalLinks?: string; + doNotShowImages: boolean; + ipfsPrefix?: string; + assetsWidth: number; + assetsHeight: number; + imageProxyFn: (url: string) => string; + hashtagUrlFn: (hashtag: string) => string; + usertagUrlFn: (account: string) => string; + isLinkSafeFn: (url: string) => boolean; + addExternalCssClassToMatchingLinksFn: (url: string) => boolean; + plugins?: RendererPlugin[]; +} diff --git a/packages/renderer/src/renderers/default/Localization.ts b/packages/renderer/src/renderers/default/Localization.ts new file mode 100644 index 0000000000000000000000000000000000000000..dbb05f27aa8409909cb51d324d827109c6dbb471 --- /dev/null +++ b/packages/renderer/src/renderers/default/Localization.ts @@ -0,0 +1,31 @@ +import ow from 'ow'; + +export class Localization { + public static validate(o: LocalizationOptions) { + ow(o, 'LocalizationOptions', ow.object); + ow(o.phishingWarning, 'LocalizationOptions.phishingWarning', ow.string.nonEmpty); + ow(o.externalLink, 'LocalizationOptions.externalLink', ow.string.nonEmpty); + ow(o.noImage, 'LocalizationOptions.noImage', ow.string.nonEmpty); + ow(o.accountNameWrongLength, 'LocalizationOptions.accountNameWrongLength', ow.string.nonEmpty); + ow(o.accountNameBadActor, 'LocalizationOptions.accountNameBadActor', ow.string.nonEmpty); + ow(o.accountNameWrongSegment, 'LocalizationOptions.accountNameWrongSegment', ow.string.nonEmpty); + } + + public static DEFAULT: LocalizationOptions = { + phishingWarning: 'Link expanded to plain text; beware of a potential phishing attempt', + externalLink: 'This link will take you away from example.com', + noImage: 'Images not allowed', + accountNameWrongLength: 'Account name should be between 3 and 16 characters long', + accountNameBadActor: 'This account is on a bad actor list', + accountNameWrongSegment: 'This account name contains a bad segment' + }; +} + +export interface LocalizationOptions { + phishingWarning: string; // "Link expanded to plain text; beware of a potential phishing attempt" + externalLink: string; // "This link will take you away from example.com" + noImage: string; // "Images not allowed" + accountNameWrongLength: string; // "Account name should be between 3 and 16 characters long." + accountNameBadActor: string; // "This account is on a bad actor list" + accountNameWrongSegment: string; // "This account name contains a bad segment" +} diff --git a/packages/renderer/src/renderers/default/StaticConfig.ts b/packages/renderer/src/renderers/default/StaticConfig.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa1a579adfe138b5b35aa9464e9e0279755ff899 --- /dev/null +++ b/packages/renderer/src/renderers/default/StaticConfig.ts @@ -0,0 +1,118 @@ +/** + * This file is based on + * - https://github.com/openhive-network/condenser/blob/master/src/app/utils/SanitizeConfig.js + */ + +export class StaticConfig { + public static sanitization = { + iframeWhitelist: [ + { + // eslint-disable-next-line security/detect-unsafe-regex + re: /^(?:@?(?:https?:)?\/\/)?(?:www\.)?(twitter|x)\.com\/(?:\w+\/status|status)\/(\d{1,20})/i, + fn: (src: string) => { + if (!src) { + return null; + } + const cleanSrc = src.replace(/^(@|https?:\/\/)/, ''); + const match = cleanSrc.match(/(?:twitter|x)\.com\/(?:\w+\/status|status)\/(\d{1,20})/i); + if (!match || match.length !== 2) { + return null; + } + return `https://platform.twitter.com/embed/Tweet.html?id=${match[1]}`; + } + }, + { + // eslint-disable-next-line security/detect-unsafe-regex + re: /^(https?:)?\/\/player.vimeo.com\/video\/.*/i, + fn: (src: string) => { + // <iframe src="https://player.vimeo.com/video/179213493" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe> + if (!src) { + return null; + } + const m = src.match(/https:\/\/player\.vimeo\.com\/video\/([0-9]+)/); + if (!m || m.length !== 2) { + return null; + } + return 'https://player.vimeo.com/video/' + m[1]; + } + }, + { + // eslint-disable-next-line security/detect-unsafe-regex + re: /^(https?:)?\/\/www.youtube.com\/embed\/.*/i, + fn: (src: string) => { + return src.replace(/\?.+$/, ''); // strip query string (yt: autoplay=1,controls=0,showinfo=0, etc) + } + }, + { + re: /^https:\/\/w.soundcloud.com\/player\/.*/i, + fn: (src: string) => { + if (!src) { + return null; + } + // <iframe width="100%" height="450" scrolling="no" frameborder="no" src="https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/257659076&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true"></iframe> + const m = src.match(/url=(.+?)&/); + if (!m || m.length !== 2) { + return null; + } + return `https://w.soundcloud.com/player/?url=${m[1]}&auto_play=false&hide_related=false&show_comments=true&show_user=true&show_reposts=false&visual=true`; + } + }, + { + // eslint-disable-next-line security/detect-unsafe-regex + re: /^(https?:)?\/\/player.twitch.tv\/.*/i, + fn: (src: string) => { + // <iframe src="https://player.twitch.tv/?channel=ninja" frameborder="0" allowfullscreen="true" scrolling="no" height="378" width="620"> + return src; + } + }, + { + re: /^https:\/\/open\.spotify\.com\/(embed|embed-podcast)\/(playlist|show|episode|album|track|artist)\/(.*)/i, + fn: (src: string) => { + return src; + } + }, + { + // eslint-disable-next-line security/detect-unsafe-regex + re: /^(?:https?:)?\/\/(?:3speak\.(?:tv|online|co))\/embed\?v=([^&\s]+)/i, + fn: (src: string) => { + if (!src) return null; + const match = src.match(/3speak\.(?:tv|online|co)\/embed\?v=([^&\s]+)/i); + if (!match || match.length !== 2) return null; + return `https://3speak.tv/embed?v=${match[1]}`; + } + }, + { + // eslint-disable-next-line security/detect-unsafe-regex + re: /^(?:https?:)?\/\/(?:3speak\.(?:tv|online|co))\/watch\?v=([^&\s]+)/i, + fn: (src: string) => { + if (!src) return null; + const match = src.match(/3speak\.(?:tv|online|co)\/watch\?v=([^&\s]+)/i); + if (!match || match.length !== 2) return null; + return `https://3speak.tv/embed?v=${match[1]}`; + } + }, + { + re: /^(?:https:)\/\/(?:www\.)?(twitter|x)\.com\/(?:\w+\/status|status)\/(\d{1,20})/i, + fn: (src: string) => { + if (!src) { + return null; + } + const match = src.match(/(?:twitter|x)\.com\/(?:\w+\/status|status)\/(\d{1,20})/i); + if (!match || match.length !== 2) { + return null; + } + return `https://platform.twitter.com/embed/Tweet.html?id=${match[1]}`; + } + } + ], + noImageText: '(Image not shown due to low ratings)', + allowedTags: ` + div, iframe, del, + a, p, b, i, q, br, ul, li, ol, img, h1, h2, h3, h4, h5, h6, hr, + blockquote, pre, code, em, strong, center, table, thead, tbody, tr, th, td, + strike, sup, sub, details, summary +` + .trim() + .split(/,\s*/) + }; +} diff --git a/packages/renderer/src/renderers/default/embedder/AssetEmbedder.ts b/packages/renderer/src/renderers/default/embedder/AssetEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..7582e95456173f6d240617591a4b142d11d336ed --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/AssetEmbedder.ts @@ -0,0 +1,79 @@ +import ow from 'ow'; +import {LocalizationOptions} from '../Localization'; +import {AbstractEmbedder} from './embedders/AbstractEmbedder'; +import {SpotifyEmbedder} from './embedders/SpotifyEmbedder'; +import {ThreeSpeakEmbedder} from './embedders/ThreeSpeakEmbedder'; +import {TwitchEmbedder} from './embedders/TwitchEmbedder'; +import {TwitterEmbedder} from './embedders/TwitterEmbedder'; +import {VimeoEmbedder} from './embedders/VimeoEmbedder'; +import {YoutubeEmbedder} from './embedders/YoutubeEmbedder'; + +export class AssetEmbedder { + private readonly options: AssetEmbedderOptions; + private readonly localization: LocalizationOptions; + private readonly embedders: AbstractEmbedder[]; + + public constructor(options: AssetEmbedderOptions, localization: LocalizationOptions) { + AssetEmbedder.validate(options); + this.options = options; + this.localization = localization; + this.embedders = [ + // + new YoutubeEmbedder(), + new VimeoEmbedder(), + new TwitchEmbedder(options), + new SpotifyEmbedder(), + new ThreeSpeakEmbedder(), + new TwitterEmbedder() + ]; + } + + public static validate(o: AssetEmbedderOptions) { + ow(o, 'AssetEmbedderOptions', ow.object); + ow(o.ipfsPrefix, 'AssetEmbedderOptions.ipfsPrefix', ow.optional.string); + ow(o.width, 'AssetEmbedderOptions.width', ow.number.integer.positive); + ow(o.height, 'AssetEmbedderOptions.height', ow.number.integer.positive); + ow(o.hideImages, 'AssetEmbedderOptions.hideImages', ow.boolean); + ow(o.baseUrl, 'AssetEmbedderOptions.baseUrl', ow.string.nonEmpty); + ow(o.imageProxyFn, 'AssetEmbedderOptions.imageProxyFn', ow.function); + ow(o.hashtagUrlFn, 'AssetEmbedderOptions.hashtagUrlFn', ow.function); + ow(o.usertagUrlFn, 'AssetEmbedderOptions.usertagUrlFn', ow.function); + } + + public insertAssets(input: string): string { + const size = { + width: this.options.width, + height: this.options.height + }; + return this.insertMarkedEmbedsToRenderedOutput(input, size); + } + + public insertMarkedEmbedsToRenderedOutput(input: string, size: {width: number; height: number}): string { + return AbstractEmbedder.insertAllEmbeds(this.embedders, input, size); + } + + public processTextNodeAndInsertEmbeds(node: HTMLObjectElement): {links: string[]; images: string[]} { + const out: {links: string[]; images: string[]} = {links: [], images: []}; + + for (const embedder of this.embedders) { + const metadata = embedder.getEmbedMetadata(node); + if (metadata) { + node.data = node.data.replace(metadata.url, AbstractEmbedder.getEmbedMarker(metadata.id, embedder.type)); + if (metadata.image) out.images.push(metadata.image); + if (metadata.link) out.links.push(metadata.link); + } + } + return out; + } +} + +export interface AssetEmbedderOptions { + ipfsPrefix?: string; + width: number; + height: number; + hideImages: boolean; + baseUrl: string; + imageProxyFn: (url: string) => string; + hashtagUrlFn: (hashtag: string) => string; + usertagUrlFn: (account: string) => string; +} diff --git a/packages/renderer/src/renderers/default/embedder/HtmlDOMParser.test.ts b/packages/renderer/src/renderers/default/embedder/HtmlDOMParser.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..d46700c1f5bee71c37056021876ebca7e730207d --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/HtmlDOMParser.test.ts @@ -0,0 +1,184 @@ +/** + * Based on: https://github.com/openhive-network/condenser/blob/master/src/shared/HtmlReady.test.js + */ +import {expect} from 'chai'; +import 'mocha'; +import {AssetEmbedderOptions} from './AssetEmbedder'; +import {HtmlDOMParser} from './HtmlDOMParser'; + +describe('HtmlDOMParser', () => { + const htmlParserOptions: AssetEmbedderOptions = { + ipfsPrefix: '', + imageProxyFn: (url: string) => url, + usertagUrlFn: (account: string) => `/@${account}`, + hashtagUrlFn: (hashtag: string) => `/trending/${hashtag}`, + baseUrl: 'https://hive.blog/', + width: 640, + height: 480, + hideImages: false + }; + + it('should allow links where the text portion and href contains hive.blog', () => { + const dirty = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://hive.blog/signup" xmlns="http://www.w3.org/1999/xhtml">https://hive.blog/signup</a></xml>'; + const parser = new HtmlDOMParser(htmlParserOptions); + const res = parser.parse(dirty).getParsedDocumentAsString(); + expect(res).to.equal(dirty); + }); + + it('should allow in-page links ', () => { + const dirty = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="#some-link" xmlns="http://www.w3.org/1999/xhtml">a link location</a></xml>'; + const parser = new HtmlDOMParser(htmlParserOptions); + const res = parser.parse(dirty).getParsedDocumentAsString(); + expect(res).to.equal(dirty); + + const externalDomainDirty = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://anotherwebsite.com/apples#some-link" xmlns="http://www.w3.org/1999/xhtml">Another website\'s apple section</a></xml>'; + const externalDomainResult = parser.parse(externalDomainDirty).getParsedDocumentAsString(); + expect(externalDomainResult).to.equal(externalDomainDirty); + }); + + it('should not allow links where the text portion contains hive.blog but the link does not', () => { + const dirty = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://steamit.com/signup" xmlns="http://www.w3.org/1999/xhtml">https://hive.blog/signup</a></xml>'; + const cleansed = + '<xml xmlns="http://www.w3.org/1999/xhtml"><div title="Link expanded to plain text; beware of a potential phishing attempt" class="phishy">https://hive.blog/signup / https://steamit.com/signup</div></xml>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(dirty).getParsedDocumentAsString(); + expect(res).to.equal(cleansed); + + const cased = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://steamit.com/signup" xmlns="http://www.w3.org/1999/xhtml">https://hive.blog/signup</a></xml>'; + const cleansedcased = + '<xml xmlns="http://www.w3.org/1999/xhtml"><div title="Link expanded to plain text; beware of a potential phishing attempt" class="phishy">https://hive.blog/signup / https://steamit.com/signup</div></xml>'; + const rescased = new HtmlDOMParser(htmlParserOptions).parse(cased).getParsedDocumentAsString(); + expect(rescased).to.equal(cleansedcased); + + const withuser = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://steamit.com/signup" xmlns="http://www.w3.org/1999/xhtml">https://official@hive.blog/signup</a></xml>'; + const cleansedwithuser = + '<xml xmlns="http://www.w3.org/1999/xhtml"><div title="Link expanded to plain text; beware of a potential phishing attempt" class="phishy">https://official@hive.blog/signup / https://steamit.com/signup</div></xml>'; + const reswithuser = new HtmlDOMParser(htmlParserOptions).parse(withuser).getParsedDocumentAsString(); + expect(reswithuser).to.equal(cleansedwithuser); + + const noendingslash = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://steamit.com" xmlns="http://www.w3.org/1999/xhtml">https://hive.blog</a></xml>'; + const cleansednoendingslash = + '<xml xmlns="http://www.w3.org/1999/xhtml"><div title="Link expanded to plain text; beware of a potential phishing attempt" class="phishy">https://hive.blog / https://steamit.com</div></xml>'; + const resnoendingslash = new HtmlDOMParser(htmlParserOptions).parse(noendingslash).getParsedDocumentAsString(); + expect(resnoendingslash).to.equal(cleansednoendingslash); + + // make sure extra-domain in-page links are also caught by our phishy link scan. + const domainInpage = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://steamit.com#really-evil-inpage-component" xmlns="http://www.w3.org/1999/xhtml">https://hive.blog</a></xml>'; + const cleanDomainInpage = + '<xml xmlns="http://www.w3.org/1999/xhtml"><div title="Link expanded to plain text; beware of a potential phishing attempt" class="phishy">https://hive.blog / https://steamit.com#really-evil-inpage-component</div></xml>'; + const resDomainInpage = new HtmlDOMParser(htmlParserOptions).parse(domainInpage).getParsedDocumentAsString(); + expect(resDomainInpage).to.equal(cleanDomainInpage); + + // anchor links including hive.blog should be allowed + const inpage = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="#https://steamit.com/unlikelyinpagelink" xmlns="http://www.w3.org/1999/xhtml">Go down lower for https://hive.blog info!</a></xml>'; + const cleanInpage = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="#https://steamit.com/unlikelyinpagelink" xmlns="http://www.w3.org/1999/xhtml">Go down lower for https://hive.blog info!</a></xml>'; + const resinpage = new HtmlDOMParser(htmlParserOptions).parse(inpage).getParsedDocumentAsString(); + expect(resinpage).to.equal(cleanInpage); + + const noprotocol = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://steamit.com/" xmlns="http://www.w3.org/1999/xhtml">for a good time, visit hive.blog today</a></xml>'; + const cleansednoprotocol = + '<xml xmlns="http://www.w3.org/1999/xhtml"><div title="Link expanded to plain text; beware of a potential phishing attempt" class="phishy">for a good time, visit hive.blog today / https://steamit.com/</div></xml>'; + const resnoprotocol = new HtmlDOMParser(htmlParserOptions).parse(noprotocol).getParsedDocumentAsString(); + expect(resnoprotocol).to.equal(cleansednoprotocol); + }); + + it('should allow more than one link per post', () => { + const somanylinks = '<xml xmlns="http://www.w3.org/1999/xhtml">https://foo.com and https://blah.com</xml>'; + const htmlified = + '<xml xmlns="http://www.w3.org/1999/xhtml"><span><a href="https://foo.com">https://foo.com</a> and <a href="https://blah.com">https://blah.com</a></span></xml>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(somanylinks).getParsedDocumentAsString(); + expect(res).to.equal(htmlified); + }); + + it('should link usernames', () => { + const textwithmentions = '<xml xmlns="http://www.w3.org/1999/xhtml">@username (@a1b2, whatever</xml>'; + const htmlified = '<xml xmlns="http://www.w3.org/1999/xhtml"><span><a href="/@username">@username</a> (<a href="/@a1b2">@a1b2</a>, whatever</span></xml>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(textwithmentions).getParsedDocumentAsString(); + expect(res).to.equal(htmlified); + }); + + it('should detect only valid mentions', () => { + const textwithmentions = '@abc @xx (@aaa1) @_x @eee, @fff! https://x.com/@zzz/test'; + const res = new HtmlDOMParser(htmlParserOptions).setMutateEnabled(false).parse(textwithmentions).getState(); + const usertags = Array.from(res.usertags).join(','); + expect(usertags).to.equal('abc,aaa1,eee,fff'); + }); + + it('should not link usernames at the front of linked text', () => { + const nameinsidelinkfirst = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://hive.blog/signup">@hihi</a></xml>'; + const htmlified = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://hive.blog/signup">@hihi</a></xml>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(nameinsidelinkfirst).getParsedDocumentAsString(); + expect(res).to.equal(htmlified); + }); + + it('should not link usernames in the middle of linked text', () => { + const nameinsidelinkmiddle = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://hive.blog/signup">hi @hihi</a></xml>'; + const htmlified = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://hive.blog/signup">hi @hihi</a></xml>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(nameinsidelinkmiddle).getParsedDocumentAsString(); + expect(res).to.equal(htmlified); + }); + + it('should make relative links absolute with https by default', () => { + const noRelativeHttpHttpsOrHive = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="land.com"> zippy </a> </xml>'; + const cleansedRelativeHttpHttpsOrHive = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://land.com"> zippy </a> </xml>'; + const resNoRelativeHttpHttpsOrHive = new HtmlDOMParser(htmlParserOptions).parse(noRelativeHttpHttpsOrHive).getParsedDocumentAsString(); + expect(resNoRelativeHttpHttpsOrHive).to.equal(cleansedRelativeHttpHttpsOrHive); + }); + + it('should allow the hive uri scheme for vessel links', () => { + const noRelativeHttpHttpsOrHive = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="hive://veins.com"> arteries </a> </xml>'; + const cleansedRelativeHttpHttpsOrHive = '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="hive://veins.com"> arteries </a> </xml>'; + const resNoRelativeHttpHttpsOrHive = new HtmlDOMParser(htmlParserOptions).parse(noRelativeHttpHttpsOrHive).getParsedDocumentAsString(); + expect(resNoRelativeHttpHttpsOrHive).to.equal(cleansedRelativeHttpHttpsOrHive); + }); + + it('should not mistake usernames in valid comment urls as mentions', () => { + const url = 'https://hive.blog/spam/@test-safari/34gfex-december-spam#@test-safari/re-test-safari-34gfex-december-spam-20180110t234627522z'; + const prefix = '<xml xmlns="http://www.w3.org/1999/xhtml">'; + const suffix = '</xml>'; + const input = prefix + url + suffix; + const expected = prefix + '<span><a href="' + url + '">' + url + '</a></span>' + suffix; + const result = new HtmlDOMParser(htmlParserOptions).parse(input).getParsedDocumentAsString(); + expect(result).to.equal(expected); + }); + + it('should not modify text when mention contains invalid username', () => { + const body = 'valid mention match but invalid username..@usernamewaytoolong'; + const prefix = '<xml xmlns="http://www.w3.org/1999/xhtml">'; + const suffix = '</xml>'; + const input = prefix + body + suffix; + const result = new HtmlDOMParser(htmlParserOptions).parse(input).getParsedDocumentAsString(); + expect(result).to.equal(input); + }); + + it('should detect urls that are phishy', () => { + const dirty = + '<xml xmlns="http://www.w3.org/1999/xhtml"><a href="https://steewit.com/signup" xmlns="http://www.w3.org/1999/xhtml">https://hive.blog/signup</a></xml>'; + const cleansed = + '<xml xmlns="http://www.w3.org/1999/xhtml"><div title="Link expanded to plain text; beware of a potential phishing attempt" class="phishy">https://hive.blog/signup / https://steewit.com/signup</div></xml>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(dirty).getParsedDocumentAsString(); + expect(res).to.equal(cleansed); + }); + + it('should not omit text on same line as youtube link', () => { + const testString = '<html><p>before text https://www.youtube.com/watch?v=NrS9vvNgx7I after text</p></html>'; + const htmlified = '<html xmlns="http://www.w3.org/1999/xhtml"><p>before text ~~~ embed:NrS9vvNgx7I youtube ~~~ after text</p></html>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(testString).getParsedDocumentAsString(); + expect(res).to.equal(htmlified); + }); + + it('should not omit text on same line as vimeo link', () => { + const testString = '<html><p>before text https://vimeo.com/193628816/ after text</p></html>'; + const htmlified = '<html xmlns="http://www.w3.org/1999/xhtml"><p>before text ~~~ embed:193628816 vimeo ~~~ after text</p></html>'; + const res = new HtmlDOMParser(htmlParserOptions).parse(testString).getParsedDocumentAsString(); + expect(res).to.equal(htmlified); + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/HtmlDOMParser.ts b/packages/renderer/src/renderers/default/embedder/HtmlDOMParser.ts new file mode 100644 index 0000000000000000000000000000000000000000..160a0ebd65480c2bb2d70edeff45da0ed814b649 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/HtmlDOMParser.ts @@ -0,0 +1,359 @@ +/** + * Based on: https://github.com/openhive-network/condenser/blob/master/src/shared/HtmlReady.js + */ + +import * as xmldom from '@xmldom/xmldom'; +import ChainedError from 'typescript-chained-error'; +import {Log} from '../../../Log'; +import {LinkSanitizer} from '../../../security/LinkSanitizer'; +import {Localization, LocalizationOptions} from '../Localization'; +import {AssetEmbedder, AssetEmbedderOptions} from './AssetEmbedder'; +import {YoutubeEmbedder} from './embedders/YoutubeEmbedder'; +import {AccountNameValidator} from './utils/AccountNameValidator'; +import linksRe, {any as linksAny} from './utils/Links'; + +export class HtmlDOMParser { + private options: AssetEmbedderOptions; + private localization: LocalizationOptions; + private linkSanitizer: LinkSanitizer; + public embedder: AssetEmbedder; + + private domParser = new xmldom.DOMParser({ + errorHandler: { + warning: () => { + /* */ + }, + error: () => { + /* */ + } + } + }); + private xmlSerializer = new xmldom.XMLSerializer(); + private state: State; + private mutate = true; + private parsedDocument: Document | undefined = undefined; + + public constructor(options: AssetEmbedderOptions, localization: LocalizationOptions = Localization.DEFAULT) { + AssetEmbedder.validate(options); + Localization.validate(localization); + this.options = options; + this.localization = localization; + this.linkSanitizer = new LinkSanitizer({ + baseUrl: this.options.baseUrl + }); + + this.embedder = new AssetEmbedder( + { + ipfsPrefix: this.options.ipfsPrefix, + width: this.options.width, + height: this.options.height, + hideImages: this.options.hideImages, + imageProxyFn: this.options.imageProxyFn, + hashtagUrlFn: this.options.hashtagUrlFn, + usertagUrlFn: this.options.usertagUrlFn, + baseUrl: this.options.baseUrl + }, + localization + ); + + this.state = { + hashtags: new Set(), + usertags: new Set(), + htmltags: new Set(), + images: new Set(), + links: new Set() + }; + } + + public setMutateEnabled(mutate: boolean): HtmlDOMParser { + this.mutate = mutate; + return this; + } + + public parse(html: string): HtmlDOMParser { + try { + const doc: Document = this.domParser.parseFromString(html, 'text/html'); + this.traverseDOMNode(doc); + if (this.mutate) this.postprocessDOM(doc); + this.parsedDocument = doc; + } catch (error) { + throw new HtmlDOMParserError('Parsing error', error as Error); + } + + return this; + } + + public getState(): State { + if (!this.parsedDocument) throw new HtmlDOMParserError('Html has not been parsed yet'); + return this.state; + } + + public getParsedDocument(): Document { + if (!this.parsedDocument) throw new HtmlDOMParserError('Html has not been parsed yet'); + return this.parsedDocument; + } + + public getParsedDocumentAsString(): string { + return this.xmlSerializer.serializeToString(this.getParsedDocument()); + } + + private traverseDOMNode(node: Document | ChildNode, depth = 0) { + if (!node || !node.childNodes) { + return; + } + + Array.from(node.childNodes).forEach((child) => { + const tag = (child as any).tagName ? (child as any).tagName.toLowerCase() : null; + if (tag) { + this.state.htmltags.add(tag); + } + + if (tag === 'img') { + this.processImgTag(child as HTMLObjectElement); + } else if (tag === 'iframe') { + this.processIframeTag(child as HTMLObjectElement); + } else if (tag === 'a') { + this.processLinkTag(child as HTMLObjectElement); + } else if (child.nodeName === '#text') { + this.processTextNode(child as HTMLObjectElement); + } + + this.traverseDOMNode(child, depth + 1); + }); + } + + private processLinkTag(child: HTMLObjectElement) { + const url = child.getAttribute('href'); + if (url) { + this.state.links.add(url); + if (this.mutate) { + // Unlink potential phishing attempts + const urlTitle = child.textContent + ''; + const sanitizedLink = this.linkSanitizer.sanitizeLink(url, urlTitle); + if (sanitizedLink === false) { + const phishyDiv = (child as any).ownerDocument.createElement('div'); + phishyDiv.textContent = `${child.textContent} / ${url}`; + phishyDiv.setAttribute('title', this.localization.phishingWarning); + phishyDiv.setAttribute('class', 'phishy'); + const parent = child.parentNode; + if (parent) { + parent.appendChild(phishyDiv); + parent.removeChild(child); + } + } else { + child.setAttribute('href', sanitizedLink); + } + } + } + } + + // wrap iframes in div.videoWrapper to control size/aspect ratio + private processIframeTag(child: HTMLObjectElement) { + const url = child.getAttribute('src'); + if (url) this.reportIframeLink(url); + + if (!this.mutate) { + return; + } + + const tag = (child as any).parentNode.tagName ? (child as any).parentNode.tagName.toLowerCase() : (child as any).parentNode.tagName; + if (tag === 'div' && (child as any).parentNode.getAttribute('class') === 'videoWrapper') { + return; + } + const html = this.xmlSerializer.serializeToString(child); + const wrapper = this.domParser.parseFromString(`<div class="videoWrapper">${html}</div>`); + const parent = child.parentNode; + if (parent) { + parent.appendChild(wrapper); + parent.removeChild(child); + } + } + + // TODO this is youtube specific but should be executed for all iframes and embedders + // TODO https://gitlab.syncad.com/hive/hive-renderer/-/issues/17 + private reportIframeLink(url: string) { + const yt = YoutubeEmbedder.getYoutubeMetadataFromLink(url); + if (yt) { + this.state.links.add(yt.url); + this.state.images.add('https://img.youtube.com/vi/' + yt.id + '/0.jpg'); + } + } + + private processImgTag(child: HTMLObjectElement) { + const url = child.getAttribute('src'); + if (url) { + this.state.images.add(url); + if (this.mutate) { + let url2 = this.normalizeUrl(url); + if (/^\/\//.test(url2)) { + // Change relative protocol imgs to https + url2 = 'https:' + url2; + } + if (url2 !== url) { + child.setAttribute('src', url2); + } + } + } + } + + private processTextNode(child: HTMLObjectElement) { + try { + const tag = (child.parentNode as any).tagName ? (child.parentNode as any).tagName.toLowerCase() : (child.parentNode as any).tagName; + if (tag === 'code') { + return; + } + if (tag === 'a') { + return; + } + + if (!child.data) { + return; + } + + const embedResp = this.embedder.processTextNodeAndInsertEmbeds(child); + embedResp.images.forEach((img) => this.state.images.add(img)); + embedResp.links.forEach((link) => this.state.links.add(link)); + + const data = this.xmlSerializer.serializeToString(child); + const content = this.linkify(data); + if (this.mutate && content !== data) { + const newChild = this.domParser.parseFromString(`<span>${content}</span>`); + const parent = child.parentNode; + if (parent) { + parent.appendChild(newChild); + parent.removeChild(child); + } + return newChild; + } + } catch (error) { + Log.log().error(error); + } + } + + private linkify(content: string) { + // plaintext links + content = content.replace(linksAny('gi'), (ln) => { + if (linksRe.image.test(ln)) { + this.state.images.add(ln); + return `<img src="${this.normalizeUrl(ln)}" />`; + } + + // do not linkify .exe or .zip urls + if (/\.(zip|exe)$/i.test(ln)) { + return ln; + } + + // do not linkify phishy links + const sanitizedLink = this.linkSanitizer.sanitizeLink(ln, ln); + if (sanitizedLink === false) { + return `<div title='${this.localization.phishingWarning}' class='phishy'>${ln}</div>`; + } + + this.state.links.add(sanitizedLink); + return `<a href="${this.normalizeUrl(ln)}">${sanitizedLink}</a>`; + }); + + // hashtag + content = content.replace(/(^|\s)(#[-a-z\d]+)/gi, (tag) => { + if (/#[\d]+$/.test(tag)) { + return tag; + } // Don't allow numbers to be tags + const space = /^\s/.test(tag) ? tag[0] : ''; + const tag2 = tag.trim().substring(1); + const tagLower = tag2.toLowerCase(); + this.state.hashtags.add(tagLower); + if (!this.mutate) { + return tag; + } + const tagUrl = this.options.hashtagUrlFn(tagLower); + return space + `<a href="${tagUrl}">${tag.trim()}</a>`; + }); + + // usertag (mention) + // Cribbed from https://github.com/twitter/twitter-text/blob/v1.14.7/js/twitter-text.js#L90 + content = content.replace(/(^|[^a-zA-Z0-9_!#$%&*@ï¼ /]|(^|[^a-zA-Z0-9_+~.-/#]))[@ï¼ ]([a-z][-.a-z\d]+[a-z\d])/gi, (_match, preceeding1, preceeding2, user) => { + const userLower = user.toLowerCase(); + const valid = AccountNameValidator.validateAccountName(userLower, this.localization) == null; + + if (valid && this.state.usertags) { + this.state.usertags.add(userLower); + } + + // include the preceeding matches if they exist + const preceedings = (preceeding1 || '') + (preceeding2 || ''); + + if (!this.mutate) { + return `${preceedings}${user}`; + } + + const userTagUrl = this.options.usertagUrlFn(userLower); + return valid ? `${preceedings}<a href="${userTagUrl}">@${user}</a>` : `${preceedings}@${user}`; + }); + return content; + } + + private postprocessDOM(doc: Document) { + this.hideImagesIfNeeded(doc); + this.proxifyImagesIfNeeded(doc); + } + + private hideImagesIfNeeded(doc: Document) { + if (this.mutate && this.options.hideImages) { + for (const image of Array.from(doc.getElementsByTagName('img'))) { + const pre = doc.createElement('pre'); + pre.setAttribute('class', 'image-url-only'); + pre.appendChild(doc.createTextNode(image.getAttribute('src') || '')); + const parent = image.parentNode; + if (parent) { + parent.appendChild(pre); + parent.removeChild(image); + } + } + } + } + + private proxifyImagesIfNeeded(doc: Document) { + if (this.mutate && !this.options.hideImages) { + this.proxifyImages(doc); + } + } + + // For all img elements with non-local URLs, prepend the proxy URL (e.g. `https://images.hive.blog/0x0/`) + private proxifyImages(doc: Document) { + if (!doc) { + return; + } + Array.from(doc.getElementsByTagName('img')).forEach((node) => { + const url: string = node.getAttribute('src') || ''; + if (!linksRe.local.test(url)) { + node.setAttribute('src', this.options.imageProxyFn(url)); + } + }); + } + + private normalizeUrl(url: any) { + if (this.options.ipfsPrefix) { + // Convert //ipfs/xxx or /ipfs/xxx or ipfs://xxx into ${ipfsPrefix}/xxx + if (linksRe.ipfsProtocol.test(url)) { + const [protocol] = url.match(linksRe.ipfsProtocol); + const cid = url.replace(protocol, ''); + return `${this.options.ipfsPrefix.replace(/\/+$/, '')}/${cid}`; + } + } + return url; + } +} + +export interface State { + hashtags: Set<string>; + usertags: Set<string>; + htmltags: Set<string>; + images: Set<string>; + links: Set<string>; +} + +export class HtmlDOMParserError extends ChainedError { + public constructor(message?: string, cause?: Error) { + super(message, cause); + } +} diff --git a/packages/renderer/src/renderers/default/embedder/embedders/AbstractEmbedder.ts b/packages/renderer/src/renderers/default/embedder/embedders/AbstractEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..2af02f0aac26b75880ccee8377d7844beafd9214 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/AbstractEmbedder.ts @@ -0,0 +1,58 @@ +export abstract class AbstractEmbedder { + public abstract type: string; + + /** + * Sanitize the URL to prevent XSS attacks. It should return a URL that is safe to embed. + */ + // public abstract sanitizeIFrameUrl(url: string): string; + + /** + * Get the metadata for the embed. This is used to generate the embed marker and to insert the embed into the rendered output. + */ + public abstract getEmbedMetadata(textNode: HTMLObjectElement): EmbedMetadata | undefined; + + /** + * Process the embed if it is relevant to this embedder. If it is not relevant, return undefined. + */ + public abstract processEmbed(id: string, size: {width: number; height: number}): string; + + public static getEmbedMarker(id: string, type: string) { + return `~~~ embed:${id} ${type} ~~~`; + } + + public static insertAllEmbeds(embedders: AbstractEmbedder[], input: string, size: {width: number; height: number}): string { + const sections = []; + + // HtmlReady inserts ~~~ embed:${id} type ~~~ + for (let section of input.split('~~~ embed:')) { + const match = section.match(/^([A-Za-z0-9?/=_-]+) ([^ ]*) ~~~/); + if (match && match.length >= 3) { + const id = match[1]; + const type = match[2]; + for (const embedder of embedders) { + if (embedder.type == type) { + sections.push(embedder.processEmbed(id, size)); + break; + } + } + section = section.substring(`${id} ${type} ~~~`.length); + if (section === '') { + continue; + } + } + sections.push(section); + } + return sections.join(''); + } +} + +export interface EmbedMetadata { + /** The ID of the embed which will be used later on to convert it into rich embed */ + id: string; + /** The URL from which the embed takes its source */ + url: string; + /** Optional image to be used as a thumbnail */ + image?: string; + /** Optional link detected */ + link?: string; +} diff --git a/packages/renderer/src/renderers/default/embedder/embedders/SpotifyEmbedder.test.ts b/packages/renderer/src/renderers/default/embedder/embedders/SpotifyEmbedder.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..85a2177fa78cc194fadf370916ba49fb2a0c309f --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/SpotifyEmbedder.test.ts @@ -0,0 +1,107 @@ +import {expect} from 'chai'; +import {SpotifyEmbedder} from './SpotifyEmbedder'; + +describe('SpotifyEmbedder', () => { + [ + { + description: 'should properly return metadata for spotify playlist', + input: 'https://open.spotify.com/playlist/1zLvUhumbFIEdfxYQcgUxk', + expected: { + image: 'https://open.spotify.com/playlist/1zLvUhumbFIEdfxYQcgUxk', + id: 'embed/playlist/1zLvUhumbFIEdfxYQcgUxk', + url: 'https://open.spotify.com/playlist/1zLvUhumbFIEdfxYQcgUxk' + } + }, + { + description: 'should properly return metadata for spotify show', + input: 'https://open.spotify.com/show/1zLvUhumbFIEdfxYQcgUxk', + expected: { + image: 'https://open.spotify.com/show/1zLvUhumbFIEdfxYQcgUxk', + id: 'embed-podcast/show/1zLvUhumbFIEdfxYQcgUxk', + url: 'https://open.spotify.com/show/1zLvUhumbFIEdfxYQcgUxk' + } + }, + { + description: 'should properly return metadata for spotify episode', + input: 'https://open.spotify.com/episode/1zLvUhumbFIEdfxYQcgUxk', + expected: { + image: 'https://open.spotify.com/episode/1zLvUhumbFIEdfxYQcgUxk', + id: 'embed-podcast/episode/1zLvUhumbFIEdfxYQcgUxk', + url: 'https://open.spotify.com/episode/1zLvUhumbFIEdfxYQcgUxk' + } + }, + { + description: 'should properly return metadata for spotify album', + input: 'https://open.spotify.com/album/1zLvUhumbFIEdfxYQcgUxk', + expected: { + image: 'https://open.spotify.com/album/1zLvUhumbFIEdfxYQcgUxk', + id: 'embed/album/1zLvUhumbFIEdfxYQcgUxk', + url: 'https://open.spotify.com/album/1zLvUhumbFIEdfxYQcgUxk' + } + }, + { + description: 'should properly return metadata for spotify track', + input: 'https://open.spotify.com/track/1zLvUhumbFIEdfxYQcgUxk', + expected: { + image: 'https://open.spotify.com/track/1zLvUhumbFIEdfxYQcgUxk', + id: 'embed/track/1zLvUhumbFIEdfxYQcgUxk', + url: 'https://open.spotify.com/track/1zLvUhumbFIEdfxYQcgUxk' + } + }, + { + description: 'should properly return metadata for spotify artist', + input: 'https://open.spotify.com/artist/1zLvUhumbFIEdfxYQcgUxk', + expected: { + image: 'https://open.spotify.com/artist/1zLvUhumbFIEdfxYQcgUxk', + id: 'embed/artist/1zLvUhumbFIEdfxYQcgUxk', + url: 'https://open.spotify.com/artist/1zLvUhumbFIEdfxYQcgUxk' + } + }, + { + description: 'should return undefined for invalid input', + input: 'https://open.spotify.com/invalid/1zLvUhumbFIEdfxYQcgUxk', + expected: undefined + }, + { + description: 'should return undefined for empty input', + input: '', + expected: undefined + }, + { + description: 'should return undefined for undefined input', + input: undefined, + expected: undefined + } + ].forEach((test) => { + it(test.description, () => { + const embedder = new SpotifyEmbedder(); + const node = {data: test.input} as HTMLObjectElement; + const result = embedder.getEmbedMetadata(node); + + expect(result).to.be.deep.equal(test.expected); + }); + }); + + it('should properly process embed', () => { + const embedder = new SpotifyEmbedder(); + const result = embedder.processEmbed('embed/playlist/1zLvUhumbFIEdfxYQcgUxk', {width: 300, height: 300}); + const expected = + '<div class="videoWrapper"><iframe src="https://open.spotify.com/embed/playlist/1zLvUhumbFIEdfxYQcgUxk" width="300" height="300" frameBorder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen ></iframe></div>'; + + expect(result).to.be.equal(expected); + }); + + it('should log exceptions and return undefined', () => { + // mock SpotifyEmbedder.extractMetadata to throw an exception + const extractMetadata = SpotifyEmbedder['extractMetadata']; + SpotifyEmbedder['extractMetadata'] = () => { + throw new Error('mock error'); + }; + const embedder = new SpotifyEmbedder(); + const node = {data: 'https://open.spotify.com/playlist/1zLvUhumbFIEdfxYQcgUxk'} as HTMLObjectElement; + const result = embedder.getEmbedMetadata(node); + + expect(result).to.be.undefined; + SpotifyEmbedder['extractMetadata'] = extractMetadata; + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/embedders/SpotifyEmbedder.ts b/packages/renderer/src/renderers/default/embedder/embedders/SpotifyEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..89d20560b40d89461d4cc545d477f73e22abb42c --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/SpotifyEmbedder.ts @@ -0,0 +1,52 @@ +import {Log} from '../../../../Log'; +import {AbstractEmbedder, EmbedMetadata} from './AbstractEmbedder'; + +interface SpotifyMetadata { + id: string; + url: string; + canonical: string; +} + +export class SpotifyEmbedder extends AbstractEmbedder { + public type = 'spotify'; + + private static readonly regex = { + main: /https?:\/\/open.spotify.com\/(playlist|show|episode|album|track|artist)\/(.*)/i, + sanitize: /^https:\/\/open\.spotify\.com\/(embed|embed-podcast)\/(playlist|show|episode|album|track|artist)\/(.*)/i // TODO ?? + }; + + private static extractMetadata(data: string): SpotifyMetadata | undefined { + if (!data) return undefined; + const m = data.match(SpotifyEmbedder.regex.main); + if (!m || m.length < 2) return undefined; + + const embed = m[1] === 'show' || m[1] === 'episode' ? 'embed-podcast' : 'embed'; + + return { + id: `${embed}/${m[1]}/${m[2]}`, + url: m[0], + canonical: `https://open.spotify.com/${m[1]}/${m[2]}` + }; + } + + public getEmbedMetadata(child: HTMLObjectElement): EmbedMetadata | undefined { + try { + const metadata = SpotifyEmbedder.extractMetadata(child.data); + if (!metadata) { + return undefined; + } + return { + id: metadata.id, + url: metadata.url, + image: metadata.canonical + }; + } catch (error) { + Log.log().error(error); + } + return undefined; + } + public processEmbed(id: string, size: {width: number; height: number}): string { + const url = `https://open.spotify.com/${id}`; + return `<div class="videoWrapper"><iframe src="${url}" width="${size.width}" height="${size.height}" frameBorder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen ></iframe></div>`; + } +} diff --git a/packages/renderer/src/renderers/default/embedder/embedders/ThreeSpeakEmbedder.test.ts b/packages/renderer/src/renderers/default/embedder/embedders/ThreeSpeakEmbedder.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c9fb87247856686f7a552d426ecf25dcb734a78 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/ThreeSpeakEmbedder.test.ts @@ -0,0 +1,58 @@ +import {expect} from 'chai'; +import {ThreeSpeakEmbedder} from './ThreeSpeakEmbedder'; + +describe('ThreeSpeakEmbedder', () => { + let embedder: ThreeSpeakEmbedder; + + beforeEach(() => { + embedder = new ThreeSpeakEmbedder(); + }); + + describe('getEmbedMetadata', () => { + it('should return correct metadata for valid 3Speak URL', () => { + const url = 'https://3speak.tv/watch?v=username/video-id'; + const metadata = embedder.getEmbedMetadata(url); + expect(metadata).to.deep.equal({ + id: 'username/video-id', + url: 'https://3speak.tv/watch?v=username/video-id' + }); + }); + + it('should return undefined for invalid URL', () => { + const url = 'https://example.com/invalid'; + const metadata = embedder.getEmbedMetadata(url); + expect(metadata).to.be.undefined; + }); + + it('should handle embed URLs', () => { + const url = 'https://3speak.tv/embed?v=username/video-id'; + const metadata = embedder.getEmbedMetadata(url); + expect(metadata).to.deep.equal({ + id: 'username/video-id', + url: 'https://3speak.tv/embed?v=username/video-id' + }); + }); + + it('should handle watch URLs', () => { + const url = 'https://3speak.tv/watch?v=username/video-id'; + const metadata = embedder.getEmbedMetadata(url); + expect(metadata).to.deep.equal({ + id: 'username/video-id', + url: 'https://3speak.tv/watch?v=username/video-id' + }); + }); + }); + + describe('processEmbed', () => { + it('should generate correct iframe HTML', () => { + const id = 'username/video-id'; + const size = {width: 500, height: 300}; + + const result = embedder.processEmbed(id, size); + + expect(result).to.equal( + '<div class="threeSpeakWrapper"><iframe width="500" height="300" src="https://3speak.tv/embed?v=username/video-id" frameborder="0" allowfullscreen></iframe></div>' + ); + }); + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/embedders/ThreeSpeakEmbedder.ts b/packages/renderer/src/renderers/default/embedder/embedders/ThreeSpeakEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..62793dc398ba3b0c9a2c1b04661f18e2dadff083 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/ThreeSpeakEmbedder.ts @@ -0,0 +1,31 @@ +import {Log} from '../../../../Log'; +import {AbstractEmbedder, EmbedMetadata} from './AbstractEmbedder'; + +export class ThreeSpeakEmbedder extends AbstractEmbedder { + public type = '3speak'; + + private static readonly linkRegex = + /^(?:https?:\/\/)?(?:(?:3speak\.(?:tv|online|co)\/watch\?v=)|(?:3speak\.tv\/embed\?v=))([a-zA-Z0-9_.-]+\/[a-zA-Z0-9_-]+)(?:&.*)?$/; + + public getEmbedMetadata(input: string | HTMLObjectElement): EmbedMetadata | undefined { + const url = typeof input === 'string' ? input : input.data; + try { + const match = url.match(ThreeSpeakEmbedder.linkRegex); + if (match && match[1]) { + const id = match[1]; + return { + id, + url: url // Return the original URL + }; + } + } catch (error) { + Log.log().error(error); + } + return undefined; + } + + public processEmbed(id: string, size: {width: number; height: number}): string { + const embedUrl = `https://3speak.tv/embed?v=${id}`; + return `<div class="threeSpeakWrapper"><iframe width="${size.width}" height="${size.height}" src="${embedUrl}" frameborder="0" allowfullscreen></iframe></div>`; + } +} diff --git a/packages/renderer/src/renderers/default/embedder/embedders/TwitchEmbedder.test.ts b/packages/renderer/src/renderers/default/embedder/embedders/TwitchEmbedder.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..298cba01df5ecb4efefb1818ac4daa9e6c0e18ed --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/TwitchEmbedder.test.ts @@ -0,0 +1,51 @@ +import {expect} from 'chai'; +import {AssetEmbedderOptions} from '../AssetEmbedder'; +import {TwitchEmbedder} from './TwitchEmbedder'; + +const options = {baseUrl: 'https://engrave.dev'} as AssetEmbedderOptions; + +describe('TwitchEmbedder', () => { + [ + { + description: 'should properly return metadata for twitch video', + input: 'https://www.twitch.tv/videos/123456789', + expected: { + id: '?video=123456789', + url: 'https://www.twitch.tv/videos/123456789', + canonical: 'https://player.twitch.tv/?video=123456789' + } + }, + { + description: 'should return undefined for invalid input', + input: 'https://open.spotify.com/invalid/1zLvUhumbFIEdfxYQcgUxk', + expected: undefined + }, + { + description: 'should return undefined for empty input', + input: '', + expected: undefined + }, + { + description: 'should return undefined for undefined input', + input: undefined, + expected: undefined + } + ].forEach((test) => { + it(test.description, () => { + const embedder = new TwitchEmbedder(options); + const node = {data: test.input} as HTMLObjectElement; + const result = embedder.getEmbedMetadata(node); + + expect(result).to.be.deep.equal(test.expected); + }); + }); + + it('should properly process twitch video', () => { + const embedder = new TwitchEmbedder({baseUrl: 'https://engrave.dev'} as AssetEmbedderOptions); + const result = embedder.processEmbed('?video=123456789', {width: 100, height: 200}); + + expect(result).to.be.equal( + '<div class="videoWrapper"><iframe src=https://player.twitch.tv/?video=123456789&parent=engrave.dev width=100 height=200 frameBorder="0" allowFullScreen></iframe></div>' + ); + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/embedders/TwitchEmbedder.ts b/packages/renderer/src/renderers/default/embedder/embedders/TwitchEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4c9b74690cf5447e5bf8f7224602c2c1f3e4ca3 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/TwitchEmbedder.ts @@ -0,0 +1,52 @@ +import {Log} from '../../../../Log'; +import {AssetEmbedderOptions} from '../AssetEmbedder'; +import linksRe from '../utils/Links'; +import {AbstractEmbedder, EmbedMetadata} from './AbstractEmbedder'; + +export class TwitchEmbedder extends AbstractEmbedder { + public type = 'twitch'; + private readonly domain: string; + + public constructor(options: AssetEmbedderOptions) { + super(); + this.domain = new URL(options.baseUrl).hostname; + } + + public getEmbedMetadata(child: HTMLObjectElement): EmbedMetadata | undefined { + try { + const data = child.data; + const twitch = this.twitchId(data); + if (!twitch) { + return undefined; + } + + return { + ...twitch + }; + } catch (error) { + Log.log().error(error); + } + return undefined; + } + + public processEmbed(id: string, size: {width: number; height: number}): string { + const url = `https://player.twitch.tv/${id}&parent=${this.domain}`; + return `<div class="videoWrapper"><iframe src=${url} width=${size.width} height=${size.height} frameBorder="0" allowFullScreen></iframe></div>`; + } + + private twitchId(data: any) { + if (!data) { + return null; + } + const m = data.match(linksRe.twitch); + if (!m || m.length < 3) { + return null; + } + + return { + id: m[1] === `videos` ? `?video=${m[2]}` : `?channel=${m[2]}`, + url: m[0], + canonical: m[1] === `videos` ? `https://player.twitch.tv/?video=${m[2]}` : `https://player.twitch.tv/?channel=${m[2]}` + }; + } +} diff --git a/packages/renderer/src/renderers/default/embedder/embedders/TwitterEmbedder.test.ts b/packages/renderer/src/renderers/default/embedder/embedders/TwitterEmbedder.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..65c8a7cddd5c8e9602e9aff4a8ed724d31335125 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/TwitterEmbedder.test.ts @@ -0,0 +1,80 @@ +import {expect} from 'chai'; +import {TwitterEmbedder} from './TwitterEmbedder'; + +describe('TwitterEmbedder', () => { + let embedder: TwitterEmbedder; + + beforeEach(() => { + embedder = new TwitterEmbedder(); + }); + + describe('getXMetadataFromLink', () => { + it('should extract metadata from a valid Twitter link', () => { + const link = 'https://twitter.com/username/status/1234567890'; + const metadata = embedder.getEmbedMetadata(link); + + expect(metadata).to.not.be.undefined; + expect(metadata?.id).to.equal('1234567890'); + expect(metadata?.url).to.equal(link); + }); + + it('should extract metadata from a valid X link', () => { + const link = 'https://x.com/username/status/1234567890'; + const metadata = embedder.getEmbedMetadata(link); + + expect(metadata).to.not.be.undefined; + expect(metadata?.id).to.equal('1234567890'); + expect(metadata?.url).to.equal(link); + }); + + it('should return undefined for an invalid link', () => { + const link = 'https://example.com/not-a-tweet'; + const metadata = embedder.getEmbedMetadata(link); + + expect(metadata).to.be.undefined; + }); + + it('should return undefined for an empty string', () => { + const metadata = embedder.getEmbedMetadata(''); + + expect(metadata).to.be.undefined; + }); + }); + + describe('getEmbedMetadata', () => { + it('should return embed metadata for a valid Twitter object', () => { + const mockObject = { + data: 'https://twitter.com/username/status/1234567890' + } as HTMLObjectElement; + + const metadata = embedder.getEmbedMetadata(mockObject); + + expect(metadata).to.not.be.undefined; + expect(metadata?.id).to.equal('1234567890'); + expect(metadata?.url).to.equal('https://twitter.com/username/status/1234567890'); + }); + + it('should return undefined for an invalid object', () => { + const mockObject = { + data: 'https://example.com/not-a-tweet' + } as HTMLObjectElement; + + const metadata = embedder.getEmbedMetadata(mockObject); + + expect(metadata).to.be.undefined; + }); + }); + + describe('processEmbed', () => { + it('should generate correct iframe HTML', () => { + const id = '1234567890'; + const size = {width: 500, height: 300}; + + const result = embedder.processEmbed(id, size); + + expect(result).to.equal( + '<div class="twitterWrapper"><iframe width="500" height="300" src="https://platform.twitter.com/embed/Tweet.html?id=1234567890" frameborder="0" scrolling="no" allowtransparency="true" allowfullscreen="true"></iframe></div>' + ); + }); + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/embedders/TwitterEmbedder.ts b/packages/renderer/src/renderers/default/embedder/embedders/TwitterEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..5aa55d521a218cb81f10bcb0c3e71e8db8da0643 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/TwitterEmbedder.ts @@ -0,0 +1,54 @@ +import {Log} from '../../../../Log'; +import {StaticConfig} from '../../StaticConfig'; +import {AbstractEmbedder, EmbedMetadata} from './AbstractEmbedder'; + +export class TwitterEmbedder extends AbstractEmbedder { + public type = 'twitter'; + + private static readonly linkRegex = StaticConfig.sanitization.iframeWhitelist.find((item) => item.re.toString().includes('twitter'))?.re as RegExp; + + public getEmbedMetadata(input: string | HTMLObjectElement): EmbedMetadata | undefined { + const url = typeof input === 'string' ? input : input.data; + try { + const metadata = TwitterEmbedder.getTwitterMetadataFromLink(url); + if (!metadata) { + return undefined; + } + return { + id: metadata.id, + url: metadata.url + }; + } catch (error) { + Log.log().error(error); + } + return undefined; + } + + public processEmbed(id: string, size: {width: number; height: number}): string { + const twitterConfig = StaticConfig.sanitization.iframeWhitelist.find((item) => item.re.toString().includes('twitter')); + const twitterUrl = twitterConfig?.fn(`https://twitter.com/status/${id}`); + if (!twitterUrl) { + return ''; + } + return `<div class="twitterWrapper"><iframe width="${size.width}" height="${size.height}" src="${twitterUrl}" frameborder="0" scrolling="no" allowtransparency="true" allowfullscreen="true"></iframe></div>`; + } + + private static getTwitterMetadataFromLink(data: string): {id: string; url: string} | undefined { + if (!data) { + return undefined; + } + + // Remove any leading '@' or 'https://' from the data + const cleanData = data.replace(/^(@|https:\/\/)/, ''); + + const match = cleanData.match(TwitterEmbedder.linkRegex); + if (!match) { + return undefined; + } + + const id = match[2]; // The ID is in the 2nd capture group + const url = `https://${cleanData}`; // Ensure the URL always starts with https:// + + return {id, url}; + } +} diff --git a/packages/renderer/src/renderers/default/embedder/embedders/VimeoEmbedder.test.ts b/packages/renderer/src/renderers/default/embedder/embedders/VimeoEmbedder.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..08c599f95e52e8ddb5bb6dcb06cbd6e63e9ab97b --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/VimeoEmbedder.test.ts @@ -0,0 +1,58 @@ +import {expect} from 'chai'; +import {VimeoEmbedder} from './VimeoEmbedder'; + +describe('VimeoEmbedder', () => { + [ + // vimeo links + 'https://player.vimeo.com/video/179213493', + 'https://player.vimeo.com/video/179213493?h=11571f92bf', + 'https://player.vimeo.com/video/179213493?byline=0' + ].forEach((input) => { + it('should properly return metadata for vimeo video link with player', () => { + const embedder = new VimeoEmbedder(); + const expected = { + id: '179213493', + url: 'https://player.vimeo.com/video/179213493' + }; + const result = embedder.getEmbedMetadata({data: input} as HTMLObjectElement); + expect(result).to.be.deep.equal(expected); + }); + }); + + [ + // vimeo links without player + 'https://vimeo.com/179213493', + 'https://vimeo.com/179213493?byline=0' + ].forEach((input) => { + it('should properly return metadata for vimeo video', () => { + const embedder = new VimeoEmbedder(); + const expected = { + id: '179213493', + url: 'https://vimeo.com/179213493' + }; + const result = embedder.getEmbedMetadata({data: input} as HTMLObjectElement); + expect(result).to.be.deep.equal(expected); + }); + }); + + it('should return undefined for invalid input', () => { + const embedder = new VimeoEmbedder(); + const node = {data: 'https://vimeo.com/invalid/179213493'} as HTMLObjectElement; + const result = embedder.getEmbedMetadata(node); + expect(result).to.be.undefined; + }); + + it('should return undefined for empty input', () => { + const embedder = new VimeoEmbedder(); + const node = {data: ''} as HTMLObjectElement; + const result = embedder.getEmbedMetadata(node); + expect(result).to.be.undefined; + }); + + it('should return undefined for undefined input', () => { + const embedder = new VimeoEmbedder(); + const node = {data: undefined} as any as HTMLObjectElement; + const result = embedder.getEmbedMetadata(node); + expect(result).to.be.undefined; + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/embedders/VimeoEmbedder.ts b/packages/renderer/src/renderers/default/embedder/embedders/VimeoEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..57b8788d85a0a9b7887ae89968b30b5e19e8d8be --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/VimeoEmbedder.ts @@ -0,0 +1,49 @@ +import {Log} from '../../../../Log'; +import {AbstractEmbedder, EmbedMetadata} from './AbstractEmbedder'; + +export class VimeoEmbedder extends AbstractEmbedder { + public type = 'vimeo'; + + private static readonly regex = /https?:\/\/(?:vimeo.com\/|player.vimeo.com\/video\/)([0-9]+)\/*/; + + public getEmbedMetadata(child: HTMLObjectElement): EmbedMetadata | undefined { + try { + const data = child.data; + const metadata = this.extractMetadata(data); + if (!metadata) { + return undefined; + } + return { + id: metadata.id, + url: metadata.url + }; + } catch (error) { + Log.log().error(error); + } + return undefined; + } + + public processEmbed(id: string, size: {width: number; height: number}): string { + return `<div class="videoWrapper"><iframe src=${this.generateCanonicalUrl(id)} width=${size.width} height=${size.height} frameBorder="0" webkitallowfullscreen mozallowfullscreen allowFullScreen></iframe></div>`; + } + + private generateCanonicalUrl(id: string) { + return `https://player.vimeo.com/video/${id}`; + } + + private extractMetadata(data: string) { + if (!data) { + return null; + } + const m = data.match(VimeoEmbedder.regex); + if (!m || m.length < 2) { + return null; + } + + return { + id: m[1], + url: m[0], + canonical: this.generateCanonicalUrl(m[1]) + }; + } +} diff --git a/packages/renderer/src/renderers/default/embedder/embedders/YoutubeEmbedder.test.ts b/packages/renderer/src/renderers/default/embedder/embedders/YoutubeEmbedder.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ce067aec71673bfc8be36c03e6bdf9f2871f751 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/YoutubeEmbedder.test.ts @@ -0,0 +1,90 @@ +import {expect} from 'chai'; +import {JSDOM} from 'jsdom'; +import {YoutubeEmbedder} from './YoutubeEmbedder'; + +describe('YoutubeEmbedder', () => { + [ + // different formats of the same youtube video link + 'https://www.youtube.com/watch?v=umvcUpmIie8', + 'https://youtube.com/watch?v=umvcUpmIie8', + 'https://youtu.be/umvcUpmIie8', + 'https://youtu.be/watch?v=umvcUpmIie8', + 'https://www.youtube.com/embed/umvcUpmIie8', + 'https://youtube.com/embed/umvcUpmIie8', + // additional query parameters + 'https://www.youtube.com/watch?v=umvcUpmIie8&feature=youtu.be&t=14s', + 'https://www.youtube.com/watch?v=umvcUpmIie8&t=14s', + 'https://youtu.be/umvcUpmIie8?t=7s' + ].forEach((input) => { + it('should properly return metadata for youtube video link', () => { + const expected = { + id: 'umvcUpmIie8', + url: input, + image: 'https://img.youtube.com/vi/umvcUpmIie8/0.jpg' + }; + const embedder = new YoutubeEmbedder(); + const node = {data: input} as HTMLObjectElement; + const metadata = embedder.getEmbedMetadata(node); + expect(metadata).to.be.deep.equal(expected); + }); + }); + + [ + // youtube shorts + 'https://www.youtube.com/shorts/_R4ScrD0O8c', + 'https://youtube.com/shorts/_R4ScrD0O8c' + ].forEach((input) => { + it('should properly return metadata for youtube shorts link', () => { + const expected = { + id: '_R4ScrD0O8c', + url: input, + image: 'https://img.youtube.com/vi/_R4ScrD0O8c/0.jpg' + }; + const embedder = new YoutubeEmbedder(); + const node = {data: input} as HTMLObjectElement; + const metadata = embedder.getEmbedMetadata(node); + expect(metadata).to.be.deep.equal(expected); + }); + }); + + [ + // invalid inputs + 'https://www.youtube.com/watch?v=', + 'https://youtube.com/watch?v=', + 'https://youtu.be/', + 'https://youtu.be/watch?v=', + 'https://www.youtube.com/embed/', + 'https://youtube.com/embed/', + 'https://oauth.com/login/redirect?=youtube.com', + 'https://oauth.com/login/redirect?=www.youtube.com' + ].forEach((input) => { + it('should return undefined for invalid input', () => { + const embedder = new YoutubeEmbedder(); + const node = {data: input} as HTMLObjectElement; + const metadata = embedder.getEmbedMetadata(node); + expect(metadata).to.be.undefined; + }); + }); + + it('should return undefined for empty input', () => { + const embedder = new YoutubeEmbedder(); + const node = {data: ''} as HTMLObjectElement; + const metadata = embedder.getEmbedMetadata(node); + expect(metadata).to.be.undefined; + }); + + it('should log error and return undefined for invalid input', () => { + // mock SpotifyEmbedder.extractMetadata to throw an exception + const extractMetadata = YoutubeEmbedder['getYoutubeMetadataFromLink']; + YoutubeEmbedder['getYoutubeMetadataFromLink'] = () => { + throw new Error('mock error'); + }; + const embedder = new YoutubeEmbedder(); + const node = new JSDOM().window.document.createElement('object'); + node.data = 'https://open.spotify.com/playlist/1zLvUhumbFIEdfxYQcgUxk'; + const result = embedder.getEmbedMetadata(node); + + expect(result).to.be.undefined; + YoutubeEmbedder['getYoutubeMetadataFromLink'] = extractMetadata; + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/embedders/YoutubeEmbedder.ts b/packages/renderer/src/renderers/default/embedder/embedders/YoutubeEmbedder.ts new file mode 100644 index 0000000000000000000000000000000000000000..1554bcf375df91fe7c9fb5d080d61b50206a785c --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/embedders/YoutubeEmbedder.ts @@ -0,0 +1,56 @@ +import {Log} from '../../../../Log'; +import {AbstractEmbedder, EmbedMetadata} from './AbstractEmbedder'; + +export class YoutubeEmbedder extends AbstractEmbedder { + public type = 'youtube'; + + private static readonly linkRegex = + /https?:\/\/(?:www\.)?(?:youtube\.com\/watch\?v=|youtu\.be\/watch\?v=|youtu.be\/[^watch]|youtube\.com\/(embed|shorts)\/)([A-Za-z0-9_-]+)[^ ]*/i; + private static readonly idRegex = /(?:youtube\.com\/watch\?v=|youtu\.be\/watch\?v=|youtu.be\/|youtube\.com\/(embed|shorts)\/)([A-Za-z0-9_-]+)/i; + + public static getYoutubeMetadataFromLink(data: string): {id: string; url: string; thumbnail: string} | undefined { + if (!data) { + return undefined; + } + + const m1 = data.match(YoutubeEmbedder.linkRegex); + const url = m1 ? m1[0] : undefined; + if (!url) { + return undefined; + } + + const m2 = url.match(YoutubeEmbedder.idRegex); + const id = m2 && m2.length >= 2 ? m2[2] : undefined; + if (!id) { + return undefined; + } + + return { + id, + url, + thumbnail: 'https://img.youtube.com/vi/' + id + '/0.jpg' + }; + } + + public getEmbedMetadata(child: HTMLObjectElement): EmbedMetadata | undefined { + try { + const metadata = YoutubeEmbedder.getYoutubeMetadataFromLink(child.data); + if (!metadata) { + return undefined; + } + return { + id: metadata.id, + url: metadata.url, + image: metadata.thumbnail + }; + } catch (error) { + Log.log().error(error); + } + return undefined; + } + + public processEmbed(id: string, size: {width: number; height: number}): string { + const ytUrl = `https://www.youtube.com/embed/${id}`; + return `<div class="videoWrapper"><iframe width="${size.width}" height="${size.height}" src="${ytUrl}" allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" frameborder="0"></iframe></div>`; + } +} diff --git a/packages/renderer/src/renderers/default/embedder/utils/AccountNameValidator.test.ts b/packages/renderer/src/renderers/default/embedder/utils/AccountNameValidator.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..b9bc03e9d0f0cf47e87674f087d556204f19c7d8 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/utils/AccountNameValidator.test.ts @@ -0,0 +1,33 @@ +import {expect} from 'chai'; +import {Localization} from '../../Localization'; +import {AccountNameValidator} from './AccountNameValidator'; + +describe('AccountNameValidator', () => { + ['', 'a', 'aa', 'nametoolongtohandle'].forEach((input) => { + it(`should return accountNameWrongLength for invalid account name (${input})`, () => { + const actual = AccountNameValidator.validateAccountName(input, Localization.DEFAULT); + expect(actual).to.be.equal(Localization.DEFAULT.accountNameWrongLength); + }); + }); + + it('should return accountNameBadActor for bad actor account name', () => { + const actual = AccountNameValidator.validateAccountName('aalpha', Localization.DEFAULT); + expect(actual).to.be.equal(Localization.DEFAULT.accountNameBadActor); + }); + + ['something.', '.something', 'a..a', 'something.a', 'a.something', 'a.a.a', 'something.ab', '123', '3speak', 'something.123', '-something', 'something-'].forEach( + (input) => { + it(`should return accountNameWrongSegment for invalid account name (${input})`, () => { + const actual = AccountNameValidator.validateAccountName(input, Localization.DEFAULT); + expect(actual).to.be.equal(Localization.DEFAULT.accountNameWrongSegment); + }); + } + ); + + ['engrave', 'hive--blocks', 'something.abc'].forEach((input) => { + it(`should return null for valid account name (${input})`, () => { + const actual = AccountNameValidator.validateAccountName(input, Localization.DEFAULT); + expect(actual).to.be.equal(null); + }); + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/utils/AccountNameValidator.ts b/packages/renderer/src/renderers/default/embedder/utils/AccountNameValidator.ts new file mode 100644 index 0000000000000000000000000000000000000000..b68b3dec0c189224af2c96a53c5e55da73978c78 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/utils/AccountNameValidator.ts @@ -0,0 +1,48 @@ +/** + * Based on: https://raw.githubusercontent.com/openhive-network/condenser/master/src/app/utils/ChainValidation.js + */ +import {LocalizationOptions} from '../../Localization'; +import BadActorList from './BadActorList'; + +export class AccountNameValidator { + public static validateAccountName(value: string, localization: LocalizationOptions) { + let i; + let label; + let len; + + if (!value) { + return localization.accountNameWrongLength; + } + const length = value.length; + if (length < 3) { + return localization.accountNameWrongLength; + } + if (length > 16) { + return localization.accountNameWrongLength; + } + if (BadActorList.includes(value)) { + return localization.accountNameBadActor; + } + const ref = value.split('.'); + for (i = 0, len = ref.length; i < len; i++) { + label = ref[i]; + if (!/^[a-z]/.test(label)) { + return localization.accountNameWrongSegment; + // each_account_segment_should_start_with_a_letter + } + if (!/^[a-z0-9-]*$/.test(label)) { + return localization.accountNameWrongSegment; + // each_account_segment_should_have_only_letters_digits_or_dashes + } + if (!/[a-z0-9]$/.test(label)) { + return localization.accountNameWrongSegment; + // each_account_segment_should_end_with_a_letter_or_digit + } + if (!(label.length >= 3)) { + return localization.accountNameWrongSegment; + // each_account_segment_should_be_longer + } + } + return null; + } +} diff --git a/packages/renderer/src/renderers/default/embedder/utils/BadActorList.ts b/packages/renderer/src/renderers/default/embedder/utils/BadActorList.ts new file mode 100644 index 0000000000000000000000000000000000000000..e7cb9869888cf5e30baa2c33c3a63f575b818bf0 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/utils/BadActorList.ts @@ -0,0 +1,918 @@ +/** + * Based on: https://raw.githubusercontent.com/openhive-network/condenser/master/src/app/utils/BadActorList.js + */ + +const list = ` +aalpha +aappreciator +abits +acx +aex.com +alha +alhpa +allcoin.com +alpah +alph +alphha +alppha +alueup +apha +aplha +apppreciator +apprceiator +apprciator +apprecaitor +apprecator +apprecciator +appreciaator +appreciaor +appreciaotr +appreciater +appreciatoor +appreciatorr +appreciatr +appreciatro +appreciattor +appreciiator +apprecitaor +apprecitor +appreeciator +appreiator +appreicator +apprreciator +apreciator +aprpeciator +ausbitban +ausbltbank +avlueup +battrex +bbithumb.hot +bbittrex +bblocktrades +bboomerang +bbooster +bbuildawhale +bcex +bellyrub +berniesandlers +bernieslanders +berniestandards +bernlesanders +bettrex +bihtrex +bihtumb.hot +bihumb.hot +biithumb.hot +biitrex +biittrex +bildawhale +binan +binanc +binance +binance.com +binanced +binancee +binances +binanse +binnance +bit-z +bitex +bitfinex +bitfinex.com +bitfinix +bitflip +bithhumb.hot +bithmb.hot +bithmub.hot +bithub.hot +bithubm.hot +bithum.bhot +bithumb +bithumb-deposit +bithumb-exchange +bithumb-pro +bithumb.com +bithumb.hoot +bithumb.hott +bithumb.hto +bithumb.oht +bithumbb.hot +bithummb.hot +bithuumb.hot +bitifinex +bitkrx +bitnaru +bitre +bitreex +bitrex +bitrexx +bitrix +bitrrex +bitrtex +bitrx +bitsane +bitsane.com +bitstamp +bitstamp.net +bitt +bitteex +bitter +bitterex +bitterx +bittex +bitthai +bittr +bittrax +bittre +bittrec +bittrecs +bittrecx +bittred +bittreex +bittrek +bittres +bittresx +bittret +bittrev +bittrex-deposit +bittrex-pro +bittrex.com +bittrexc +bittrexchange +bittrexe +bittrexs +bittrext +bittrexx +bittrexxx +bittrez +bittriex +bittrix +bittrrex +bittrrx +bittrx +bittrxe +bitttec +bitttex +bitttrex +bittylicious +bittylicious.com +bituhmb.hot +biuldawhale +blcktrades +blcoktrades +bleutrade +bleutrade.com +bllocktrades +bloccktrades +block-trades +block-trades-com +blockktrades +blockrade +blockrades +blockrtades +blocktades +blocktardes +blocktraades +blocktrad +blocktraddes +blocktrade +blocktraded +blocktradee +blocktradees +blocktrader +blocktraders +blocktrades-com +blocktrades-info +blocktrades-us +blocktrades.com +blocktrades.info +blocktrades.us +blocktradess +blocktradesss +blocktradez +blocktrading +blocktrads +blocktradse +blocktraeds +blocktraes +blocktrdaes +blocktrdes +blocktredes +blocktrrades +blockttrades +bloctkrades +bloctrades +blokctrades +bloktrades +bloocktrades +bocktrades +bolcktrades +bomerang +bomoerang +booemrang +booerang +boomeang +boomearng +boomeerang +boomeraang +boomerag +boomeragn +boomerangg +boomeranng +boomernag +boomerrang +boommerang +boomreang +booomerang +boooster +booser +boosetr +boostar +booste +boosterr +boostr +boostre +boostter +bootser +bosoter +boster +btc-alpha +btc-alpha.com +btc38 +btcalpha +btcmarkets +btcmarkets.net +bthumb.hot +btihumb.hot +btitrex +btrex +bttrex +bttrx +buidawhale +buidlawhale +buiildawhale +builadwhale +buildaawhale +buildahale +buildahwale +buildawahle +buildawale +buildawhaale +buildawhael +buildawhalee +buildawhalle +buildawhhale +buildawhile +buildawhlae +buildawwhale +builddawhale +buildwahale +buildwhale +builldawhale +buldawhale +bulidawhale +buobi-pro +buuildawhale +c-cex +c-cex.com +canadiancoconut +ccex +cexio +changellly +changelly.com +changely +cinpayments.net +cionpayments.net +coin-room +coinapyments.net +coinayments.net +coinbas +coinbase +coinbase.com +coinbased +coinegg +coinegg.com +coinpaments.net +coinpamyents.net +coinpayemnts.net +coinpayents.net +coinpaymens.net +coinpaymenst.net +coinpayment +coinpayment.snet +coinpayments +coinpayments.ent +coinpayments.nte +coinpaymetns.net +coinpaymnets.net +coinpaymnts.net +coinpia +coinpyaments.net +coinroom.com +coinsmarkets +coinsmarkets.com +coinspot +coinzest +coipayments.net +coipnayments.net +community-coin +conipayments.net +conpayments.net +coolcoin.com +curi +curied +curies +curing +d-tube +dcrypto8 +ddeepcrypto8 +decrypto8 +deep8 +deepccrypto8 +deepcripto8 +deepcrpto8 +deepcrrypto8 +deepcrypo8 +deepcryppto8 +deepcrypt08 +deepcrypt8 +deepcrypto-8 +deepcrypto0 +deepcrypto7 +deepcrypto88 +deepcrypto9 +deepcryptoo8 +deepcryptos +deepcryptos8 +deepcryptto8 +deepcryto8 +deepcrytpo8 +deepcryypto8 +deepcypto8 +deeppcrypto8 +deeprypto8 +depcrypto8 +donkeypon +edepcrypto8 +eepcrypto8 +etherdelta +etherdelta.com +exrates +exx.com +feepcrypto8 +freeewallet +freewalet.org +freewaller +frewallet +fyrstiken +gatecoin.com +gatehub +gatehub.net +gdax.com +gemini.com +ggopax-deposit +goapx-deposit +goax-deposit +good-kama +goopax-deposit +gopa-deposit +gopa-xdeposit +gopaax-deposit +gopax-ddeposit +gopax-deopsit +gopax-deosit +gopax-depoist +gopax-depoit +gopax-depoosit +gopax-deposiit +gopax-depositt +gopax-depossit +gopax-depost +gopax-deposti +gopax-depposit +gopax-depsit +gopax-depsoit +gopax-dpeosit +gopax-dposit +gopax-edposit +gopax-eposit +gopax-hot +gopaxd-eposit +gopaxx-deposit +goppax-deposit +gopx-deposit +gopxa-deposit +gpax-deposit +gpoax-deposit +gtg.witnesses +herising +hhuobi-pro +hitbtc-deposit +hitbtc-pro +hitbtc.com +hitbtcexchange +hterising +huobbi-pro +huobi-ppro +huobi-pr0 +huobi-proo +huobi-prro +huobi.pro +huobii-pro +huobl-pro +huoobi-pro +huuobi-pro +ibthumb.hot +ibttrex +idex.market +imnnowbooster +inance +innowbooster +ithumb.hot +ittrex +ittrexx +kcx +kevinwon +kocostock +koinex +kraken +kraken.com +kucoi +kucoin +kucoinn +kucoins +lapha +lbocktrades +linkcoin +litebit +little-pepper +livecoin.com +livecoinnet +livingroomofsato +localtrade +localtrade.pro +locktrades +lpha +martsteem +mercatox.com +miinnowbooster +minnnowbooster +minnobooster +minnobwooster +minnooboster +minnoowbooster +minnowboooster +minnowbooser +minnowboosetr +minnowboosster +minnowboost +minnowbooste +minnowboosted +minnowboosteer +minnowboosterr +minnowboosters +minnowboostr +minnowboostre +minnowboostter +minnowbootser +minnowbosoter +minnowboster +minnowbuster +minnowhelp +minnowoboster +minnowooster +minnowpooster +minnows +minnowsuport +minnowsupports +minnowwbooster +minnwbooster +minnwobooster +minobooster +minonwbooster +minowbooster +minowboster +minowhelper +minowsupport +mminnowbooster +mmyupbit +mninowbooster +msartsteem +my-upbit +myupbbit +myupbiit +myupbitt +myupblt +myuppbit +myuupbit +myyupbit +neraex +neraex.com +nextgencrypted +nextgencryptos +obomerang +oboster +ocky1 +oenledger-dex +oepnledger-dex +ogpax-deposit +oinpayments.net +okex.com +olonie +oloniex +oomerang +oopenledger-dex +ooster +opeenledger-dex +opeledger-dex +opelnedger-dex +openedger-dex +openeldger-dex +openldeger-dex +openldger-dex +openleddger-dex +openledegr-dex +openleder-dex +openledge-dex +openledge-rdex +openledgeer-dex +openledger-ddex +openledger-de +openledger-deex +openledger-dx +openledger-dxe +openledger-edx +openledger-ex +openledger-pro +openledgerd-ex +openledgerdex +openledgerr-dex +openledgr-dex +openledgre-dex +openleedger-dex +openlegder-dex +openleger-dex +openlledger-dex +opennledger-dex +opnledger-dex +oppenledger-dex +opstpromoter +orcky1 +ostpromoter +p-funk +paloniex +papreciator +paypals +penledger-dex +pextokens +pfuck +piloniex +plolniex +ploniex +plooniex +poenledger-dex +pokoniex +polaniex +poleniex +poliniex +polionex +pollniex +polloniex +polloniexx +pollonix +polniex +polnoiex +polobiex +poloex +poloiex +poloinex +pololniex +polomiex +polon +poloneex +poloneiex +poloneix +polonex +poloni +poloniax +polonie +poloniec +poloniecs +polonied +poloniee +polonieex +poloniek +polonieks +polonies +poloniet +poloniets +poloniew +poloniex.com +poloniexcold +poloniexcom +poloniexe +poloniexs +poloniext +poloniexwalle +poloniexwallet +poloniexx +poloniexxx +poloniey +poloniez +poloniiex +poloniix +poloniks +poloniox +polonium +polonix +polonixe +polonixx +polonniex +polonoiex +polonox +polonx +polonyex +polooniex +poluniex +pomobot +pononiex +poolniex +pooloniex +pooniex +poooniex +poostpromoter +poponiex +pormobot +posptromoter +posstpromoter +postpormoter +postppromoter +postprmooter +postprmoter +postprommoter +postpromoer +postpromooter +postpromote +postpromoteer +postpromoterr +postpromotor +postpromotre +postpromotter +postpromter +postpromtoer +postproomoter +postproomter +postprooter +postprromoter +postromoter +posttpromoter +potpromoter +potspromoter +ppostpromoter +ppreciator +ppromobot +prmobot +prmoobot +promboot +prombot +prommobot +promobbot +promobo +promoboot +promobott +promobt +promobto +promoobot +promoobt +promoot +proobot +proombot +proomobot +prromobot +pse +psotpromoter +pstpromoter +ptakundamianshow +ptunk +puloniex +qryptos +qryptos.com +randomwhale +randowale +randowhal +randwhale +rcky1 +rcoky1 +rdex +rduex +rendowhale +roccky1 +rock1y +rockky1 +rockyy1 +rocy1 +rocyk1 +rokcy1 +romobot +roocky1 +rpomobot +rrocky1 +rrudex +ruddex +rudeex +rudexx +rudx +rudxe +ruedx +ruudex +samrtsteem +sartsteem +scoin +seem +seemit +seemit2 +seepcrypto8 +setem +setemit +setemit2 +shapeshif +shapeshift +smaartsteem +smarrtsteem +smarstteem +smartseem +smartsetem +smartstee +smartsteeem +smartsteemm +smartsteme +smartstteem +smartteem +smatrsteem +smmartsteem +smratsteem +smrtsteem +ssmartsteem +ssteemit2 +steampunks +steeemit2 +steeimt +steeimt2 +steeit +steeit2 +steemi2 +steemi2t +steemitpay +steemitt2 +steemmit2 +steempay +steempays +steemt2 +steemti2 +steemupbit +stemeit +stemeit2 +stemit1 +stemit2 +stemit3 +stemit4 +stteem +stteemit2 +sweetsj +sweetssj +sweetsss +sweetsssjs +sweetssssj +swetsssj +tdax +tdax.com +teamsteam +techno-comanche +technocommander +teemit2 +tehrising +terising +thealien +thebiton +theerising +theirsing +theising +theriing +theriising +theriisng +therisig +therisign +therisiing +therisingg +therisinng +therisng +therisnig +therissing +therocktrading +therrising +thersiing +thersing +thherising +threising +thrising +tidex.com +topbtc +tseem +tseemit +tseemit2 +ttherising +ttrex +ubildawhale +udex +uhobi-pro +uildawhale +umewhale +umpewhale +underug +uobi-pro +upbbit +upbi +upbit +upbit.com +upbits +upbitt +upblt +upemwhale +upewhale +upm +upmee +upmeewhale +upmehale +upmehwale +upmewahle +upmewhaale +upmewhae +upmewhael +upmewhalee +upmewhalle +upmewhhale +upmewhlae +upmewhle +upmewwhale +upmme +upmmewhale +upmwehale +upmwhale +uppme +uppmee +uppmewhale +uupmewhale +vaalueup +valeup +valeuup +vallueup +valueeup +valuep +valuepu +valueu +valueupp +valuuep +valuueup +valuup +vaueup +vauleup +viabtc +vittrex +vlaueup +vlueup +vvalueup +wallet.bitshares +whaleshare +www.aex.com +www.binance.com +www.bit-z.com +www.bitfinex.com +www.bithumb.com +www.bitstamp.net +www.bittrex.com +www.coinbase.com +www.coinegg.com +www.coolcoin.com +www.exx.com +www.gatecoin.com +www.gatehub.net +www.gdax.com +www.huobi.pro +www.kraken.com +www.livecoin.net +www.okex.com +www.poloniex.com +www.qryptos.com +www.xbtce.com +xbtce.com +ymupbit +yobit +yobit.net +youbit +yunbi +zenieix +` + .trim() + .split('\n'); + +export default list; diff --git a/packages/renderer/src/renderers/default/embedder/utils/Links.test.ts b/packages/renderer/src/renderers/default/embedder/utils/Links.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0fc2f1e902b0b7c6d6d5b531db0459a6c8833b3 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/utils/Links.test.ts @@ -0,0 +1,35 @@ +import {expect} from 'chai'; +import links from './Links'; + +describe('Links regexp', () => { + describe('ipfs', () => { + it('should match legacy ipfs notation', () => { + expect(links.ipfsProtocol.test('/ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE')).to.be.true; + expect(links.ipfsProtocol.test('/ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE/')).to.be.true; + expect(links.ipfsProtocol.test('//ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE')).to.be.true; + expect(links.ipfsProtocol.test('//ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE/')).to.be.true; + expect(links.ipfsProtocol.test('//ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE/?params=test')).to.be.true; + expect(links.ipfsProtocol.test('//ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE/directory/path')).to.be.true; + }); + + it('should match ipfs:// protocol url', () => { + expect(links.ipfsProtocol.test('ipfs://QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE')).to.be.true; + expect(links.ipfsProtocol.test('ipfs://QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE/')).to.be.true; + expect(links.ipfsProtocol.test('ipfs://QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE/directory/path')).to.be.true; + }); + + it('should not match pseudo ipfs url', () => { + expect(links.ipfsProtocol.test('https://ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE')).to.be.false; + expect(links.ipfsProtocol.test('ipfs/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE')).to.be.false; + expect(links.ipfsProtocol.test('ipfs:/QmQqzMTavQgT4f4T5v6PWBp7XNKtoPmC9jvn12WPT3gkSE')).to.be.false; + }); + + it('should not match non-ipfs url', () => { + expect(links.ipfsProtocol.test('https://www.engrave.dev')).to.be.false; + expect(links.ipfsProtocol.test('http://www.engrave.dev')).to.be.false; + expect(links.ipfsProtocol.test('www.engrave.dev')).to.be.false; + expect(links.ipfsProtocol.test('engrave.dev')).to.be.false; + expect(links.ipfsProtocol.test('engrave')).to.be.false; + }); + }); +}); diff --git a/packages/renderer/src/renderers/default/embedder/utils/Links.ts b/packages/renderer/src/renderers/default/embedder/utils/Links.ts new file mode 100644 index 0000000000000000000000000000000000000000..15a7b923a05f6e4f20ae9462c11fa6495bf2f615 --- /dev/null +++ b/packages/renderer/src/renderers/default/embedder/utils/Links.ts @@ -0,0 +1,39 @@ +/* eslint-disable security/detect-non-literal-regexp */ +/** + * Based on: https://raw.githubusercontent.com/openhive-network/condenser/master/src/app/utils/Links.js + */ +const urlChar = '[^\\s"<>\\]\\[\\(\\)]'; +const urlCharEnd = urlChar.replace(/\]$/, ".,']"); // insert bad chars to end on +const imagePath = '(?:(?:\\.(?:tiff?|jpe?g|gif|png|svg|ico)|ipfs/[a-z\\d]{40,}))'; +const domainPath = '(?:[-a-zA-Z0-9\\._]*[-a-zA-Z0-9])'; +const urlChars = '(?:' + urlChar + '*' + urlCharEnd + ')?'; + +const urlSet = ({domain = domainPath, path = ''} = {}) => { + // urlChars is everything but html or markdown stop chars + return `https?://${domain}(?::\\d{2,5})?(?:[/\\?#]${urlChars}${path ? path : ''})${path ? '' : '?'}`; +}; + +/** + * Unless your using a 'g' (glob) flag you can store and re-use your regular expression. Use the cache below. + * If your using a glob (for example: replace all), the regex object becomes stateful and continues where it + * left off when called with the + * same string so naturally the regex object can't be cached for long. + */ +export const any = (flags = 'i') => new RegExp(urlSet(), flags); +// TODO verify if we should pass baseUrl here +export const local = (flags = 'i') => new RegExp(urlSet({domain: '(?:localhost|(?:.*\\.)?hive.blog)'}), flags); +export const remote = (flags = 'i') => new RegExp(urlSet({domain: `(?!localhost|(?:.*\\.)?hive.blog)${domainPath}`}), flags); +export const image = (flags = 'i') => new RegExp(urlSet({path: imagePath}), flags); +export const imageFile = (flags = 'i') => new RegExp(imagePath, flags); + +export default { + any: any(), + local: local(), + remote: remote(), + image: image(), + imageFile: imageFile(), + vimeo: /https?:\/\/(?:vimeo.com\/|player.vimeo.com\/video\/)([0-9]+)\/*/, + vimeoId: /(?:vimeo.com\/|player.vimeo.com\/video\/)([0-9]+)/, + twitch: /https?:\/\/(?:www.)?twitch.tv\/(?:(videos)\/)?([a-zA-Z0-9][\w]{3,24})/i, + ipfsProtocol: /^((\/\/?ipfs\/)|(ipfs:\/\/))/ +}; diff --git a/packages/renderer/src/renderers/default/plugins/RendererPlugin.ts b/packages/renderer/src/renderers/default/plugins/RendererPlugin.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b45de3378ee41d5669aa3fb077a22d7b9322cd9 --- /dev/null +++ b/packages/renderer/src/renderers/default/plugins/RendererPlugin.ts @@ -0,0 +1,9 @@ +export interface RendererPlugin { + name: string; + preProcess?: (text: string) => string; + postProcess?: (text: string) => string; +} + +export interface PluginOptions { + plugins?: RendererPlugin[]; +} diff --git a/packages/renderer/src/renderers/default/plugins/SpoilerPlugin.ts b/packages/renderer/src/renderers/default/plugins/SpoilerPlugin.ts new file mode 100644 index 0000000000000000000000000000000000000000..52ed65904026e45a73fadabb9d221029527d3773 --- /dev/null +++ b/packages/renderer/src/renderers/default/plugins/SpoilerPlugin.ts @@ -0,0 +1,26 @@ +import {RendererPlugin} from './RendererPlugin'; + +export class SpoilerPlugin implements RendererPlugin { + name = 'spoiler'; + + preProcess(text: string): string { + return text.replace(/^>! *\[(.*?)\] *(.*?)(?:\n|$)([\s\S]*?)(?=^>! *\[|$)/gm, (_, title, firstLine, rest) => { + // Get the first line content (after the title) + const content = firstLine.trim(); + + // Get the rest of the content (lines starting with >) + const restContent = rest + .split('\n') + .map((line: string) => line.trim()) + .filter((line: string) => line.startsWith('>')) + .map((line: string) => line.replace(/^> ?/, '')) + .join(' ') + .trim(); + + // Combine all content + const fullContent = [content, restContent].filter(Boolean).join(' '); + + return `<details class="spoiler"><summary>${title || 'Reveal spoiler'}</summary><p>${fullContent}</p></details>`; + }); + } +} diff --git a/packages/renderer/src/renderers/default/sanitization/PreliminarySanitizer.test.ts b/packages/renderer/src/renderers/default/sanitization/PreliminarySanitizer.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..1e579ee03d8d58b5b1b3f0f9be5be7bffb007094 --- /dev/null +++ b/packages/renderer/src/renderers/default/sanitization/PreliminarySanitizer.test.ts @@ -0,0 +1,11 @@ +import {expect} from 'chai'; +import {PreliminarySanitizer} from './PreliminarySanitizer'; + +describe('PreliminarySanitizer', () => { + it('should remove html comments', () => { + const input = 'Hello <!-- this is a comment --> World'; + const expected = 'Hello (html comment removed: this is a comment ) World'; + const actual = PreliminarySanitizer.preliminarySanitize(input); + expect(actual).to.be.equal(expected); + }); +}); diff --git a/packages/renderer/src/renderers/default/sanitization/PreliminarySanitizer.ts b/packages/renderer/src/renderers/default/sanitization/PreliminarySanitizer.ts new file mode 100644 index 0000000000000000000000000000000000000000..a86fc240b20db2ded71d02bf7e4434ef11d9eac4 --- /dev/null +++ b/packages/renderer/src/renderers/default/sanitization/PreliminarySanitizer.ts @@ -0,0 +1,9 @@ +export class PreliminarySanitizer { + public static preliminarySanitize(text: string): string { + return PreliminarySanitizer.stripHtmlComments(text); + } + + private static stripHtmlComments(text: string) { + return text.replace(/<!--([\s\S]+?)(-->|$)/g, '(html comment removed: $1)'); + } +} diff --git a/packages/renderer/src/renderers/default/sanitization/TagTransformingSanitizer.test.ts b/packages/renderer/src/renderers/default/sanitization/TagTransformingSanitizer.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..f8bbe366e214e4dec07efa0e67f9852e46403a20 --- /dev/null +++ b/packages/renderer/src/renderers/default/sanitization/TagTransformingSanitizer.test.ts @@ -0,0 +1,64 @@ +import {expect} from 'chai'; +import {Localization} from '../Localization'; +import {TagTransformingSanitizer} from './TagTransformingSanitizer'; + +const options = { + iframeWidth: 100, + iframeHeight: 100, + addNofollowToLinks: false, + addTargetBlankToLinks: false, + cssClassForInternalLinks: 'internal', + cssClassForExternalLinks: 'external', + noImage: false, + isLinkSafeFn: (url: string) => url != 'https://unsafe.com', + addExternalCssClassToMatchingLinksFn: (url: string) => url != 'https://engrave.dev' +}; + +describe('TagTransformingSanitizer', () => { + describe('a', () => { + [ + { + description: 'should add internal class to internal links', + input: '<a href="https://engrave.dev">Example</a>', + expected: '<a href="https://engrave.dev" class="internal">Example</a>' + }, + { + description: 'should add external class to external links', + input: '<a href="https://example.com">Example</a>', + expected: '<a href="https://example.com" class="external">Example</a>' + }, + { + description: 'should remove unwanted attributes', + input: '<a href="https://engrave.dev" media="all">engrave.dev</a>', + expected: '<a href="https://engrave.dev" class="internal">engrave.dev</a>' + }, + { + description: 'should allow anchor links with no href', + input: '<a id="anchor">Example</a>', + expected: '<a id="anchor" class="internal">Example</a>' + }, + { + description: 'should trim href', + input: '<a href=" https://engrave.dev ">Example</a>', + expected: '<a href="https://engrave.dev" class="internal">Example</a>' + }, + { + description: 'should mark unsafe links as potentially phishing', + input: '<a href="https://unsafe.com">Example</a>', + expected: + '<a href="https://unsafe.com" rel="noopener" title="Link expanded to plain text; beware of a potential phishing attempt" target="_self" class="external">Example</a>' + }, + { + description: 'should not allow invalid schemes', + input: '<a href="ptth://engrave.dev">Example</a>', + expected: '<a class="external">Example</a>' + } + ].forEach(({description, expected, input}) => { + it(description, () => { + const sanitizer = new TagTransformingSanitizer(options, Localization.DEFAULT); + const sanitized = sanitizer.sanitize(input); + expect(sanitized).to.be.equal(expected); + }); + }); + }); +}); diff --git a/packages/renderer/src/renderers/default/sanitization/TagTransformingSanitizer.ts b/packages/renderer/src/renderers/default/sanitization/TagTransformingSanitizer.ts new file mode 100644 index 0000000000000000000000000000000000000000..175ef6ecb56588e650bada9e7499ec52b5453390 --- /dev/null +++ b/packages/renderer/src/renderers/default/sanitization/TagTransformingSanitizer.ts @@ -0,0 +1,189 @@ +/** + * This file is based on https://github.com/openhive-network/condenser/blob/master/src/app/utils/SanitizeConfig.js + */ +import ow from 'ow'; +import sanitize from 'sanitize-html'; +import {Log} from '../../../Log'; +import {Localization, LocalizationOptions} from '../Localization'; +import {StaticConfig} from '../StaticConfig'; + +export class TagTransformingSanitizer { + private options: TagsSanitizerOptions; + private localization: LocalizationOptions; + private sanitizationErrors: string[] = []; + + public constructor(options: TagsSanitizerOptions, localization: LocalizationOptions) { + this.validate(options); + Localization.validate(localization); + + this.localization = localization; + this.options = options; + } + + public sanitize(text: string): string { + return sanitize(text, this.generateSanitizeConfig()); + } + + public getErrors(): string[] { + return this.sanitizationErrors; + } + + private generateSanitizeConfig(): sanitize.IOptions { + return { + allowedTags: StaticConfig.sanitization.allowedTags, + + // SEE https://www.owasp.org/index.php/XSS_Filter_Evasion_Cheat_Sheet + allowedAttributes: { + // "src" MUST pass a whitelist (below) + iframe: ['src', 'width', 'height', 'frameborder', 'allowfullscreen', 'webkitallowfullscreen', 'mozallowfullscreen'], + + // class attribute is strictly whitelisted (below) + // and title is only set in the case of a phishing warning + div: ['class', 'title'], + + // style is subject to attack, filtering more below + td: ['style'], + img: ['src', 'alt'], + + // title is only set in the case of an external link warning + a: ['href', 'rel', 'title', 'class', 'target', 'id'] + }, + allowedSchemes: ['http', 'https', 'hive'], + transformTags: { + iframe: (tagName: string, attributes: sanitize.Attributes) => { + const srcAtty = attributes.src; + for (const item of StaticConfig.sanitization.iframeWhitelist) { + if (item.re.test(srcAtty)) { + const src = typeof item.fn === 'function' ? item.fn(srcAtty) : srcAtty; + if (!src) { + break; + } + const iframeToBeReturned: sanitize.Tag = { + tagName: 'iframe', + attribs: { + src, + width: this.options.iframeWidth + '', + height: this.options.iframeHeight + '', + // some of there are deprecated but required for some embeds + frameborder: '0', + allowfullscreen: 'allowfullscreen', + webkitallowfullscreen: 'webkitallowfullscreen', + mozallowfullscreen: 'mozallowfullscreen' + } + }; + return iframeToBeReturned; + } + } + Log.log().warn('Blocked, did not match iframe "src" white list urls:', tagName, attributes); + this.sanitizationErrors.push('Invalid iframe URL: ' + srcAtty); + + const retTag: sanitize.Tag = {tagName: 'div', text: `(Unsupported ${srcAtty})`, attribs: {}}; + return retTag; + }, + img: (tagName, attribs) => { + if (this.options.noImage) { + const retTagOnImagesNotAllowed: sanitize.Tag = { + tagName: 'div', + text: this.localization.noImage, + attribs: {} + }; + return retTagOnImagesNotAllowed; + } + // See https://github.com/punkave/sanitize-html/issues/117 + const {src, alt} = attribs; + // eslint-disable-next-line security/detect-unsafe-regex + if (!/^(https?:)?\/\//i.test(src)) { + Log.log().warn('Blocked, image tag src does not appear to be a url', tagName, attribs); + this.sanitizationErrors.push('An image in this post did not save properly.'); + const retTagOnNoUrl: sanitize.Tag = { + tagName: 'img', + attribs: {src: 'brokenimg.jpg'} + }; + return retTagOnNoUrl; + } + + const atts: sanitize.Attributes = {}; + atts.src = src.replace(/^http:\/\//i, '//'); // replace http:// with // to force https when needed + if (alt && alt !== '') { + atts.alt = alt; + } + const retTag: sanitize.Tag = {tagName, attribs: atts}; + return retTag; + }, + div: (tagName, attribs) => { + const attys: sanitize.Attributes = {}; + const classWhitelist = ['pull-right', 'pull-left', 'text-justify', 'text-rtl', 'text-center', 'text-right', 'videoWrapper', 'phishy']; + const validClass = classWhitelist.find((e) => attribs.class === e); + if (validClass) { + attys.class = validClass; + } + if (validClass === 'phishy' && attribs.title === this.localization.phishingWarning) { + attys.title = attribs.title; + } + const retTag: sanitize.Tag = { + tagName, + attribs: attys + }; + return retTag; + }, + td: (tagName, attribs) => { + const attys: sanitize.Attributes = {}; + if (attribs.style === 'text-align:right') { + attys.style = 'text-align:right'; + } + const retTag: sanitize.Tag = { + tagName, + attribs: attys + }; + return retTag; + }, + a: (tagName, attribs) => { + const attys: sanitize.Attributes = {...attribs}; + let {href} = attribs; + if (href) { + href = href.trim(); + attys.href = href; + } + if (href && !this.options.isLinkSafeFn(href)) { + attys.rel = this.options.addNofollowToLinks ? 'nofollow noopener' : 'noopener'; + attys.title = this.localization.phishingWarning; + attys.target = this.options.addTargetBlankToLinks ? '_blank' : '_self'; + } + if (href && this.options.addExternalCssClassToMatchingLinksFn(href)) { + attys.class = this.options.cssClassForExternalLinks ? this.options.cssClassForExternalLinks : ''; + } else { + attys.class = this.options.cssClassForInternalLinks ? this.options.cssClassForInternalLinks : ''; + } + const retTag: sanitize.Tag = { + tagName, + attribs: attys + }; + return retTag; + } + } + }; + } + private validate(o: TagsSanitizerOptions) { + ow(o, 'TagsSanitizerOptions', ow.object); + ow(o.iframeWidth, 'TagsSanitizerOptions.iframeWidth', ow.number.integer.positive); + ow(o.iframeHeight, 'TagsSanitizerOptions.iframeHeight', ow.number.integer.positive); + ow(o.addNofollowToLinks, 'TagsSanitizerOptions.addNofollowToLinks', ow.boolean); + ow(o.addTargetBlankToLinks, 'TagsSanitizerOptions.addTargetBlankToLinks', ow.optional.boolean); + ow(o.cssClassForInternalLinks, 'TagsSanitizerOptions.cssClassForInternalLinks', ow.optional.string); + ow(o.cssClassForExternalLinks, 'TagsSanitizerOptions.cssClassForExternalLinks', ow.optional.string); + ow(o.noImage, 'TagsSanitizerOptions.noImage', ow.boolean); + ow(o.isLinkSafeFn, 'TagsSanitizerOptions.isLinkSafeFn', ow.function); + ow(o.addExternalCssClassToMatchingLinksFn, 'TagsSanitizerOptions.addExternalCssClassToMatchingLinksFn', ow.function); + } +} +export interface TagsSanitizerOptions { + iframeWidth: number; + iframeHeight: number; + addNofollowToLinks: boolean; + addTargetBlankToLinks?: boolean; + cssClassForInternalLinks?: string; + cssClassForExternalLinks?: string; + noImage: boolean; + isLinkSafeFn: (url: string) => boolean; + addExternalCssClassToMatchingLinksFn: (url: string) => boolean; +} diff --git a/packages/renderer/src/security/LinkSanitizer.test.ts b/packages/renderer/src/security/LinkSanitizer.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..47bbc0d9ec83d5b3ce63f749743054c5606dee4f --- /dev/null +++ b/packages/renderer/src/security/LinkSanitizer.test.ts @@ -0,0 +1,36 @@ +import {expect} from 'chai'; +import {LinkSanitizer} from './LinkSanitizer'; + +describe('LinkSanitizer', () => { + it('should allow valid link', () => { + const linkSanitizer = new LinkSanitizer({baseUrl: 'https://hive.blog/'}); + + const sanitizedLink = linkSanitizer.sanitizeLink('https://hive.blog/@engrave', '@engrave'); + + expect(sanitizedLink).to.equal('https://hive.blog/@engrave'); + }); + + it('should prepend protocol link if not exists', () => { + const linkSanitizer = new LinkSanitizer({baseUrl: 'https://hive.blog/'}); + + const sanitizedLink = linkSanitizer.sanitizeLink('hive.blog/@engrave', 'engrave'); + + expect(sanitizedLink).to.equal('https://hive.blog/@engrave'); + }); + + it("should prevent links to different domain than it's title (pseudo local link)", () => { + const linkSanitizer = new LinkSanitizer({baseUrl: 'https://hive.blog/'}); + + const sanitizedLink = linkSanitizer.sanitizeLink('https://example.com/@engrave', 'https://hive.blog/@engrave'); + + expect(sanitizedLink).to.equal(false); + }); + + it(`should prevent phishing domain`, () => { + const linkSanitizer = new LinkSanitizer({baseUrl: 'https://hive.blog/'}); + + const sanitizedLink = linkSanitizer.sanitizeLink('https://stemit.com/', 'https://stemit.com/'); + + expect(sanitizedLink).to.equal(false); + }); +}); diff --git a/packages/renderer/src/security/LinkSanitizer.ts b/packages/renderer/src/security/LinkSanitizer.ts new file mode 100644 index 0000000000000000000000000000000000000000..ef22cb2d9e59edbc092d6aeb466ef68df17c1abd --- /dev/null +++ b/packages/renderer/src/security/LinkSanitizer.ts @@ -0,0 +1,84 @@ +import ow from 'ow'; +import {Log} from '../Log'; +import {Phishing} from './Phishing'; + +export class LinkSanitizer { + private options: LinkSanitizerOptions; + private baseUrl: URL; + private topLevelsBaseDomain: string; + + public constructor(options: LinkSanitizerOptions) { + this.validate(options); + this.options = options; + this.baseUrl = new URL(this.options.baseUrl); + this.topLevelsBaseDomain = LinkSanitizer.getTopLevelBaseDomainFromBaseUrl(this.baseUrl); + } + + public sanitizeLink(url: string, urlTitle: string): string | false { + url = this.prependUnknownProtocolLink(url); + + Log.log().debug('LinkSanitizer#sanitizeLink', {url, urlTitle}); + + if (Phishing.looksPhishy(url)) { + Log.log().debug('LinkSanitizer#sanitizeLink', 'phishing link detected', 'phishing list', url, { + url, + urlTitle + }); + return false; + } + + if (this.isPseudoLocalUrl(url, urlTitle)) { + Log.log().debug('LinkSanitizer#sanitizeLink', 'phishing link detected', 'pseudo local url', url, { + url, + urlTitle + }); + return false; + } + return url; + } + + private static getTopLevelBaseDomainFromBaseUrl(url: URL) { + const regex = /([^\s/$.?#]+\.[^\s/$.?#]+)$/g; + const m = regex.exec(url.hostname); + if (m && m[0]) return m[0]; + else { + throw new Error(`LinkSanitizer: could not determine top level base domain from baseUrl hostname: ${url.hostname}`); + } + } + + private prependUnknownProtocolLink(url: string): string { + // If this link is not relative, http, https, or hive -- add https. + // eslint-disable-next-line security/detect-unsafe-regex + if (!/^((#)|(\/(?!\/))|(((hive|https?):)?\/\/))/.test(url)) { + url = 'https://' + url; + } + return url; + } + + private isPseudoLocalUrl(url: string, urlTitle: string): boolean { + if (url.indexOf('#') === 0) return false; + url = url.toLowerCase(); + urlTitle = urlTitle.toLowerCase(); + + try { + const urlTitleContainsBaseDomain = urlTitle.indexOf(this.topLevelsBaseDomain) !== -1; + const urlContainsBaseDomain = url.indexOf(this.topLevelsBaseDomain) !== -1; + if (urlTitleContainsBaseDomain && !urlContainsBaseDomain) { + return true; + } + } catch (error) { + if (error instanceof TypeError) { + return false; // if url is invalid it is ok + } else throw error; + } + return false; + } + + private validate(o: LinkSanitizerOptions) { + ow(o, 'LinkSanitizerOptions', ow.object); + ow(o.baseUrl, 'LinkSanitizerOptions.baseUrl', ow.string.nonEmpty); + } +} +export interface LinkSanitizerOptions { + baseUrl: string; +} diff --git a/packages/renderer/src/security/Phishing.ts b/packages/renderer/src/security/Phishing.ts new file mode 100644 index 0000000000000000000000000000000000000000..78dc7e1035f3c033bca385f1d32998575a467222 --- /dev/null +++ b/packages/renderer/src/security/Phishing.ts @@ -0,0 +1,103 @@ +/** + * Based on: https://github.com/openhive-network/condenser/blob/master/src/app/utils/Phishing.js + */ + +const domains = [ + 'steewit.com', + 'Å›teemit.com', + 'Åteemit.com', + 'ÅŸteemit.com', + 'Å¡teemit.com', + 'sÅ£eemit.com', + 'sÅ¥eemit.com', + 'È™teemit.com', + 'sleemit.com', + 'aba.ae', + 'autobidbot.cf', + 'autobidbot.ga', + 'autobidbot.gq', + 'autobotsteem.cf', + 'autobotsteem.ga', + 'autobotsteem.gq', + 'autobotsteem.ml', + 'autosteem.info', + 'autosteembot.cf', + 'autosteembot.ga', + 'autosteembot.gq', + 'autosteembot.ml', + 'autosteemit.wapka.mobi', + 'boostbot.ga', + 'boostbot.gq', + 'boostwhaleup.cf', + 'cutt.us', + 'dereferer.me', + 'eb2a.com', + 'lordlinkers.tk', + 'nullrefer.com', + 'steeemit.ml', + 'steeemitt.aba.ae', + 'steemart.ga', + 'steemautobot.bid', + 'steemautobot.cf', + 'steemautobot.trade', + 'steemers.aba.ae', + 'steemiit.cf', + 'steemiit.ga', + 'steemij.tk', + 'steemik.ga', + 'steemik.tk', + 'steemil.com', + 'steemil.ml', + 'steemir.tk', + 'steemitou.co.nf', + 'steemitservices.ga', + 'steemitservices.gq', + 'steemiz.tk', + 'steemnow.cf', + 'steemnow.ga', + 'steemnow.gq', + 'steemnow.ml', + 'steempostupper.win', + 'steemrewards.ml', + 'steemrobot.ga', + 'steemrobot.ml', + 'steemupgot.cf', + 'steemupgot.ga', + 'steemupgot.gq', + 'steemupper.cf', + 'steemupper.ga', + 'steemupper.gq', + 'steemupper.ml', + 'steenit.cf', + 'stemit.com', + 'stssmater.aba.ae', + 'uppervotes.ga', + 'uppervotes.gq', + 'upperwhaleplus.cf', + 'upperwhaleplus.ga', + 'upperwhaleplus.gq', + 'upvoteme.cf', + 'upvoteme.ga', + 'upvoteme.gq', + 'upvoteme.ml', + 'url.rw', + 'us.aba.ae', + 'whaleboostup.ga', + 'whaleboostup.ml' +]; + +export class Phishing { + /** + * Does this URL look like a phishing attempt? + * + * @param {string} questionableUrl + * @returns {boolean} + */ + public static looksPhishy = (questionableUrl: string) => { + for (const domain of domains) { + if (questionableUrl.toLocaleLowerCase().indexOf(domain) > -1) return true; + } + + return false; + }; +} diff --git a/packages/renderer/src/security/SecurityChecker.test.ts b/packages/renderer/src/security/SecurityChecker.test.ts new file mode 100644 index 0000000000000000000000000000000000000000..e18ec7d7156423127088761cbae420aa10f86fc2 --- /dev/null +++ b/packages/renderer/src/security/SecurityChecker.test.ts @@ -0,0 +1,31 @@ +import {expect} from 'chai'; +import 'mocha'; +import {SecurityChecker} from './SecurityChecker'; + +describe('SecurityChecker', () => { + describe('checkSecurity', () => { + describe('props.allowScriptTag = false', () => { + const opts = {allowScriptTag: false}; + + it('Throws when contains script tag', () => { + expect(() => SecurityChecker.checkSecurity('<script src=', opts)).to.throw(/insecure content/); + }); + + it('Does not throw when no script tag', () => { + SecurityChecker.checkSecurity('<p></p>', opts); + }); + }); + + describe('props.allowScriptTag = true', () => { + const opts = {allowScriptTag: true}; + + it('Does not throw when script tag', () => { + SecurityChecker.checkSecurity('<script src=', opts); + }); + + it('Does not throw when no script tag', () => { + SecurityChecker.checkSecurity('<p></p>', opts); + }); + }); + }); +}); diff --git a/packages/renderer/src/security/SecurityChecker.ts b/packages/renderer/src/security/SecurityChecker.ts new file mode 100644 index 0000000000000000000000000000000000000000..296d2b5ba63615556e1a637c6120b05a9c2b98f3 --- /dev/null +++ b/packages/renderer/src/security/SecurityChecker.ts @@ -0,0 +1,19 @@ +import ChainedError from 'typescript-chained-error'; + +export class SecurityChecker { + public static checkSecurity(text: string, props: {allowScriptTag: boolean}) { + if (!props.allowScriptTag && this.containsScriptTag(text)) { + throw new SecurityError('Renderer rejected the input because of insecure content: text contains script tag'); + } + } + + private static containsScriptTag(text: string): boolean { + return /<\s*script/gi.test(text); + } +} + +export class SecurityError extends ChainedError { + public constructor(message?: string, cause?: Error) { + super(message, cause); + } +} diff --git a/packages/renderer/tsconfig.build.json b/packages/renderer/tsconfig.build.json new file mode 100755 index 0000000000000000000000000000000000000000..7b41ea54ec0eadd12b2deae9a942ed5f9a54b6b6 --- /dev/null +++ b/packages/renderer/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "include": ["src/**/*.ts", "src/**/*.tsx"], + "exclude": [ + "src/**/*.test.ts", + "src/**/*.spec.ts", + "browser-test/**/*", + "node_modules", + "dist" + ] +} diff --git a/packages/renderer/tsconfig.eslint.json b/packages/renderer/tsconfig.eslint.json new file mode 100644 index 0000000000000000000000000000000000000000..e51a3a1055fa6343ab2ff349c1cd5edfcdeb290e --- /dev/null +++ b/packages/renderer/tsconfig.eslint.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "browser-test/**/*" + ], + "exclude": [ + "node_modules", + "dist" + ] +} \ No newline at end of file diff --git a/packages/renderer/tsconfig.json b/packages/renderer/tsconfig.json new file mode 100755 index 0000000000000000000000000000000000000000..fa57326770244274e71c24be7edc7954da55a299 --- /dev/null +++ b/packages/renderer/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@hive/tsconfig/base.json", + "compilerOptions": { + "moduleResolution": "Bundler", + "module": "esnext", + "jsx": "react", + "lib": ["dom", "es2015", "es2016", "es2017"] + }, + "include": ["src/**/*"], + "exclude": ["node_modules", "**/*.test.ts", "**/*.spec.ts"] +} \ No newline at end of file diff --git a/packages/renderer/webpack.config.js b/packages/renderer/webpack.config.js new file mode 100644 index 0000000000000000000000000000000000000000..ace2d9edc28f2d103475f8527040596e5b127ef5 --- /dev/null +++ b/packages/renderer/webpack.config.js @@ -0,0 +1,71 @@ +'use strict'; + +const Visualizer = require('webpack-visualizer-plugin2'); + +const path = require('path'); +const webpack = require('webpack'); + +const DEFAULTS = { + isDevelopment: process.env.NODE_ENV !== 'production', + baseDir: path.join(__dirname, '..'), +}; + +module.exports = { + mode: (DEFAULTS.isDevelopment ? "development" : "production"), + entry: "./src/index.ts", + output: { + path: path.resolve(__dirname, "dist", "browser"), + filename: "hive-content-renderer.min.js", + library: "HiveContentRenderer", + libraryTarget: "umd", + globalObject: 'this' + }, + devtool: (DEFAULTS.isDevelopment ? 'eval-cheap-source-map' : false), + target: "web", + module: { + rules: [ + { + test: /\.tsx?$/, + use: [ + { + loader: 'ts-loader', + options: { + configFile: 'tsconfig.build.json', + transpileOnly: true, + compilerOptions: { + module: 'esnext' + } + } + } + ], + exclude: /node_modules/ + } + ] + }, + optimization: { + minimize: (!DEFAULTS.isDevelopment) + }, + performance: { + hints: false + }, + resolve: { + extensions: ['.tsx', '.ts', '.js', '.json'], + fallback: { + "fs": false, + "url": false + } + }, + plugins: [ + new Visualizer({ + filename: './statistics.html' + }), + new webpack.DefinePlugin({ + 'process.env': (process.env.NODE_ENV === 'production') ? { + NODE_ENV: '"production"' + } : { + NODE_ENV: '"development"' + }, + "_WEBPACK_BUILD": JSON.stringify(true), + }), + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f43eb2ef0f49a87bf9872d298a3ad50df98b1b9a..c9310183df30cbfd814301e9d81629a82c1b28e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,7 +14,7 @@ importers: devDependencies: '@turbo/gen': specifier: ^2.1.1 - version: 2.3.3(@types/node@20.10.4)(typescript@5.3.3) + version: 2.3.3(@types/node@20.14.10)(typescript@5.5.3) turbo: specifier: ^2.1.1 version: 2.3.3 @@ -148,6 +148,9 @@ importers: '@hive/prettier-config-custom': specifier: workspace:* version: link:../../packages/prettier-config-custom + '@hive/renderer': + specifier: workspace:* + version: link:../../packages/renderer '@hive/smart-signer': specifier: workspace:* version: link:../../packages/smart-signer @@ -163,9 +166,6 @@ importers: '@hive/ui': specifier: workspace:* version: link:../../packages/ui - '@hiveio/content-renderer': - specifier: ^2.2.0 - version: 2.3.1(react-dom@18.3.0(react@18.3.0))(react@18.3.0) '@hiveio/wax': specifier: 1.27.6-rc6-stable.250109151100 version: 1.27.6-rc6-stable.250109151100 @@ -437,7 +437,7 @@ importers: version: 8.57.1 eslint-config-next: specifier: latest - version: 15.1.6(eslint@8.57.1)(typescript@5.3.3) + version: 15.1.6(eslint@8.57.1)(typescript@5.5.3) eslint-config-prettier: specifier: latest version: 10.0.1(eslint@8.57.1) @@ -469,6 +469,130 @@ importers: specifier: ^0.3.0 version: 0.3.0(prettier@3.4.2) + packages/renderer: + dependencies: + '@xmldom/xmldom': + specifier: 0.8.10 + version: 0.8.10 + ow: + specifier: 0.28.2 + version: 0.28.2 + react-twitter-embed: + specifier: ^4.0.4 + version: 4.0.4(react-dom@18.3.0(react@17.0.2))(react@17.0.2) + remarkable: + specifier: 2.0.1 + version: 2.0.1 + sanitize-html: + specifier: 2.13.0 + version: 2.13.0 + typescript-chained-error: + specifier: 1.6.0 + version: 1.6.0 + universe-log: + specifier: 5.2.0 + version: 5.2.0 + devDependencies: + '@commitlint/cli': + specifier: 19.3.0 + version: 19.3.0(@types/node@20.14.10)(typescript@5.5.3) + '@commitlint/config-conventional': + specifier: 19.2.2 + version: 19.2.2 + '@engrave/eslint-config-engrave': + specifier: 1.0.0 + version: 1.0.0(@types/eslint@9.6.1)(eslint@8.57.0)(prettier@3.3.2)(typescript@5.5.3) + '@hive/tsconfig': + specifier: workspace:* + version: link:../tsconfig + '@semantic-release/gitlab': + specifier: 13.2.0 + version: 13.2.0(semantic-release@24.0.0(typescript@5.5.3)) + '@types/chai': + specifier: 4.3.16 + version: 4.3.16 + '@types/jsdom': + specifier: 21.1.7 + version: 21.1.7 + '@types/lodash': + specifier: 4.17.6 + version: 4.17.6 + '@types/mocha': + specifier: 10.0.7 + version: 10.0.7 + '@types/node': + specifier: 20.14.10 + version: 20.14.10 + '@types/remarkable': + specifier: 2.0.8 + version: 2.0.8 + '@types/sanitize-html': + specifier: 2.11.0 + version: 2.11.0 + '@types/uuid': + specifier: 10.0.0 + version: 10.0.0 + '@typescript-eslint/eslint-plugin': + specifier: 7.15.0 + version: 7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + chai: + specifier: 4.4.1 + version: 4.4.1 + eslint: + specifier: 8.57.0 + version: 8.57.0 + eslint-plugin-import: + specifier: 2.29.1 + version: 2.29.1(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0) + husky: + specifier: 9.0.11 + version: 9.0.11 + jsdom: + specifier: 24.1.0 + version: 24.1.0 + lodash: + specifier: 4.17.21 + version: 4.17.21 + mocha: + specifier: 10.6.0 + version: 10.6.0 + nyc: + specifier: 17.0.0 + version: 17.0.0 + prettier: + specifier: 3.3.2 + version: 3.3.2 + semantic-release: + specifier: 24.0.0 + version: 24.0.0(typescript@5.5.3) + testcafe: + specifier: 3.6.2 + version: 3.6.2 + ts-loader: + specifier: ^9.5.1 + version: 9.5.2(typescript@5.5.3)(webpack@5.92.1(webpack-cli@5.1.4)) + ts-node: + specifier: 10.9.2 + version: 10.9.2(@types/node@20.14.10)(typescript@5.5.3) + typescript: + specifier: 5.5.3 + version: 5.5.3 + typescript-eslint: + specifier: 7.15.0 + version: 7.15.0(eslint@8.57.0)(typescript@5.5.3) + uuid: + specifier: 10.0.0 + version: 10.0.0 + webpack: + specifier: 5.92.1 + version: 5.92.1(webpack-cli@5.1.4) + webpack-cli: + specifier: 5.1.4 + version: 5.1.4(webpack@5.92.1) + webpack-visualizer-plugin2: + specifier: 1.1.0 + version: 1.1.0 + packages/smart-signer: dependencies: '@hive/ui': @@ -561,7 +685,7 @@ importers: dependencies: '@tailwindcss/typography': specifier: ^0.5.13 - version: 0.5.16(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3))) + version: 0.5.16(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))) autoprefixer: specifier: 10.4.14 version: 10.4.14(postcss@8.4.39) @@ -570,10 +694,10 @@ importers: version: 8.4.39 tailwindcss: specifier: 3.4.6 - version: 3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + version: 3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3))) + version: 1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))) packages/transaction: dependencies: @@ -778,6 +902,9 @@ packages: peerDependencies: ajv: '>=8' + '@asamuzakjp/css-color@2.8.3': + resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} + '@babel/code-frame@7.26.2': resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} engines: {node: '>=6.9.0'} @@ -814,11 +941,25 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-define-polyfill-provider@0.4.4': + resolution: {integrity: sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + '@babel/helper-define-polyfill-provider@0.5.0': + resolution: {integrity: sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-define-polyfill-provider@0.6.3': resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-environment-visitor@7.24.7': + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} + engines: {node: '>=6.9.0'} + '@babel/helper-member-expression-to-functions@7.25.9': resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} engines: {node: '>=6.9.0'} @@ -912,6 +1053,40 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/plugin-proposal-async-generator-functions@7.20.7': + resolution: {integrity: sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-async-generator-functions instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-class-properties@7.18.6': + resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-decorators@7.25.9': + resolution: {integrity: sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-object-rest-spread@7.20.7': + resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-proposal-private-methods@7.18.6': + resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==} + engines: {node: '>=6.9.0'} + deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead. + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} @@ -939,6 +1114,23 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-decorators@7.25.9': + resolution: {integrity: sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-dynamic-import@7.8.3': + resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-flow@7.26.0': + resolution: {integrity: sha512-B+O2DnPc0iG+YXFqOxv2WNuNU97ToWjOomUQ78DouOENWUaM5sVrmet9mcomUGQFwpJd//gvUagXBSdzO1fRKg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.26.0': resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} engines: {node: '>=6.9.0'} @@ -1117,6 +1309,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-flow-strip-types@7.26.5': + resolution: {integrity: sha512-eGK26RsbIkYUns3Y8qKl362juDDYK+wEdPGHGrhzUl6CewZFo55VZ7hg+CyMFU4dd5QQakBN86nBMpRsFpRvbQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-for-of@7.25.9': resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} engines: {node: '>=6.9.0'} @@ -1249,6 +1447,30 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-react-display-name@7.25.9': + resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-development@7.25.9': + resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx@7.25.9': + resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-pure-annotations@7.25.9': + resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-regenerator@7.25.9': resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} engines: {node: '>=6.9.0'} @@ -1267,6 +1489,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-runtime@7.23.3': + resolution: {integrity: sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-transform-shorthand-properties@7.25.9': resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} engines: {node: '>=6.9.0'} @@ -1327,11 +1555,23 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/preset-flow@7.25.9': + resolution: {integrity: sha512-EASHsAhE+SSlEzJ4bzfusnXSHiU+JfAYzj+jbw2vgQKgq5HrUr8qs+vgtiEL5dOH6sEweI+PNt2D7AqrDSHyqQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/preset-modules@0.1.6-no-external-plugins': resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + '@babel/preset-react@7.26.3': + resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/runtime-corejs3@7.26.0': resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} engines: {node: '>=6.9.0'} @@ -1359,17 +1599,124 @@ packages: resolution: {integrity: sha512-LdWzgqmu116t9+sOvONyB21bBmI8dm8g8s3KhnJVzCcK93GrdSisuIOtOkQPMYgenmVGTWQwWnbLAgoka/jAFw==} hasBin: true + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@colors/colors@1.6.0': resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} engines: {node: '>=0.1.90'} + '@commitlint/cli@19.3.0': + resolution: {integrity: sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==} + engines: {node: '>=v18'} + hasBin: true + + '@commitlint/config-conventional@19.2.2': + resolution: {integrity: sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==} + engines: {node: '>=v18'} + + '@commitlint/config-validator@19.5.0': + resolution: {integrity: sha512-CHtj92H5rdhKt17RmgALhfQt95VayrUo2tSqY9g2w+laAXyk7K/Ef6uPm9tn5qSIwSmrLjKaXK9eiNuxmQrDBw==} + engines: {node: '>=v18'} + + '@commitlint/ensure@19.5.0': + resolution: {integrity: sha512-Kv0pYZeMrdg48bHFEU5KKcccRfKmISSm9MvgIgkpI6m+ohFTB55qZlBW6eYqh/XDfRuIO0x4zSmvBjmOwWTwkg==} + engines: {node: '>=v18'} + + '@commitlint/execute-rule@19.5.0': + resolution: {integrity: sha512-aqyGgytXhl2ejlk+/rfgtwpPexYyri4t8/n4ku6rRJoRhGZpLFMqrZ+YaubeGysCP6oz4mMA34YSTaSOKEeNrg==} + engines: {node: '>=v18'} + + '@commitlint/format@19.5.0': + resolution: {integrity: sha512-yNy088miE52stCI3dhG/vvxFo9e4jFkU1Mj3xECfzp/bIS/JUay4491huAlVcffOoMK1cd296q0W92NlER6r3A==} + engines: {node: '>=v18'} + + '@commitlint/is-ignored@19.7.1': + resolution: {integrity: sha512-3IaOc6HVg2hAoGleRK3r9vL9zZ3XY0rf1RsUf6jdQLuaD46ZHnXBiOPTyQ004C4IvYjSWqJwlh0/u2P73aIE3g==} + engines: {node: '>=v18'} + + '@commitlint/lint@19.7.1': + resolution: {integrity: sha512-LhcPfVjcOcOZA7LEuBBeO00o3MeZa+tWrX9Xyl1r9PMd5FWsEoZI9IgnGqTKZ0lZt5pO3ZlstgnRyY1CJJc9Xg==} + engines: {node: '>=v18'} + + '@commitlint/load@19.6.1': + resolution: {integrity: sha512-kE4mRKWWNju2QpsCWt428XBvUH55OET2N4QKQ0bF85qS/XbsRGG1MiTByDNlEVpEPceMkDr46LNH95DtRwcsfA==} + engines: {node: '>=v18'} + + '@commitlint/message@19.5.0': + resolution: {integrity: sha512-R7AM4YnbxN1Joj1tMfCyBryOC5aNJBdxadTZkuqtWi3Xj0kMdutq16XQwuoGbIzL2Pk62TALV1fZDCv36+JhTQ==} + engines: {node: '>=v18'} + + '@commitlint/parse@19.5.0': + resolution: {integrity: sha512-cZ/IxfAlfWYhAQV0TwcbdR1Oc0/r0Ik1GEessDJ3Lbuma/MRO8FRQX76eurcXtmhJC//rj52ZSZuXUg0oIX0Fw==} + engines: {node: '>=v18'} + + '@commitlint/read@19.5.0': + resolution: {integrity: sha512-TjS3HLPsLsxFPQj6jou8/CZFAmOP2y+6V4PGYt3ihbQKTY1Jnv0QG28WRKl/d1ha6zLODPZqsxLEov52dhR9BQ==} + engines: {node: '>=v18'} + + '@commitlint/resolve-extends@19.5.0': + resolution: {integrity: sha512-CU/GscZhCUsJwcKTJS9Ndh3AKGZTNFIOoQB2n8CmFnizE0VnEuJoum+COW+C1lNABEeqk6ssfc1Kkalm4bDklA==} + engines: {node: '>=v18'} + + '@commitlint/rules@19.6.0': + resolution: {integrity: sha512-1f2reW7lbrI0X0ozZMesS/WZxgPa4/wi56vFuJENBmed6mWq5KsheN/nxqnl/C23ioxpPO/PL6tXpiiFy5Bhjw==} + engines: {node: '>=v18'} + + '@commitlint/to-lines@19.5.0': + resolution: {integrity: sha512-R772oj3NHPkodOSRZ9bBVNq224DOxQtNef5Pl8l2M8ZnkkzQfeSTr4uxawV2Sd3ui05dUVzvLNnzenDBO1KBeQ==} + engines: {node: '>=v18'} + + '@commitlint/top-level@19.5.0': + resolution: {integrity: sha512-IP1YLmGAk0yWrImPRRc578I3dDUI5A2UBJx9FbSOjxe9sTlzFiwVJ+zeMLgAtHMtGZsC8LUnzmW1qRemkFU4ng==} + engines: {node: '>=v18'} + + '@commitlint/types@19.5.0': + resolution: {integrity: sha512-DSHae2obMSMkAtTBSOulg5X7/z+rGLxcXQIkg3OmWvY6wifojge5uVMydfhUvs7yQj+V7jNmRZ2Xzl8GJyqRgg==} + engines: {node: '>=v18'} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} + '@csstools/color-helpers@5.0.1': + resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} + engines: {node: '>=18'} + + '@csstools/css-calc@2.1.1': + resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-color-parser@3.0.7': + resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-parser-algorithms': ^3.0.4 + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-parser-algorithms@3.0.4': + resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} + engines: {node: '>=18'} + peerDependencies: + '@csstools/css-tokenizer': ^3.0.3 + + '@csstools/css-tokenizer@3.0.3': + resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} + engines: {node: '>=18'} + '@dabh/diagnostics@2.0.3': resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + '@devexpress/bin-v8-flags-filter@1.3.0': + resolution: {integrity: sha512-LWLNfYGwVJKYpmHUDoODltnlqxdEAl5Qmw7ha1+TSpsABeF94NKSWkQTTV1TB4CM02j2pZyqn36nHgaFl8z7qw==} + + '@devexpress/callsite-record@4.1.7': + resolution: {integrity: sha512-qr3VQYc0KopduFkEY6SxaOIi1Xhm0jIWQfrxxMVboI/p2rjF/Mj/iqaiUxQQP6F3ujpW/7l0mzhf17uwcFZhBA==} + '@discoveryjs/json-ext@0.5.7': resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} @@ -1378,6 +1725,11 @@ packages: resolution: {integrity: sha512-rGPjzD7a7cPtMHjpJEtLMt/RmqX8XK25tN5qjuu9iaDMK/Ril86CecU5DN/TXEMUQMY1p6b2cVvKBLTdFMr2DA==} engines: {node: '>=6'} + '@electron/asar@3.2.18': + resolution: {integrity: sha512-2XyvMe3N3Nrs8cV39IKELRHTYUWFKrmqqSY1U+GMlc0jvqjIVnoxhNd2H4JolWQncbJi1DCvb5TNxZuI2fEjWg==} + engines: {node: '>=10.12.0'} + hasBin: true + '@emotion/is-prop-valid@1.2.2': resolution: {integrity: sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==} @@ -1387,6 +1739,11 @@ packages: '@emotion/unitless@0.8.1': resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} + '@engrave/eslint-config-engrave@1.0.0': + resolution: {integrity: sha512-X2yNnkdsOgrl1IoWjC/tI5H54nh3vu01f1e6RJ2ZVlV5uyrAxyFIQPOYc9U0QKtJEIlWoUrRp9eDoVOlDP7zcg==} + peerDependencies: + eslint: '>= 8.49.0' + '@eslint-community/eslint-utils@4.4.1': resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1401,6 +1758,10 @@ packages: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@8.57.0': + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1428,10 +1789,6 @@ packages: resolution: {integrity: sha1-mj3k3qAgTdIrc6IxzC5VOprhWZs=, tarball: https://gitlab.syncad.com/api/v4/projects/198/packages/npm/@hiveio/beekeeper/-/@hiveio/beekeeper-1.27.6-rc4.tgz} engines: {node: '>= 18'} - '@hiveio/content-renderer@2.3.1': - resolution: {integrity: sha512-YE8Lj4LycKxig+2z8VQXNiedQq0lx0pQk9q6USsbHZIFaZePWvkZAJAFy2q9qmLFH5Ca5Nu/TGTiZFQbmbLOVQ==, tarball: https://registry.npmjs.org/@hiveio/content-renderer/-/content-renderer-2.3.1.tgz} - engines: {node: '>=20'} - '@hiveio/dhive@1.3.2': resolution: {integrity: sha512-kJjp3TbpIlODxjJX4BWwvOf+cMxT8CFH/mNQ40RRjR2LP0a4baSWae1G+U/q/NtgjsIQz6Ja40tvnw6KF12I+g==, tarball: https://registry.npmjs.org/@hiveio/dhive/-/dhive-1.3.2.tgz} @@ -1462,6 +1819,11 @@ packages: peerDependencies: react-hook-form: ^7.0.0 + '@humanwhocodes/config-array@0.11.14': + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + deprecated: Use @eslint/config-array instead + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -1667,15 +2029,79 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@octokit/auth-token@5.1.2': + resolution: {integrity: sha512-JcQDsBdg49Yky2w2ld20IHAlwr8d/d8N6NiOXbtuoPCqzbsiJgF633mVUw3x4mo0H5ypataQIX7SFu3yy44Mpw==} + engines: {node: '>= 18'} + + '@octokit/core@6.1.3': + resolution: {integrity: sha512-z+j7DixNnfpdToYsOutStDgeRzJSMnbj8T1C/oQjB6Aa+kRfNjs/Fn7W6c8bmlt6mfy3FkgeKBRnDjxQow5dow==} + engines: {node: '>= 18'} + + '@octokit/endpoint@10.1.2': + resolution: {integrity: sha512-XybpFv9Ms4hX5OCHMZqyODYqGTZ3H6K6Vva+M9LR7ib/xr1y1ZnlChYv9H680y77Vd/i/k+thXApeRASBQkzhA==} + engines: {node: '>= 18'} + + '@octokit/graphql@8.2.0': + resolution: {integrity: sha512-gejfDywEml/45SqbWTWrhfwvLBrcGYhOn50sPOjIeVvH6i7D16/9xcFA8dAJNp2HMcd+g4vru41g4E2RBiZvfQ==} + engines: {node: '>= 18'} + + '@octokit/openapi-types@23.0.1': + resolution: {integrity: sha512-izFjMJ1sir0jn0ldEKhZ7xegCTj/ObmEDlEfpFrx4k/JyZSMRHbO3/rBwgE7f3m2DHt+RrNGIVw4wSmwnm3t/g==} + + '@octokit/plugin-paginate-rest@11.4.0': + resolution: {integrity: sha512-ttpGck5AYWkwMkMazNCZMqxKqIq1fJBNxBfsFwwfyYKTf914jKkLF0POMS3YkPBwp5g1c2Y4L79gDz01GhSr1g==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-retry@7.1.3': + resolution: {integrity: sha512-8nKOXvYWnzv89gSyIvgFHmCBAxfQAOPRlkacUHL9r5oWtp5Whxl8Skb2n3ACZd+X6cYijD6uvmrQuPH/UCL5zQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': '>=6' + + '@octokit/plugin-throttling@9.4.0': + resolution: {integrity: sha512-IOlXxXhZA4Z3m0EEYtrrACkuHiArHLZ3CvqWwOez/pURNqRuwfoFlTPbN5Muf28pzFuztxPyiUiNwz8KctdZaQ==} + engines: {node: '>= 18'} + peerDependencies: + '@octokit/core': ^6.1.3 + + '@octokit/request-error@6.1.6': + resolution: {integrity: sha512-pqnVKYo/at0NuOjinrgcQYpEbv4snvP3bKMRqHaD9kIsk9u1LCpb2smHZi8/qJfgeNqLo5hNW4Z7FezNdEo0xg==} + engines: {node: '>= 18'} + + '@octokit/request@9.2.0': + resolution: {integrity: sha512-kXLfcxhC4ozCnAXy2ff+cSxpcF0A1UqxjvYMqNuPIeOAzJbVWQ+dy5G2fTylofB/gTbObT8O6JORab+5XtA1Kw==} + engines: {node: '>= 18'} + + '@octokit/types@13.8.0': + resolution: {integrity: sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==} + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + '@playwright/test@1.49.1': resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==} engines: {node: '>=18'} hasBin: true + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} @@ -2582,6 +3008,43 @@ packages: '@rushstack/eslint-patch@1.10.5': resolution: {integrity: sha512-kkKUDVlII2DQiKy7UstOR1ErJP8kUKAQ4oa+SQtM0K+lPdmmjj0YnnxBgtTVYH7mUKtbsxeFC9y0AmK7Yb78/A==} + '@sec-ant/readable-stream@0.4.1': + resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==} + + '@semantic-release/commit-analyzer@13.0.1': + resolution: {integrity: sha512-wdnBPHKkr9HhNhXOhZD5a2LNl91+hs8CC2vsAVYxtZH3y0dV3wKn+uZSN61rdJQZ8EGxzWB3inWocBHV9+u/CQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/error@4.0.0': + resolution: {integrity: sha512-mgdxrHTLOjOddRVYIYDo0fR3/v61GNN1YGkfbrjuIKg/uMgCd+Qzo3UAXJ+woLQQpos4pl5Esuw5A7AoNlzjUQ==} + engines: {node: '>=18'} + + '@semantic-release/github@10.3.5': + resolution: {integrity: sha512-svvRglGmvqvxjmDgkXhrjf0lC88oZowFhOfifTldbgX9Dzj0inEtMLaC+3/MkDEmxmaQjWmF5Q/0CMIvPNSVdQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/gitlab@13.2.0': + resolution: {integrity: sha512-bkEc4kR2OeVUtqjhIzATFsQ5QpMlOpXY6goDLSWPinqCqJcN+hWIS1M4qqu8SXsL2XvKaV2RAQY8Yd38duStJQ==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/npm@12.0.1': + resolution: {integrity: sha512-/6nntGSUGK2aTOI0rHPwY3ZjgY9FkXmEHbW9Kr+62NVOsyqpKKeP0lrCH+tphv+EsNdJNmqqwijTEnVWUMQ2Nw==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + + '@semantic-release/release-notes-generator@14.0.3': + resolution: {integrity: sha512-XxAZRPWGwO5JwJtS83bRdoIhCiYIx8Vhr+u231pQAsdFIAbm19rSVJLdnBN+Avvk7CKvNQE/nJ4y7uqKH6WTiw==} + engines: {node: '>=20.8.1'} + peerDependencies: + semantic-release: '>=20.1.0' + '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -2593,10 +3056,18 @@ packages: resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} engines: {node: '>=14.16'} + '@sindresorhus/is@7.0.1': + resolution: {integrity: sha512-QWLl2P+rsCJeofkDNIT3WFmb6NrRud1SUYW8dIhXK/46XFV8Q/g7Bsvib0Askb0reRLe+WYPeeE+l5cH7SlkuQ==} + engines: {node: '>=18'} + '@sindresorhus/merge-streams@2.3.0': resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@sindresorhus/merge-streams@4.0.0': + resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} + engines: {node: '>=18'} + '@sinonjs/commons@3.0.1': resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} @@ -2716,12 +3187,18 @@ packages: '@types/bs58@4.0.4': resolution: {integrity: sha512-0IEpMFXXQi2zXaXl9GJ3sRwQo0uEkD+yFOv+FnAU5lkPtcu6h61xb7jc2CFPEZ5BUOaiP13ThuGc9HD4R8lR5g==} + '@types/chai@4.3.16': + resolution: {integrity: sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==} + '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} '@types/content-disposition@0.5.8': resolution: {integrity: sha512-QVSSvno3dE0MgO76pJhmv4Qyi/j0Yk9pBp0Y7TJ2Tlj+KCgJWY6qX7nnxCOLkZ3VYRSIk1WTxCvwUSdx6CCLdg==} + '@types/conventional-commits-parser@5.0.1': + resolution: {integrity: sha512-7uz5EHdzz2TqoMfV7ee61Egf5y6NkcO4FB/1iCCQnbeiI1F3xzv3vK5dBCXUCLQgGYS+mUeigK1iKQzvED+QnQ==} + '@types/cookies@0.9.0': resolution: {integrity: sha512-40Zk8qR147RABiQ7NQnBzWzDcjKzNrntB5BAmeGCb2p/MIyOE+4BVvc17wumsUqUw00bJYqoXFHYygQnEFh4/Q==} @@ -2767,6 +3244,9 @@ packages: '@types/estree@0.0.39': resolution: {integrity: sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==} + '@types/estree@0.0.46': + resolution: {integrity: sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2809,6 +3289,9 @@ packages: '@types/jsdom@20.0.1': resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + '@types/jsdom@21.1.7': + resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2824,6 +3307,9 @@ packages: '@types/koa@2.15.0': resolution: {integrity: sha512-7QFsywoE5URbuVnG3loe03QXuGajrnotr3gQkXcEBShORai23MePfFYdhz90FEtBBpkyIYQbVD+evKtloCgX3g==} + '@types/lodash@4.17.6': + resolution: {integrity: sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==} + '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -2833,6 +3319,9 @@ packages: '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + '@types/mocha@10.0.7': + resolution: {integrity: sha512-GN8yJ1mNTcFcah/wKEFIJckJx9iJLoMSzWcfRRuxz/Jk+U6KQNnml+etbtxFK8lPjzOw3zp4Ha/kjSst9fsHYw==} + '@types/ms@0.7.34': resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} @@ -2842,9 +3331,18 @@ packages: '@types/node@20.10.4': resolution: {integrity: sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==} + '@types/node@20.14.10': + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + '@types/oidc-provider@8.5.2': resolution: {integrity: sha512-NiD3VG49+cRCAAe8+uZLM4onOcX8y9+cwaml8JG1qlgc98rWoCRgsnOB4Ypx+ysays5jiwzfUgT0nWyXPB/9uQ==} + '@types/parse-path@7.0.3': + resolution: {integrity: sha512-LriObC2+KYZD3FzCrgWGv/qufdUy4eXrxcLgQMfYXgPbLIecKIsVBaQgUPmxSSLcjmYbDTQbMgr6qr6l/eb7Bg==} + '@types/parse5@6.0.3': resolution: {integrity: sha512-SuT16Q1K51EAVPz1K29DJ/sXjhSQ0zjvsypYJ6tlwVsRV9jwW5Adq2ch8Dq8kDBCkYnELS7N7VNCSB5nC56t/g==} @@ -2875,12 +3373,18 @@ packages: '@types/resolve@1.17.1': resolution: {integrity: sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==} + '@types/sanitize-html@2.11.0': + resolution: {integrity: sha512-7oxPGNQHXLHE48r/r/qjn7q0hlrs3kL7oZnGj0Wf/h9tj/6ibFyRkNbsDxaBBZ4XUZ0Dx5LGCyDJ04ytSofacQ==} + '@types/sanitize-html@2.13.0': resolution: {integrity: sha512-X31WxbvW9TjIhZZNyNBZ/p5ax4ti7qsNDBDEnH4zAgmEh35YnFD1UiS6z9Cd34kKm0LslFW0KPmTQzu/oGtsqQ==} '@types/secure-random@1.1.3': resolution: {integrity: sha512-zUvl/Y/9gG2wRE5IUgqJTje0jQr97Rw+ZWovmkbkP393aUO7PR71diJlp4wKQcqucUoJVXMJdWjZfVkcoCt64w==} + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + '@types/send@0.17.4': resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} @@ -2914,6 +3418,9 @@ packages: '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} + '@types/uuid@10.0.0': + resolution: {integrity: sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==} + '@types/validator@13.12.2': resolution: {integrity: sha512-6SlHBzUW8Jhf3liqrGGXyTJSIFe4nqlJ5A5KaMZ2l/vbM3Wh3KSybots/wfWVzNLK4D1NZluDlSQIbIEPx6oyA==} @@ -2926,6 +3433,28 @@ packages: '@types/yazl@2.4.5': resolution: {integrity: sha512-qpmPfx32HS7vlGJf7EsoM9qJnLZhXJBf1KH0hzfdc+D794rljQWh4H0I/UrZy+6Nhqn0l2jdBZXBGZtR1vnHqw==} + '@typescript-eslint/eslint-plugin@6.7.0': + resolution: {integrity: sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/eslint-plugin@7.15.0': + resolution: {integrity: sha512-uiNHpyjZtFrLwLDpHnzaDlP3Tt6sGMqTCiqmxaN4n4RP0EfYZDODJyddiFDF44Hjwxr5xAcaYxVKm9QKQFJFLA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/eslint-plugin@8.20.0': resolution: {integrity: sha512-naduuphVw5StFfqp4Gq4WhIBE2gN1GEmMUExpJYknZJdRnc+2gDzB8Z3+5+/Kv33hPQRDGzQO/0opHE72lZZ6A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2934,6 +3463,26 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/parser@6.7.0': + resolution: {integrity: sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.15.0': + resolution: {integrity: sha512-k9fYuQNnypLFcqORNClRykkGOMOj+pV6V91R4GO/l1FDGwpqmSwoOQrOHo3cGaH63e+D3ZiCAOsuS/D2c99j/A==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/parser@8.20.0': resolution: {integrity: sha512-gKXG7A5HMyjDIedBi6bUrDcun8GIjnI8qOwVLiY3rx6T/sHP/19XLJOnIq/FgQvWLHja5JN/LSE7eklNBr612g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2941,10 +3490,38 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/scope-manager@6.7.0': + resolution: {integrity: sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/scope-manager@7.15.0': + resolution: {integrity: sha512-Q/1yrF/XbxOTvttNVPihxh1b9fxamjEoz2Os/Pe38OHwxC24CyCqXxGTOdpb4lt6HYtqw9HetA/Rf6gDGaMPlw==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/scope-manager@8.20.0': resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@6.7.0': + resolution: {integrity: sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/type-utils@7.15.0': + resolution: {integrity: sha512-SkgriaeV6PDvpA6253PDVep0qCqgbO1IOBiycjnXsszNTVQe5flN5wR5jiczoEoDEnAqYFSFFc9al9BSGVltkg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/type-utils@8.20.0': resolution: {integrity: sha512-bPC+j71GGvA7rVNAHAtOjbVXbLN5PkwqMvy1cwGeaxUoRQXVuKCebRoLzm+IPW/NtFFpstn1ummSIasD5t60GA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2952,16 +3529,54 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/types@6.7.0': + resolution: {integrity: sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/types@7.15.0': + resolution: {integrity: sha512-aV1+B1+ySXbQH0pLK0rx66I3IkiZNidYobyfn0WFsdGhSXw+P3YOqeTq5GED458SfB24tg+ux3S+9g118hjlTw==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/types@8.20.0': resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@6.7.0': + resolution: {integrity: sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.15.0': + resolution: {integrity: sha512-gjyB/rHAopL/XxfmYThQbXbzRMGhZzGw6KpcMbfe8Q3nNQKStpxnUKeXb0KiN/fFDR42Z43szs6rY7eHk0zdGQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@typescript-eslint/typescript-estree@8.20.0': resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/utils@6.7.0': + resolution: {integrity: sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.15.0': + resolution: {integrity: sha512-hfDMDqaqOqsUVGiEPSMLR/AjTSCsmJwjpKkYQRo1FNbmW4tBwBspYDwO9eh7sKSTwMQgBw9/T4DHudPaqshRWA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + '@typescript-eslint/utils@8.20.0': resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2969,6 +3584,14 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.8.0' + '@typescript-eslint/visitor-keys@6.7.0': + resolution: {integrity: sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==} + engines: {node: ^16.0.0 || >=18.0.0} + + '@typescript-eslint/visitor-keys@7.15.0': + resolution: {integrity: sha512-Hqgy/ETgpt2L5xueA/zHHIl4fJI2O4XUE9l4+OIfbJIRSnTJb/QscncdqqZzofQegIJugRIF57OJea1khw2SDw==} + engines: {node: ^18.18.0 || >=20.0.0} + '@typescript-eslint/visitor-keys@8.20.0': resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3036,6 +3659,31 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + '@webpack-cli/configtest@2.1.1': + resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/info@2.0.2': + resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + + '@webpack-cli/serve@2.0.5': + resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} + engines: {node: '>=14.15.0'} + peerDependencies: + webpack: 5.x.x + webpack-cli: 5.x.x + webpack-dev-server: '*' + peerDependenciesMeta: + webpack-dev-server: + optional: true + '@xmldom/xmldom@0.8.10': resolution: {integrity: sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==} engines: {node: '>=10.0.0'} @@ -3046,7 +3694,11 @@ packages: '@xtuc/long@4.2.2': resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - abab@2.0.6: + JSONStream@1.3.5: + resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + hasBin: true + + abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -3061,6 +3713,14 @@ packages: acorn-globals@7.0.1: resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + acorn-hammerhead@0.6.2: + resolution: {integrity: sha512-JZklfs1VVyjA1hf1y5qSzKSmK3K1UUUI7fQTuM/Zhv3rz4kFhdx4QwVnmU6tBEC8g/Ov6B+opfNFPeSZrlQfqA==} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3075,6 +3735,10 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + address@2.0.3: + resolution: {integrity: sha512-XNAb/a6TCqou+TufU8/u11HCu9x1gYvOoxLwtlXgIqmkrYQADVv6ljyW2zwiPhHz9R1gItAWpuDrdJMmrOBFEA==} + engines: {node: '>= 16.0.0'} + agent-base@6.0.2: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} @@ -3087,6 +3751,10 @@ packages: resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} engines: {node: '>=8'} + aggregate-error@5.0.0: + resolution: {integrity: sha512-gOsf2YwSlleG6IjRYG2A7k0HmBMEo6qVNk9Bp/EaLgAJT5ngH6PXbqa4ItvnEwCm/velL5jAnQgsHsWnjhGmvw==} + engines: {node: '>=18'} + ajv-formats@2.1.1: resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} peerDependencies: @@ -3111,10 +3779,18 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} + ansi-escapes@7.0.0: + resolution: {integrity: sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==} + engines: {node: '>=18'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -3146,6 +3822,13 @@ packages: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} + append-transform@2.0.0: + resolution: {integrity: sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==} + engines: {node: '>=8'} + + archy@1.0.0: + resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} + arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -3158,6 +3841,9 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + argv-formatter@1.0.0: + resolution: {integrity: sha512-F2+Hkm9xFaRg+GkaNnbwXNDV5O6pnCFEmqyhvfC/Ic5LbgOWjJh3L+mN/s91rxVL3znE7DYVpW0GJFT+4YBgWw==} + aria-hidden@1.2.4: resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==} engines: {node: '>=10'} @@ -3173,6 +3859,12 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} + array-find@1.0.0: + resolution: {integrity: sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==} + + array-ify@1.0.0: + resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + array-includes@3.1.8: resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} engines: {node: '>= 0.4'} @@ -3217,6 +3909,9 @@ packages: resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} engines: {node: '>=0.8'} + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -3224,6 +3919,13 @@ packages: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} + async-exit-hook@1.1.2: + resolution: {integrity: sha512-CeTSWB5Bou31xSHeO45ZKgLPRaJbV4I8csRcFYETDBehX7H+1GDO/v+v8G7fZmar1gOmYa6UTXn6d/WIiJbslw==} + engines: {node: '>=0.12.0'} + + async@3.2.3: + resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} + async@3.2.6: resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} @@ -3291,6 +3993,10 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + babel-plugin-module-resolver@5.0.0: + resolution: {integrity: sha512-g0u+/ChLSJ5+PzYwLwP8Rp8Rcfowz58TJNCe+L/ui4rpzE/mg//JVX0EWBUYoxaextqnwuGHzfGp2hh0PPV25Q==} + engines: {node: '>= 16'} + babel-plugin-polyfill-corejs2@0.4.12: resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} peerDependencies: @@ -3301,11 +4007,24 @@ packages: peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-corejs3@0.8.7: + resolution: {integrity: sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.5.5: + resolution: {integrity: sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-polyfill-regenerator@0.6.3: resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + babel-plugin-syntax-trailing-function-commas@6.22.0: + resolution: {integrity: sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==} + babel-plugin-transform-remove-imports@1.8.0: resolution: {integrity: sha512-QdE5ZnIjON1pSgTPU8KzLnl/LEzdq9PLmZNuHgGKTx0LOI9PBrHBj0fz9uCg2CdssiTw7v/zVRYs8GJxbvhKnQ==} peerDependencies: @@ -3341,6 +4060,9 @@ packages: bcp-47-match@2.0.3: resolution: {integrity: sha512-JtTezzbAibu8G0R9op9zb3vcWZd9JF6M0xOYGPn0fNCd7wOpRB1mU2mH9T8gaBGbAAyIIVgB2G7xG0GP98zMAQ==} + before-after-hook@3.0.2: + resolution: {integrity: sha512-Nik3Sc0ncrMK4UUdXQmAnRtzmNQTAAXmXIopizwZ1W1t8QmfJj+zL4OA2I7XPTPW5z5TDqv4hRo/JzouDJnX3A==} + big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} @@ -3369,6 +4091,15 @@ packages: boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + bottleneck@2.19.5: + resolution: {integrity: sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==} + + bowser@1.6.0: + resolution: {integrity: sha512-Fk23J0+vRnI2eKDEDoUZXWtbMjijr098lKhuj4DKAfMKMCRVfJOuxXlbpxy0sTgbZ/Nr2N8MexmOir+GGI/ZMA==} + + bowser@2.11.0: + resolution: {integrity: sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==} + brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -3382,6 +4113,9 @@ packages: brorand@1.1.0: resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + browser-stdout@1.3.1: + resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + browserify-aes@1.2.0: resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==} @@ -3435,6 +4169,14 @@ packages: resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} engines: {node: '>=14.16'} + cacheable-request@12.0.1: + resolution: {integrity: sha512-Yo9wGIQUaAfIbk+qY0X4cDQgCosecfBe3V9NSyeY4qPC2SAkbCS4Xj79VP8WOzitpJUZKc/wsRCYF5ariDIwkg==} + engines: {node: '>=18'} + + caching-transform@4.0.0: + resolution: {integrity: sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==} + engines: {node: '>=8'} + call-bind-apply-helpers@1.0.1: resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==} engines: {node: '>= 0.4'} @@ -3447,6 +4189,9 @@ packages: resolution: {integrity: sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==} engines: {node: '>= 0.4'} + callsite@1.0.0: + resolution: {integrity: sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==} + callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} @@ -3475,6 +4220,14 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + chai@4.3.4: + resolution: {integrity: sha512-yS5H68VYOCtN1cjfwumDSuzn/9c+yza4f3reKXlE5rUg7SFcCEy90gJvydNgOYtblyf4Zi6jIWRnXOgErta0KA==} + engines: {node: '>=4'} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} @@ -3487,6 +4240,10 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + chalk@5.4.1: + resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + change-case@3.1.0: resolution: {integrity: sha512-2AZp7uJZbYEzRPsFoa+ijKdvp9zsrnnt6+yFokfwEpeJm0xuJDVoxiRCAaTzyJND8GJkofo2IcKWaUZ/OECVzw==} @@ -3512,14 +4269,24 @@ packages: chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chrome-remote-interface@0.32.2: + resolution: {integrity: sha512-3UbFKtEmqApehPQnqdblcggx7KveQphEMKQmdJZsOguE9ylw2N2/9Z7arO7xS55+DBJ/hyP8RrayLt4MMdJvQg==} + hasBin: true + chrome-trace-event@1.0.4: resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} engines: {node: '>=6.0'} + ci-info@1.6.0: + resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} + ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -3544,6 +4311,10 @@ packages: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} + clean-stack@5.2.0: + resolution: {integrity: sha512-TyUIUJgdFnCISzG5zu3291TAsE77ddchd0bepon1VVQrKLGKFED4iXFEDQ24mIPdPBbyE16PK3F8MYE1CmcBEQ==} + engines: {node: '>=14.16'} + clean-webpack-plugin@4.0.0: resolution: {integrity: sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==} engines: {node: '>=10.0.0'} @@ -3554,10 +4325,19 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} + cli-highlight@2.1.11: + resolution: {integrity: sha512-9KDcoEVwyUXrjcJNvHD0NFc/hiwe/WPVYIleQh2O1N2Zro5gWJZ/K+3DGn8w8P/F6FxOgzyC5bxDyHIgCSPhGg==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -3568,10 +4348,17 @@ packages: cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone-deep@4.0.1: + resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} + engines: {node: '>=6'} + clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -3594,6 +4381,11 @@ packages: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + coffeescript@2.7.0: + resolution: {integrity: sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==} + engines: {node: '>=6'} + hasBin: true + collect-v8-coverage@1.0.2: resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} @@ -3636,6 +4428,9 @@ packages: resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} engines: {node: '>=14'} + commander@2.11.0: + resolution: {integrity: sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==} + commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3643,10 +4438,18 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} + commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + common-path-prefix@3.0.0: resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} @@ -3657,9 +4460,15 @@ packages: commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + compare-func@2.0.0: + resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + constant-case@2.0.0: resolution: {integrity: sha512-eS0N9WwmjTqrOmR3o83F5vW8Z+9R1HnVz3xmzT2PMFug9ly+Au/fxRWlEBSb6LcZwspSsEn9Xs1uw9YgzAg1EQ==} @@ -3671,6 +4480,44 @@ packages: resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} engines: {node: '>= 0.6'} + conventional-changelog-angular@7.0.0: + resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} + engines: {node: '>=16'} + + conventional-changelog-angular@8.0.0: + resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} + engines: {node: '>=18'} + + conventional-changelog-conventionalcommits@7.0.2: + resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} + engines: {node: '>=16'} + + conventional-changelog-writer@8.0.0: + resolution: {integrity: sha512-TQcoYGRatlAnT2qEWDON/XSfnVG38JzA7E0wcGScu7RElQBkg9WWgZd1peCWFcWDh1xfb2CfsrcvOn1bbSzztA==} + engines: {node: '>=18'} + hasBin: true + + conventional-commits-filter@5.0.0: + resolution: {integrity: sha512-tQMagCOC59EVgNZcC5zl7XqO30Wki9i9J3acbUvkaosCT6JX3EeFwJD7Qqp4MCikRnzS18WXV3BLIQ66ytu6+Q==} + engines: {node: '>=18'} + + conventional-commits-parser@5.0.0: + resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} + engines: {node: '>=16'} + hasBin: true + + conventional-commits-parser@6.0.0: + resolution: {integrity: sha512-TbsINLp48XeMXR8EvGjTnKGsZqBemisPoyWESlpRyR8lif0lcwzqz+NMtYSj1ooF/WYjSuu7wX0CtdeeMEQAmA==} + engines: {node: '>=18'} + hasBin: true + + convert-hrtime@5.0.0: + resolution: {integrity: sha512-lOETlkIeYSJWcbbcvjRKGxVMXJR+8+OQb/mTPbA4ObPMytYIsUbuOE0Jzy60hjARYszq1id0j8KgVhC+WGZVTg==} + engines: {node: '>=12'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + convert-source-map@2.0.0: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} @@ -3717,6 +4564,23 @@ packages: resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} engines: {node: '>= 0.10'} + cosmiconfig-typescript-loader@6.1.0: + resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} + engines: {node: '>=v18'} + peerDependencies: + '@types/node': '*' + cosmiconfig: '>=9' + typescript: '>=5' + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + create-hash@1.2.0: resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==} @@ -3745,10 +4609,18 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + crypto-md5@1.0.0: + resolution: {integrity: sha512-65Mtei8+EkSIK+5Ie4gpWXoJ/5bgpqPXFknHHXAyhDqKsEAAzUslGd8mOeawbfcuQ8fADNKcF4xQA3fqlZJ8Ig==} + engines: {iojs: '>=1.0.0', node: '>=0.5.2'} + crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + css-color-keywords@1.0.0: resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==} engines: {node: '>=4'} @@ -3777,6 +4649,10 @@ packages: resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} engines: {node: '>=8'} + cssstyle@4.2.1: + resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} + engines: {node: '>=18'} + csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -3824,9 +4700,16 @@ packages: resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} engines: {node: '>=12'} + d3@3.5.17: + resolution: {integrity: sha512-yFk/2idb8OHPKkbAL8QaOaqENNoMhIaSHZerk3oQsECwkObkCpJyjYwCe+OHiq6UEdhe1m8ZGARRRO3ljFjlKg==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + dargs@8.1.0: + resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} + engines: {node: '>=12'} + data-uri-to-buffer@6.0.2: resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} engines: {node: '>= 14'} @@ -3835,6 +4718,10 @@ packages: resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} engines: {node: '>=12'} + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + data-view-buffer@1.0.2: resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==} engines: {node: '>= 0.4'} @@ -3861,6 +4748,15 @@ packages: supports-color: optional: true + debug@4.3.1: + resolution: {integrity: sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.0: resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} @@ -3874,6 +4770,10 @@ packages: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} + decamelize@4.0.0: + resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} + engines: {node: '>=10'} + decimal.js-light@2.5.1: resolution: {integrity: sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==} @@ -3887,6 +4787,15 @@ packages: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} engines: {node: '>=10'} + dedent@0.4.0: + resolution: {integrity: sha512-25DJIXD6mCqYHIqI3/aBfAvFgJSY9jIx397eUQSofXbWVR4lcB21a17qQ5Bswj0Zv+3Nf06zNCyfkGyvo0AqqQ==} + + dedent@0.6.0: + resolution: {integrity: sha512-cSfRWjXJtZQeRuZGVvDrJroCR5V2UvBNUMHsPCdNYzuAG8b9V8aAy3KUcdQrGQPXs17Y+ojbPh1aOCplg9YR9g==} + + dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dedent@1.5.3: resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} peerDependencies: @@ -3895,6 +4804,14 @@ packages: babel-plugin-macros: optional: true + deep-eql@3.0.1: + resolution: {integrity: sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==} + engines: {node: '>=0.12'} + + deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + deep-equal@1.0.1: resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} @@ -3913,6 +4830,10 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-require-extensions@3.0.1: + resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} + engines: {node: '>=8'} + defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -3932,6 +4853,10 @@ packages: resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} engines: {node: '>= 14'} + del@3.0.0: + resolution: {integrity: sha512-7yjqSoVSlJzA4t/VUwazuEagGeANEKB3f/aNI//06pfKgwoCb7f6Q1gETN1sZzYaj6chTQ0AhIwDiPdfOjko4A==} + engines: {node: '>=4'} + del@4.1.1: resolution: {integrity: sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==} engines: {node: '>=6'} @@ -3959,6 +4884,9 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + des.js@1.1.0: + resolution: {integrity: sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==} + destroy@1.2.0: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} @@ -3970,6 +4898,9 @@ packages: detect-node-es@1.1.0: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} + device-specs@1.0.1: + resolution: {integrity: sha512-rxns/NDZfbdYumnn801z9uo8kWIz3Eld7Bk/F0V9zw4sZemSoD93+gxHEonLdxYulkws4iCMt7ZP8zuM8EzUSg==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -4037,6 +4968,10 @@ packages: dot-case@2.1.1: resolution: {integrity: sha512-HnM6ZlFqcajLsyudHq7LeeLDr2rFAVYtDv/hV5qchQEidSck8j9OPUsXY9KwJv/lHMtYlX4DjRQqwFYa+0r8Ug==} + dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -4064,6 +4999,9 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -4084,19 +5022,34 @@ packages: electron-to-chromium@1.5.82: resolution: {integrity: sha512-Zq16uk1hfQhyGx5GpwPAYDwddJuSGhtRhgOA2mCxANYaDT79nAeGnaXogMGng4KqLaJUVnOnuL0+TDop9nLOiA==} + elegant-spinner@1.0.1: + resolution: {integrity: sha512-B+ZM+RXvRqQaAmkMlO/oSe5nMUOaUnyfGYCEHoR8wrXsZR2mA0XVibsxV1bvTwxdRWah1PkQqso2EzhILGHtEQ==} + engines: {node: '>=0.10.0'} + elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + email-validator@2.0.4: + resolution: {integrity: sha512-gYCwo7kh5S3IDyZPLZf6hSS0MnZT8QmJFqYvbqlDZSbwdZlY6QZWxJ4i/6UhITOJ4XzyI647Bm2MXKCLqnJ4nQ==} + engines: {node: '>4.0'} + emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} + emittery@0.4.1: + resolution: {integrity: sha512-r4eRSeStEGf6M5SKdrQhhLK5bOwOBxQhIE3YSTnZE3GpKiLfnnhE+tPtrJE79+eDJgm39BM6LSoI8SCx4HbwlQ==} + engines: {node: '>=6'} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + emojilib@2.4.0: + resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} + emojis-list@3.0.0: resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} engines: {node: '>= 4'} @@ -4119,9 +5072,29 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-ci@11.1.0: + resolution: {integrity: sha512-Z8dnwSDbV1XYM9SBF2J0GcNVvmfmfh3a49qddGIROhBoVro6MZVTji15z/sJbQ2ko2ei8n988EU1wzoLU/tF+g==} + engines: {node: ^18.17 || >=20.6.1} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + envinfo@7.14.0: + resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} + engines: {node: '>=4'} + hasBin: true + + environment@1.1.0: + resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} + engines: {node: '>=18'} + error-ex@1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -4159,6 +5132,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} + es6-error@4.1.1: + resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + escalade@3.2.0: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} @@ -4202,6 +5178,12 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-config-prettier@9.0.0: + resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-config-turbo@2.4.0: resolution: {integrity: sha512-AiRdy83iwyG4+iMSxXQGUbEClxkGxSlXYH8E2a+0972ao75OWnlDBiiuLMOzDpJubR+QVGC4zonn29AIFCSbFw==} peerDependencies: @@ -4245,6 +5227,26 @@ packages: eslint-import-resolver-webpack: optional: true + eslint-plugin-import@2.28.1: + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint-plugin-import@2.31.0: resolution: {integrity: sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==} engines: {node: '>=4'} @@ -4261,6 +5263,24 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 + eslint-plugin-no-only-tests@3.1.0: + resolution: {integrity: sha512-Lf4YW/bL6Un1R6A76pRZyE1dl1vr31G/ev8UzIc/geCgFWyrKil8hVjYqWVKGB/UIGmb6Slzs9T0wNezdSVegw==} + engines: {node: '>=5.0.0'} + + eslint-plugin-prettier@5.0.0: + resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + '@types/eslint': '>=8.0.0' + eslint: '>=8.0.0' + eslint-config-prettier: '*' + prettier: '>=3.0.0' + peerDependenciesMeta: + '@types/eslint': + optional: true + eslint-config-prettier: + optional: true + eslint-plugin-react-hooks@5.1.0: resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==} engines: {node: '>=10'} @@ -4273,6 +5293,9 @@ packages: peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 + eslint-plugin-security@1.7.1: + resolution: {integrity: sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==} + eslint-plugin-turbo@2.4.0: resolution: {integrity: sha512-qCgoRi/OTc1VMxab7+sdKiV1xlkY4qjK9sM+kS7+WogrB1DxLguJSQXvk4HA13SD5VmJsq+8FYOw5q4EUk6Ixg==} peerDependencies: @@ -4295,12 +5318,21 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + hasBin: true + eslint@8.57.1: resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + esotope-hammerhead@0.6.8: + resolution: {integrity: sha512-2Zhg0c6NfrNA4QT5s4+QG5WJQtq3Se7GonNwtNwfr7sVIo/7L8rirPfh9yyloEmDA7R0yPgD10teFxhf2vWyIw==} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -4351,10 +5383,26 @@ packages: evp_bytestokey@1.0.3: resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==} + execa@3.4.0: + resolution: {integrity: sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g==} + engines: {node: ^8.12.0 || >=9.7.0} + + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + execa@9.5.2: + resolution: {integrity: sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==} + engines: {node: ^18.19.0 || >=20.5.0} + exit@0.1.2: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} @@ -4374,12 +5422,18 @@ packages: resolution: {integrity: sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==} engines: {'0': node >=0.6.0} + fast-content-type-parse@2.0.1: + resolution: {integrity: sha512-nGqtvLrj5w0naR6tDPfB4cUmYCqouzyQiz6C5y/LtcDllJdrcc6WaWW6iXyIIOErTa/XRybj28aasdn4LkVk6Q==} + fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + fast-equals@5.2.2: resolution: {integrity: sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==} engines: {node: '>=6.0.0'} @@ -4408,6 +5462,10 @@ packages: fast-uri@3.0.5: resolution: {integrity: sha512-5JnBCWpFlMo0a3ciDy/JckMzzv1U9coZrIhedq+HXxxUfDTAiS0LA8OKVao4G9BxmCVck/jtA5r3KAtRWEyD8Q==} + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + fastq@1.18.0: resolution: {integrity: sha512-QKHXPW0hD8g4UET03SdOdunzSouc9N4AuHdsX8XNcTsuz+yYFILVNIX4l9yHABMhiEI9Db0JTTIpu0wB+Y1QQw==} @@ -4417,10 +5475,18 @@ packages: fecha@4.2.3: resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + figures@2.0.0: + resolution: {integrity: sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==} + engines: {node: '>=4'} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} + figures@6.1.0: + resolution: {integrity: sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==} + engines: {node: '>=18'} + file-entry-cache@6.0.1: resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} engines: {node: ^10.12.0 || >=12.0.0} @@ -4438,6 +5504,9 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-babel-config@2.1.2: + resolution: {integrity: sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==} + find-cache-dir@3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -4446,6 +5515,18 @@ packages: resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} engines: {node: '>=14.16'} + find-up-simple@1.0.0: + resolution: {integrity: sha512-q7Us7kcjj2VMePAa02hDAF6d+MzsdsAWEwYyOpwUtlerRBkOEPBCRZrAV4XfcSN8fHAgaD0hP7miwoay6DCprw==} + engines: {node: '>=18'} + + find-up@2.1.0: + resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} + engines: {node: '>=4'} + + find-up@3.0.0: + resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} + engines: {node: '>=6'} + find-up@4.1.0: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} @@ -4458,10 +5539,22 @@ packages: resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + find-up@7.0.0: + resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} + engines: {node: '>=18'} + + find-versions@6.0.0: + resolution: {integrity: sha512-2kCCtc+JvcZ86IGAz3Z2Y0A1baIz9fL31pH/0S1IqZr9Iwnjq8izfPtrCyQKO6TLMPELLsQMre7VDqeIKCsHkA==} + engines: {node: '>=18'} + flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} + flat@5.0.2: + resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + hasBin: true + flatted@3.3.2: resolution: {integrity: sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==} @@ -4480,6 +5573,10 @@ packages: for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + foreground-child@2.0.0: + resolution: {integrity: sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==} + engines: {node: '>=8.0.0'} + foreground-child@3.3.0: resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} engines: {node: '>=14'} @@ -4488,10 +5585,18 @@ packages: resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} engines: {node: '>= 14.17'} + form-data-encoder@4.0.2: + resolution: {integrity: sha512-KQVhvhK8ZkWzxKxOr56CPulAhH3dobtuQ4+hNQ+HekH/Wp5gSOafqRAeTphQUJAIk0GBvHZgJ2ZGRWd5kphMuw==} + engines: {node: '>= 18'} + form-data@4.0.1: resolution: {integrity: sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==} engines: {node: '>= 6'} + formdata-node@6.0.3: + resolution: {integrity: sha512-8e1++BCiTzUno9v5IZ2J6bv4RU+3UKDmqWUQD0MIMVCd9AdhWkO1gw57oo1mNEX1dMq2EGI+FbWz4B92pscSQg==} + engines: {node: '>= 18'} + fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} @@ -4499,10 +5604,20 @@ packages: resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} engines: {node: '>= 0.6'} + from2@2.3.0: + resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==} + + fromentries@1.3.2: + resolution: {integrity: sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==} + fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} + fs-extra@11.3.0: + resolution: {integrity: sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==} + engines: {node: '>=14.14'} + fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -4523,6 +5638,10 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + function-timeout@1.0.2: + resolution: {integrity: sha512-939eZS4gJ3htTHAldmyyuzlrD58P03fHG49v2JfFXbV6OhvZKRC9j2yAtdHw/zrp2zXHuv05zMIy40F0ge7spA==} + engines: {node: '>=18'} + function.prototype.name@1.1.8: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} @@ -4538,6 +5657,9 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + get-intrinsic@1.2.7: resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==} engines: {node: '>= 0.4'} @@ -4546,6 +5668,9 @@ packages: resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==} engines: {node: '>=6'} + get-os-info@1.0.2: + resolution: {integrity: sha512-Nlgt85ph6OHZ4XvTcC8LMLDDFUzf7LAinYJZUwzrnc3WiO+vDEHDmNItTtzixBDLv94bZsvJGrrDRAE6uPs4MQ==} + get-own-enumerable-property-symbols@3.0.2: resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} @@ -4557,10 +5682,30 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stdin@4.0.1: + resolution: {integrity: sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==} + engines: {node: '>=0.10.0'} + + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} + get-stream@7.0.1: + resolution: {integrity: sha512-3M8C1EOFN6r8AMUhwUAACIoXZJEOufDU5+0gFFN5uNs6XYOralD2Pqkl7m046va6x77FwposWXbAhPPIOus7mQ==} + engines: {node: '>=16'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-stream@9.0.1: + resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} + engines: {node: '>=18'} + get-symbol-description@1.1.0: resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==} engines: {node: '>= 0.4'} @@ -4572,6 +5717,17 @@ packages: resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} engines: {node: '>= 14'} + getos@3.2.1: + resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} + + git-log-parser@1.2.1: + resolution: {integrity: sha512-PI+sPDvHXNPl5WNOErAK05s3j0lgwUzMN6o8cyQrDaKfT3qd7TmNJKeXX+SknI5I0QhG5fVPAEwSY4tRGDtYoQ==} + + git-raw-commits@4.0.0: + resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} + engines: {node: '>=16'} + hasBin: true + git-revision-webpack-plugin@5.0.0: resolution: {integrity: sha512-RptQN/4UKcEPkCBmRy8kLPo5i8MnF8+XfAgFYN9gbwmKLTLx4YHsQw726H+C5+sIGDixDkmGL3IxPA2gKo+u4w==} engines: {node: '>=10'} @@ -4600,6 +5756,15 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported + glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + + global-directory@4.0.1: + resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} + engines: {node: '>=18'} + globals@11.12.0: resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} engines: {node: '>=4'} @@ -4640,6 +5805,13 @@ packages: resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} engines: {node: '>=16'} + got@14.4.5: + resolution: {integrity: sha512-sq+uET8TnNKRNnjEOPJzMcxeI0irT8BBNmf+GtZcJpmhYsQM1DSKmCROUjPWKsXZ5HzwD5Cf5/RV+QD9BSTxJg==} + engines: {node: '>=20'} + + 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==} @@ -4650,6 +5822,9 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + graphlib@2.1.8: + resolution: {integrity: sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==} + gzip-size@6.0.0: resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} engines: {node: '>=10'} @@ -4686,6 +5861,10 @@ packages: resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} engines: {node: '>= 0.4'} + has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + hash-base@3.1.0: resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==} engines: {node: '>=4'} @@ -4693,6 +5872,10 @@ packages: hash.js@1.1.7: resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + hasha@5.2.2: + resolution: {integrity: sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==} + engines: {node: '>=8'} + hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -4733,12 +5916,22 @@ packages: hastscript@7.2.0: resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + header-case@1.0.1: resolution: {integrity: sha512-i0q9mkOeSuhXw6bGgiQCCBgY/jlZuV/7dZXyZ9c6LcBrqwvT8eT719E9uxE5LiZftdl+z81Ugbg/VvXV4OJOeQ==} help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + highlight-es@1.0.3: + resolution: {integrity: sha512-s/SIX6yp/5S1p8aC/NRDC1fwEb+myGIfp8/TzZz0rtAv8fzsdX7vGl3Q1TrXCsczFq8DI3CBFBCySPClfBSdbg==} + + highlight.js@10.7.3: + resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==} + hive-auth-client@0.1.5: resolution: {integrity: sha512-RN1vh2RK9vW9q8aMzyUwTNtIa/J5NX5pMeiVBDoy6ya8z9ea6fGhOWTKRoDsIrKwrPZO/SspSRCF2pwUK7eLVQ==} @@ -4751,10 +5944,26 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hook-std@3.0.0: + resolution: {integrity: sha512-jHRQzjSDzMtFy34AGj1DN+vq54WVuhSvKgrHf0OMiFQTwDD4L/qqofVEWjLOBMTn5+lCD3fPg32W9yOfnEJTTw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + hosted-git-info@7.0.2: + resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} + engines: {node: ^16.14.0 || >=18.0.0} + + hpagent@1.2.0: + resolution: {integrity: sha512-A91dYTeIB6NoXG+PxTQpCCDDnfHsW9kc06Lvpu1TEe9gnd6ZFeiBoRO9JvzEv6xK7EX97/dUE8g/vBMTqTS3CA==} + engines: {node: '>=14'} + html-encoding-sniffer@3.0.0: resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} engines: {node: '>=12'} + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + html-escaper@2.0.2: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} @@ -4790,10 +5999,21 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + http-status-codes@2.3.0: + resolution: {integrity: sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==} + http2-wrapper@2.2.1: resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} engines: {node: '>=10.19.0'} + httpntlm@1.8.13: + resolution: {integrity: sha512-2F2FDPiWT4rewPzNMg3uPhNkP3NExENlUGADRUDPQvuftuUTGW98nLZtGemCIW3G40VhWZYgkIDcQFAwZ3mf2Q==} + engines: {node: '>=10.4.0'} + + httpreq@1.1.1: + resolution: {integrity: sha512-uhSZLPPD2VXXOSN8Cni3kIsoFHaU2pT/nySEU/fHr/ePbqHYr0jeiQRmUKLEirC09SFPsdMoA7LU7UXMd/w0Kw==} + engines: {node: '>= 6.15.1'} + https-proxy-agent@5.0.1: resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} engines: {node: '>= 6'} @@ -4805,10 +6025,30 @@ packages: https@1.0.0: resolution: {integrity: sha512-4EC57ddXrkaF0x83Oj8sM6SLQHAWXw90Skqu2M4AEWENZ3F02dFJE/GARA8igO79tcgYqGrD7ae4f5L3um2lgg==} + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + human-signals@8.0.0: + resolution: {integrity: sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==} + engines: {node: '>=18.18.0'} + + humanize-duration@3.32.1: + resolution: {integrity: sha512-inh5wue5XdfObhu/IGEMiA1nUXigSGcaKNemcbLRKa7jXYGDZXr3LoT9pTIzq2hPEbld7w/qv9h+ikWGz8fL1g==} + + husky@9.0.11: + resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==} + engines: {node: '>=18'} + hasBin: true + i18next-fs-backend@2.6.0: resolution: {integrity: sha512-3ZlhNoF9yxnM8pa8bWp5120/Ob6t4lVl1l/tbLmkml/ei3ud8IWySCHt2lrY5xWRlSU5D9IV2sm5bEbGuTqwTw==} @@ -4823,6 +6063,10 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} + iconv-lite@0.5.1: + resolution: {integrity: sha512-ONHr16SQvKZNSqjQT9gy5z24Jw+uqfO02/ngBSBoqChZ+W8qXX7GPRa1RoUnzGADw8K63R1BXUMzarCVQBpY8Q==} + engines: {node: '>=0.10.0'} + iconv-lite@0.6.3: resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} engines: {node: '>=0.10.0'} @@ -4844,19 +6088,47 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-from-esm@1.3.4: + resolution: {integrity: sha512-7EyUlPFC0HOlBDpUFGfYstsU7XHxZJKAAMzCT8wZ0hMW7b+hG51LIKTDcsgtz8Pu6YC0HqRVbX+rVUtsGMUKvg==} + engines: {node: '>=16.20'} + + import-from-esm@2.0.0: + resolution: {integrity: sha512-YVt14UZCgsX1vZQ3gKjkWVdBdHQ6eu3MPU1TBgL1H5orXe2+jWD006WCPPtOuwlQm10NuzOW5WawiF1Q9veW8g==} + engines: {node: '>=18.20'} + + import-lazy@3.1.0: + resolution: {integrity: sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==} + engines: {node: '>=6'} + import-local@3.2.0: resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} engines: {node: '>=8'} hasBin: true + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} + indent-string@1.2.2: + resolution: {integrity: sha512-Z1vqf6lDC3f4N2mWqRywY6odjRatPNGDZgUr4DY9MLC14+Fp2/y+CI/RnNGlb8hD6ckscE/8DlZUwHUaiDBshg==} + engines: {node: '>=0.10.0'} + hasBin: true + indent-string@4.0.0: resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} engines: {node: '>=8'} + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + index-to-position@0.1.2: + resolution: {integrity: sha512-MWDKS3AS1bGCHLBA2VLImJz42f7bJh8wQsTGCzI3j519/CASStoDONUBVz2I/VID0MpiX3SGSnbOD2xUalbE5g==} + engines: {node: '>=18'} + inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. @@ -4867,6 +6139,10 @@ packages: ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + ini@4.1.1: + resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + inline-style-parser@0.1.1: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} @@ -4886,6 +6162,14 @@ packages: resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} engines: {node: '>=12'} + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + into-stream@7.0.0: + resolution: {integrity: sha512-2dYz766i9HprMBasCMvHMuazJ7u4WzhJwo5kb3iPSiW/iRYV6uPari3zHoqZlnuaR7V1bEiNMxikhp37rdBXbw==} + engines: {node: '>=12'} + ip-address@9.0.5: resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} engines: {node: '>= 12'} @@ -4943,6 +6227,10 @@ packages: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} + is-ci@1.2.1: + resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} + hasBin: true + is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -4958,6 +6246,18 @@ packages: is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + is-es2016-keyword@1.0.0: + resolution: {integrity: sha512-JtZWPUwjdbQ1LIo9OSZ8MdkWEve198ors27vH+RzUUvZXXZkzXCxFnlUhzWYxy5IexQSRiXVw9j2q/tHMmkVYQ==} + + is-extglob@1.0.0: + resolution: {integrity: sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==} + engines: {node: '>=0.10.0'} + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -4966,6 +6266,10 @@ packages: resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==} engines: {node: '>= 0.4'} + is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -4978,6 +6282,10 @@ packages: resolution: {integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==} engines: {node: '>= 0.4'} + is-glob@2.0.1: + resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} + engines: {node: '>=0.10.0'} + is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -5015,14 +6323,26 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} + is-path-cwd@1.0.0: + resolution: {integrity: sha512-cnS56eR9SPAscL77ik76ATVqoPARTqPIVkMDVxRaWH06zT+6+CzIroYRJ0VVvm0Z1zfAvxvz9i/D3Ppjaqt5Nw==} + engines: {node: '>=0.10.0'} + is-path-cwd@2.2.0: resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==} engines: {node: '>=6'} + is-path-in-cwd@1.0.1: + resolution: {integrity: sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==} + engines: {node: '>=0.10.0'} + is-path-in-cwd@2.1.0: resolution: {integrity: sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==} engines: {node: '>=6'} + is-path-inside@1.0.1: + resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} + engines: {node: '>=0.10.0'} + is-path-inside@2.1.0: resolution: {integrity: sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==} engines: {node: '>=6'} @@ -5031,14 +6351,27 @@ packages: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + is-plain-obj@2.1.0: + resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} + engines: {node: '>=8'} + is-plain-obj@4.1.0: resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} engines: {node: '>=12'} + is-plain-object@2.0.4: + resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} + engines: {node: '>=0.10.0'} + is-plain-object@5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} engines: {node: '>=0.10.0'} + is-podman@1.0.1: + resolution: {integrity: sha512-+5vbtF5FIg262iUa7gOIseIWTx0740RHiax7oSmJMhbfSoBIMQ/IacKKgfnGj65JGeH9lGEVQcdkDwhn1Em1mQ==} + engines: {node: '>=8'} + hasBin: true + is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -5062,6 +6395,14 @@ packages: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-stream@4.0.1: + resolution: {integrity: sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==} + engines: {node: '>=18'} + is-string@1.1.1: resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==} engines: {node: '>= 0.4'} @@ -5070,17 +6411,31 @@ packages: resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==} engines: {node: '>= 0.4'} + is-text-path@2.0.0: + resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} + engines: {node: '>=8'} + is-typed-array@1.1.15: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-upper-case@1.1.2: resolution: {integrity: sha512-GQYSJMgfeAmVwh9ixyk888l7OIhNAGKtY6QA+IrWlu9MDTCaXmeozOZ2S9Knj7bQwBO/H6J2kb+pbyTUiMNbsw==} + is-utf8@0.2.1: + resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -5097,6 +6452,10 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -5110,10 +6469,22 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + issue-parser@7.0.1: + resolution: {integrity: sha512-3YZcUUR2Wt1WsapF+S/WiA2WmlW0cWAoPccMqne7AxEBhCdFeTPjfv/Axb8V2gyCgY3nRw+ksZ3xSUX+R47iAg==} + engines: {node: ^18.17 || >=20.6.1} + istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} engines: {node: '>=8'} + istanbul-lib-hook@3.0.0: + resolution: {integrity: sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==} + engines: {node: '>=8'} + istanbul-lib-instrument@5.2.1: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} @@ -5122,6 +6493,10 @@ packages: resolution: {integrity: sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==} engines: {node: '>=10'} + istanbul-lib-processinfo@2.0.3: + resolution: {integrity: sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==} + engines: {node: '>=8'} + istanbul-lib-report@3.0.1: resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} engines: {node: '>=10'} @@ -5146,6 +6521,10 @@ packages: engines: {node: '>=10'} hasBin: true + java-properties@1.0.2: + resolution: {integrity: sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==} + engines: {node: '>= 0.6.0'} + jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5296,6 +6675,10 @@ packages: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true + jiti@2.4.2: + resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + hasBin: true + jose@5.9.6: resolution: {integrity: sha512-AMlnetc9+CV9asI19zHmrgS/WYsWUwCn2R7RzlbJWD7F9eWYUTGyBmU9o6PxngtLGOiDGPRu+Uc4fhKzbpteZQ==} @@ -5303,6 +6686,12 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-md4@0.3.2: + resolution: {integrity: sha512-/GDnfQYsltsjRswQhN9fhv3EMw2sCpUdrdxyWDOUK7eyD++r3gRhzgiQgc/x4MAv2i1iuQ4lxO5mvqM3vj4bwA==} + + js-tokens@3.0.2: + resolution: {integrity: sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -5329,6 +6718,15 @@ packages: canvas: optional: true + jsdom@24.1.0: + resolution: {integrity: sha512-6gpM7pRXCwIOKxX47cgOyvyQDN/Eh0f1MeKySBV2xGdKtqJBLj8P25eY3EVCWo2mglDDzozR2r2MW4T+JiNUZA==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + jsesc@3.0.2: resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} engines: {node: '>=6'} @@ -5342,6 +6740,9 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-better-errors@1.0.2: + resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -5369,6 +6770,10 @@ packages: jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + jsonparse@1.3.1: + resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} + engines: {'0': node >= 0.2.0} + jsonpointer@5.0.1: resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} engines: {node: '>=0.10.0'} @@ -5390,6 +6795,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} engines: {node: '>=6'} @@ -5444,6 +6853,13 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + linux-platform-info@0.0.3: + resolution: {integrity: sha512-FZhfFOIz0i4EGAvM4fQz+eayE9YzMuTx45tbygWYBttNapyiODg85BnAlQ1xnahEkvIM87T98XhXSfW8JAClHg==} + + load-json-file@4.0.0: + resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} + engines: {node: '>=4'} + loader-runner@4.3.0: resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} engines: {node: '>=6.11.5'} @@ -5452,6 +6868,14 @@ packages: resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} engines: {node: '>=8.9.0'} + locate-path@2.0.0: + resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} + engines: {node: '>=4'} + + locate-path@3.0.0: + resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==} + engines: {node: '>=6'} + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -5464,27 +6888,67 @@ packages: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash-es@4.17.21: + resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.capitalize@4.2.1: + resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + + lodash.flattendeep@4.4.0: + resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} + lodash.get@4.4.2: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} lodash.isequal@4.5.0: resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + deprecated: This package is deprecated. Use require('node:util').isDeepStrictEqual instead. lodash.isplainobject@4.0.6: resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + + lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + lodash.mergewith@4.6.2: + resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + + lodash.snakecase@4.1.1: + resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + lodash.sortby@4.7.0: resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + + lodash.uniqby@4.7.0: + resolution: {integrity: sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww==} + + lodash.upperfirst@4.3.1: + resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} @@ -5496,6 +6960,9 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} + log-update-async-hook@2.0.7: + resolution: {integrity: sha512-V9KpD1AZUBd/oiZ+/Xsgd5rRP9awhgtRiDv5Am4VQCixiDnAbXMdt/yKz41kCzYZtVbwC6YCxnWEF3zjNEwktA==} + logform@2.7.0: resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==} engines: {node: '>= 12.0.0'} @@ -5514,6 +6981,9 @@ packages: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + lower-case-first@1.0.2: resolution: {integrity: sha512-UuxaYakO7XeONbKrZf5FEgkantPf5DUqDayzP5VXZrtRPdH86s4kN47I8B3TW10S4QKiE3ziHNf3kRN//okHjA==} @@ -5527,9 +6997,16 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@2.6.3: + resolution: {integrity: sha512-qkisDmHMe8gxKujmC1BdaqgkoFlioLDCUwaFBA3lX8Ilhr3YzsasbGYaiADMjxQnj+aiZUKgGKe/BN3skMwXWw==} + lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + lru-cache@7.18.3: resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} engines: {node: '>=12'} @@ -5543,6 +7020,10 @@ packages: resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} hasBin: true + macos-release@3.3.0: + resolution: {integrity: sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -5563,6 +7044,20 @@ packages: markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} + marked-terminal@7.3.0: + resolution: {integrity: sha512-t4rBvPsHc57uE/2nJOLmMbZCQ4tgAccAED3ngXQqW6g+TxA488JzJ+FK3lQkzBQOI1mRV/r/Kq+1ZlJ4D0owQw==} + engines: {node: '>=16.0.0'} + peerDependencies: + marked: '>=1 <16' + + marked@12.0.2: + resolution: {integrity: sha512-qXUm7e/YKFoqFPYPa3Ukg9xlI5cyAtGmyEIzMfW//m6kXwCy2Ps9DYf5ioijFKQ8qyuscrHoY04iJGctu2Kg0Q==} + engines: {node: '>= 18'} + hasBin: true + + match-url-wildcard@0.0.4: + resolution: {integrity: sha512-R1XhQaamUZPWLOPtp4ig5j+3jctN+skhgRmEQTUamMzmNtRG69QEirQs0NZKLtHMR7tzWpmtnS4Eqv65DcgXUA==} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -5613,6 +7108,17 @@ packages: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} + meow@12.1.1: + resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} + engines: {node: '>=16.10'} + + meow@13.2.0: + resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} + engines: {node: '>=18'} + + merge-stream@1.0.1: + resolution: {integrity: sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==} + merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -5716,10 +7222,27 @@ packages: resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} engines: {node: '>= 0.6'} + mime@1.4.1: + resolution: {integrity: sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==} + hasBin: true + + mime@4.0.6: + resolution: {integrity: sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==} + engines: {node: '>=16'} + hasBin: true + + mimic-fn@1.2.0: + resolution: {integrity: sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==} + engines: {node: '>=4'} + mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} @@ -5760,6 +7283,14 @@ packages: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true + mocha@10.6.0: + resolution: {integrity: sha512-hxjt4+EEB0SA0ZDygSS015t65lJw/I2yRCS3Ae+SJ5FrbzrXgfYwJr96f0OvIXdj7h4lv/vLCrH3rkiuizFSvw==} + engines: {node: '>= 14.0.0'} + hasBin: true + + moment-duration-format-commonjs@1.0.1: + resolution: {integrity: sha512-KhKZRH21/+ihNRWrmdNFOyBptFi7nAWZFeFsRRpXkzgk/Yublb4fxyP0jU6EY1VDxUL/VUPdCmm/wAnpbfXdfw==} + moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -5771,6 +7302,9 @@ packages: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -5786,6 +7320,11 @@ packages: resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} engines: {node: '>=12.0.0', npm: '>=6.0.0'} + mustache@2.3.2: + resolution: {integrity: sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==} + engines: {npm: '>=1.4.0'} + hasBin: true + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} @@ -5815,6 +7354,9 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nerf-dart@1.0.0: + resolution: {integrity: sha512-EZSPZB70jiVsivaBLYDCyntd5eH8NTSMOn3rB+HxwdmKThGELLdYv8qVIMWvZEFy9w8ZZpW9h9OB32l1rGtj7g==} + netmask@2.0.2: resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} engines: {node: '>= 0.4.0'} @@ -5876,6 +7418,10 @@ packages: no-case@2.3.2: resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + node-emoji@2.2.0: + resolution: {integrity: sha512-Z3lTE9pLaJF47NyMhd4ww1yFTAP8YhYI8SleJiHzM46Fgpm5cnNzSl9XfzFNqbaz+VlJrIj3fXQ4DeN1Rjm6cw==} + engines: {node: '>=18'} + node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -5892,9 +7438,17 @@ packages: resolution: {integrity: sha512-Cov028YhBZ5aB7MdMWJEmwyBig43aGL5WT4vdoB28Oitau1zZAcHUn8Sgfk9HM33TqhtLJ9PlM/O0Mv+QpV/4Q==} engines: {node: '>=8.9.4'} + node-preload@0.2.1: + resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} + engines: {node: '>=8'} + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + 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'} @@ -5914,12 +7468,99 @@ packages: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + npm-run-path@6.0.0: + resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} + engines: {node: '>=18'} + + npm@10.9.2: + resolution: {integrity: sha512-iriPEPIkoMYUy3F6f3wwSZAU93E0Eg6cHwIR6jzzOXWSy+SD/rOODEs74cVONHKSx2obXtuUoyidVEhISrisgQ==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + bundledDependencies: + - '@isaacs/string-locale-compare' + - '@npmcli/arborist' + - '@npmcli/config' + - '@npmcli/fs' + - '@npmcli/map-workspaces' + - '@npmcli/package-json' + - '@npmcli/promise-spawn' + - '@npmcli/redact' + - '@npmcli/run-script' + - '@sigstore/tuf' + - abbrev + - archy + - cacache + - chalk + - ci-info + - cli-columns + - fastest-levenshtein + - fs-minipass + - glob + - graceful-fs + - hosted-git-info + - ini + - init-package-json + - is-cidr + - json-parse-even-better-errors + - libnpmaccess + - libnpmdiff + - libnpmexec + - libnpmfund + - libnpmhook + - libnpmorg + - libnpmpack + - libnpmpublish + - libnpmsearch + - libnpmteam + - libnpmversion + - make-fetch-happen + - minimatch + - minipass + - minipass-pipeline + - ms + - node-gyp + - nopt + - normalize-package-data + - npm-audit-report + - npm-install-checks + - npm-package-arg + - npm-pick-manifest + - npm-profile + - npm-registry-fetch + - npm-user-validate + - p-map + - pacote + - parse-conflict-json + - proc-log + - qrcode-terminal + - read + - semver + - spdx-expression-parse + - ssri + - supports-color + - tar + - text-table + - tiny-relative-date + - treeverse + - validate-npm-package-name + - which + - write-file-atomic + nth-check@2.1.1: resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} nwsapi@2.2.16: resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + nyc@17.0.0: + resolution: {integrity: sha512-ISp44nqNCaPugLLGGfknzQwSwt10SSS5IMoPR7GLoMAyS18Iw5js8U7ga2VF9lYuMZ42gOHr3UddZw4WZltxKg==} + engines: {node: '>=18'} + hasBin: true + object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -5985,10 +7626,18 @@ packages: one-time@1.0.0: resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + onetime@2.0.1: + resolution: {integrity: sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==} + engines: {node: '>=4'} + onetime@5.1.2: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + only@0.0.2: resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} @@ -6008,6 +7657,9 @@ packages: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} engines: {node: '>=10'} + os-family@1.1.0: + resolution: {integrity: sha512-E3Orl5pvDJXnVmpaAA2TeNNpNhTMl4o5HghuWhOivBjEiTnJSrMYSa5uZMek1lBEvu8kKEsa2YgVcGFVDqX/9w==} + os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -6028,6 +7680,30 @@ packages: resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} engines: {node: '>=12.20'} + p-cancelable@4.0.1: + resolution: {integrity: sha512-wBowNApzd45EIKdO1LaU+LrMBwAcjfPaYtVzV3lmfM3gf8Z4CHZsiIqlM8TZZ8okYvh5A1cP6gTfCRQtwUpaUg==} + engines: {node: '>=14.16'} + + p-each-series@3.0.0: + resolution: {integrity: sha512-lastgtAdoH9YaLyDa5i5z64q+kzOcQHsQ5SsZJD3q0VEyI8mq872S3geuNbRUQLVAE9siMfgKrpj7MloKFHruw==} + engines: {node: '>=12'} + + p-filter@4.1.0: + resolution: {integrity: sha512-37/tPdZ3oJwHaS3gNJdenCDB3Tz26i9sjhnguBtvN0vYlRIiDNnvTWkuh+0hETV9rLPdJ3rlL3yVOYPIAnM8rw==} + engines: {node: '>=18'} + + p-finally@2.0.1: + resolution: {integrity: sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==} + engines: {node: '>=8'} + + p-is-promise@3.0.0: + resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==} + engines: {node: '>=8'} + + p-limit@1.3.0: + resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} + engines: {node: '>=4'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -6040,6 +7716,14 @@ packages: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-locate@2.0.0: + resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} + engines: {node: '>=4'} + + p-locate@3.0.0: + resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} + engines: {node: '>=6'} + p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} @@ -6052,6 +7736,10 @@ packages: resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + p-map@1.2.0: + resolution: {integrity: sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==} + engines: {node: '>=4'} + p-map@2.1.0: resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} engines: {node: '>=6'} @@ -6060,6 +7748,18 @@ packages: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} + p-map@7.0.3: + resolution: {integrity: sha512-VkndIv2fIB99swvQoA65bm+fsmt6UNdGeIB0oxBs+WhAhdh08QA04JXpI7rbB9r08/nkbysKoya9rtDERYOYMA==} + engines: {node: '>=18'} + + p-reduce@3.0.0: + resolution: {integrity: sha512-xsrIUgI0Kn6iyDYm9StOpOeK29XM1aboGji26+QEortiFST1hGZaUQOLhtEbqHErPpGW/aSz6allwK2qcptp0Q==} + engines: {node: '>=12'} + + p-try@1.0.0: + resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} + engines: {node: '>=4'} + p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} @@ -6072,6 +7772,10 @@ packages: resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} engines: {node: '>= 14'} + package-hash@4.0.0: + resolution: {integrity: sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==} + engines: {node: '>=8'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -6088,16 +7792,47 @@ packages: parse-entities@4.0.2: resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==} + parse-json@4.0.0: + resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} + engines: {node: '>=4'} + parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} + parse-json@8.1.0: + resolution: {integrity: sha512-rum1bPifK5SSar35Z6EKZuYPJx85pkNaFrxBK3mwdfSJ1/WKbYrjoW/zTPSjRRamfmVX1ACBIdFAO0VRErW/EA==} + engines: {node: '>=18'} + + parse-ms@4.0.0: + resolution: {integrity: sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==} + engines: {node: '>=18'} + parse-numeric-range@1.3.0: resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} + parse-path@7.0.0: + resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + parse-srcset@1.0.2: resolution: {integrity: sha512-/2qh0lav6CmI15FzA3i/2Bzk2zCgQhGMkvhOhKNcBVQ1ldgpbfiNTVslmooUmWJcADi1f1kIeynbDRVzNlfR6Q==} + parse-url@9.2.0: + resolution: {integrity: sha512-bCgsFI+GeGWPAvAiUv63ZorMeif3/U0zaXABGJbOWt5OH2KCaPHF6S+0ok4aqM9RuIPGyZdx9tR9l13PsW4AYQ==} + engines: {node: '>=14.13.0'} + + parse5-htmlparser2-tree-adapter@6.0.1: + resolution: {integrity: sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==} + + parse5@1.5.1: + resolution: {integrity: sha512-w2jx/0tJzvgKwZa58sj2vAYq/S/K1QJfIB3cWYea/Iu1scFPDQQ3IQiVZTHWtRBwAjv2Yd7S/xeZf3XqLDb3bA==} + + parse5@2.2.3: + resolution: {integrity: sha512-yJQdbcT+hCt6HD+BuuUvjHUdNwerQIKSJSm7tXjtp6oIH5Mxbzlt/VIIeWxblsgcDt1+E7kxPeilD5McWswStA==} + + parse5@5.1.1: + resolution: {integrity: sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==} + parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} @@ -6114,6 +7849,10 @@ packages: path-case@2.1.1: resolution: {integrity: sha512-Ou0N05MioItesaLr9q8TtHVWmJ6fxWdqKB2RohFmNWVyJ+2zeKIeDNWAN6B/Pe7wpzWChhZX6nONYmOnMeJQ/Q==} + path-exists@3.0.0: + resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} + engines: {node: '>=4'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -6137,6 +7876,10 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -6155,6 +7898,9 @@ packages: resolution: {integrity: sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==} engines: {node: '>=12'} + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + picocolors@1.0.1: resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} @@ -6169,14 +7915,26 @@ packages: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} + pify@3.0.0: + resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} + engines: {node: '>=4'} + pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} + pinkie-promise@1.0.0: + resolution: {integrity: sha512-5mvtVNse2Ml9zpFKkWBpGsTPwm3DKhs+c95prO/F6E7d6DN0FPqxs6LONpLNpyD7Iheb7QN4BbUoKJgo+DnkQA==} + engines: {node: '>=0.10.0'} + pinkie-promise@2.0.1: resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==} engines: {node: '>=0.10.0'} + pinkie@1.0.0: + resolution: {integrity: sha512-VFVaU1ysKakao68ktZm76PIdOhvEfoNNRaGkyLln9Os7r0/MCxqHjHyBM7dT3pgTiBybqiPtpqKfpENwdBp50Q==} + engines: {node: '>=0.10.0'} + pinkie@2.0.4: resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==} engines: {node: '>=0.10.0'} @@ -6199,6 +7957,10 @@ packages: resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} engines: {node: '>= 6'} + pkg-conf@2.1.0: + resolution: {integrity: sha512-C+VUP+8jis7EsQZIhDYmS5qlNtjv2yP4SNtjXK9AP1ZcTRlnSfuumaTnRfYZnYgUUYVIKqL0fRvmUGDV2fmp6g==} + engines: {node: '>=4'} + pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} @@ -6207,6 +7969,10 @@ packages: resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} engines: {node: '>=14.16'} + pkg-up@3.1.0: + resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==} + engines: {node: '>=8'} + playwright-core@1.49.1: resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==} engines: {node: '>=18'} @@ -6223,6 +7989,10 @@ packages: engines: {node: '>=18'} hasBin: true + pngjs@3.4.0: + resolution: {integrity: sha512-NCrCHhWmnQklfH4MtJMRjZ2a8c80qXeMlQMv2uVp9ISJMTt562SbGd6n2oq0PaPgKm7Z6pL9E2UlLIhC+SHL3w==} + engines: {node: '>=4.0.0'} + pngjs@5.0.0: resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==} engines: {node: '>=10.13.0'} @@ -6292,6 +8062,10 @@ packages: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + prettier-plugin-tailwindcss@0.3.0: resolution: {integrity: sha512-009/Xqdy7UmkcTBpwlq7jsViDqXAYSOMLDrHAdTMlVZOrKfM2o9Ci7EMWTMZ7SkKBFTG04UM9F9iM2+4i6boDA==} engines: {node: '>=12.17.0'} @@ -6396,6 +8170,11 @@ packages: prettier-plugin-svelte: optional: true + prettier@3.3.2: + resolution: {integrity: sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==} + engines: {node: '>=14'} + hasBin: true + prettier@3.4.2: resolution: {integrity: sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==} engines: {node: '>=14'} @@ -6413,9 +8192,21 @@ packages: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-hrtime@1.0.3: + resolution: {integrity: sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==} + engines: {node: '>= 0.8'} + + pretty-ms@9.2.0: + resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==} + engines: {node: '>=18'} + process-nextick-args@2.0.1: resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + process-on-spawn@1.1.0: + resolution: {integrity: sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==} + engines: {node: '>=8'} + process-warning@3.0.0: resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} @@ -6423,6 +8214,9 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} + promisify-event@1.0.0: + resolution: {integrity: sha512-mshw5LiFmdtphcuUGKyd3t6zmmgIVxrdZ8v4R1INAXHvMemUsDCqIUeq5QUIqqDfed8ZZ6uhov1PqhrdBvHOIA==} + prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -6433,6 +8227,12 @@ packages: property-information@6.5.0: resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + protocols@2.0.1: + resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + proxy-agent@6.5.0: resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} @@ -6453,6 +8253,10 @@ packages: pure-rand@6.1.0: resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + qrcode-terminal@0.10.0: + resolution: {integrity: sha512-ZvWjbAj4MWAj6bnCc9CnculsXnJr7eoKsvH/8rVpZbqYxP2z05HNQa43ZVwe/dVRcFxgfFHE2CkUqn0sCyLfHw==} + hasBin: true + qrcode@1.5.4: resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==} engines: {node: '>=10.13.0'} @@ -6491,6 +8295,11 @@ packages: peerDependencies: react: ^16.14.0 + react-dom@17.0.2: + resolution: {integrity: sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==} + peerDependencies: + react: 17.0.2 + react-dom@18.3.0: resolution: {integrity: sha512-zaKdLBftQJnvb7FtDIpZtsAIb2MZU087RM8bRDZU8LVCCFYjPTsDZJNFUWPcVz3HFSN1n/caxi0ca4B/aaVQGQ==} peerDependencies: @@ -6623,6 +8432,10 @@ packages: resolution: {integrity: sha512-0X2CImDkJGApiAlcf0ODKIneSwBPhqJawOa5wCtKbu7ZECrmS26NvtSILynQ66cgkT/RJ4LidJOc3bUESwmU8g==} engines: {node: '>=0.10.0'} + react@17.0.2: + resolution: {integrity: sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==} + engines: {node: '>=0.10.0'} + react@18.3.0: resolution: {integrity: sha512-RPutkJftSAldDibyrjuku7q11d3oy6wKOyPe5K1HA/HwwrXcEqBdHsLypkC2FFYjP7bPUa6gbzSBhw4sY2JcDg==} engines: {node: '>=0.10.0'} @@ -6630,6 +8443,17 @@ packages: read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + read-file-relative@1.2.0: + resolution: {integrity: sha512-lwZUlN2tQyPa62/XmVtX1MeNLVutlRWwqvclWU8YpOCgjKdhg2zyNkeFjy7Rnjo3txhKCy5FGgAi+vx59gvkYg==} + + read-package-up@11.0.0: + resolution: {integrity: sha512-MbgfoNPANMdb4oRBNg5eqLbB2t2r+o5Ua1pNt8BqGp4I0FJZhuVSOj3PaBPni4azWuSzEdNn2evevzVmEk1ohQ==} + engines: {node: '>=18'} + + read-pkg@9.0.1: + resolution: {integrity: sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA==} + engines: {node: '>=18'} + readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -6659,6 +8483,10 @@ packages: react: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + redent@3.0.0: resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} engines: {node: '>=8'} @@ -6686,6 +8514,10 @@ packages: regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -6697,6 +8529,10 @@ packages: registry-auth-token@3.3.2: resolution: {integrity: sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==} + registry-auth-token@5.0.3: + resolution: {integrity: sha512-1bpc9IyC+e+CNFRaWyn77tk4xGG4PPUyfakSmA6F6cvUDjrm58dfyJ3II+9yb10EDkHoy1LaPSmHaWLOH3m6HA==} + engines: {node: '>=14'} + registry-url@3.1.0: resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} engines: {node: '>=0.10.0'} @@ -6741,6 +8577,10 @@ packages: rehype@12.0.1: resolution: {integrity: sha512-ey6kAqwLM3X6QnMDILJthGvG1m1ULROS9NT4uG9IDCuv08SFyLlreSuvOa//DgEvbXx62DS6elGVqusWhRUbgw==} + release-zalgo@1.0.0: + resolution: {integrity: sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==} + engines: {node: '>=4'} + remark-gfm@3.0.1: resolution: {integrity: sha512-lEFDoi2PICJyNrACFOfDD3JlLkuSbOa5Wd8EPt06HUdptv8Gn0bxYTdbU/XXQ3swAPkEaGxxPN9cbnMHvVu1Ig==} @@ -6758,8 +8598,16 @@ packages: remove-accents@0.5.0: resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + repeating@1.1.3: + resolution: {integrity: sha512-Nh30JLeMHdoI+AsQ5eblhZ7YlTsM9wiJQe/AHIunlK3KWzvXhXb36IJ7K1IOeRjIOtzMjdUHjwXUFxKJoPTSOg==} + engines: {node: '>=0.10.0'} + hasBin: true + + replicator@1.0.5: + resolution: {integrity: sha512-saxS4y7NFkLMa92BR4bPHR41GD+f/qoDAwD2xZmN+MpDXgibkxwLO2qk7dCHYtskSkd/bWS8Jy6kC5MZUkg1tw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} require-from-string@2.0.2: @@ -6772,13 +8620,24 @@ packages: requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + reselect@4.1.8: + resolution: {integrity: sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==} + resolve-alpn@1.2.1: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolve-cwd@1.0.0: + resolution: {integrity: sha512-ac27EnKWWlc2yQ/5GCoCGecqVJ9MSmgiwvUYOS+9A+M0dn1FdP5mnsDZ9gwx+lAvh/d7f4RFn4jLfggRRYxPxw==} + engines: {node: '>=0.10.0'} + resolve-cwd@3.0.0: resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} engines: {node: '>=8'} + resolve-from@2.0.0: + resolution: {integrity: sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -6839,6 +8698,12 @@ packages: engines: {node: '>=10.0.0'} hasBin: true + rrweb-cssom@0.7.1: + resolution: {integrity: sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==} + + rrweb-cssom@0.8.0: + resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -6875,6 +8740,9 @@ packages: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} + safe-regex@2.1.1: + resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==} + safe-stable-stringify@2.5.0: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} @@ -6882,6 +8750,9 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + sanitize-filename@1.6.3: + resolution: {integrity: sha512-y/52Mcy7aw3gRm7IrcGDFx/bCk4AhRh2eI9luHOQM86nZsqwiRkkq2GekHXBBD+SmPidc8i2PqtYZl+pWJ8Oeg==} + sanitize-html@2.13.0: resolution: {integrity: sha512-Xff91Z+4Mz5QiNSLdLWwjgBDm5b1RU6xBT0+12rapjiaR7SwfRdjw8f+6Rir2MXKLrDicRFHdb51hGOAxmsUIA==} @@ -6895,6 +8766,9 @@ packages: scheduler@0.19.1: resolution: {integrity: sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==} + scheduler@0.20.2: + resolution: {integrity: sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -6923,6 +8797,19 @@ packages: secure-random@1.1.2: resolution: {integrity: sha512-H2bdSKERKdBV1SwoqYm6C0y+9EA94v6SUBOWO8kDndc4NoUih7Dv6Tsgma7zO1lv27wIvjlD0ZpMQk7um5dheQ==} + semantic-release@24.0.0: + resolution: {integrity: sha512-v46CRPw+9eI3ZuYGF2oAjqPqsfbnfFTwLBgQsv/lch4goD09ytwOTESMN4QIrx/wPLxUGey60/NMx+ANQtWRsA==} + engines: {node: '>=20.8.1'} + hasBin: true + + semver-diff@4.0.0: + resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} + engines: {node: '>=12'} + + semver-regex@4.0.5: + resolution: {integrity: sha512-hunMQrEy1T6Jr2uEVjrAIqjwWcQTgOAcIM52C8MY1EZSD3DDNft04XzvYKPqjED65bNVVko0YI38nYeEHCX3yw==} + engines: {node: '>=12'} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -6931,6 +8818,11 @@ packages: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true + semver@7.5.3: + resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==} + engines: {node: '>=10'} + hasBin: true + semver@7.6.2: resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} engines: {node: '>=10'} @@ -6953,6 +8845,9 @@ packages: set-blocking@2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + set-cookie-parser@2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -6979,6 +8874,10 @@ packages: resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} hasBin: true + shallow-clone@3.0.1: + resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} + engines: {node: '>=8'} + shallowequal@1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -7021,6 +8920,10 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + signale@1.4.0: + resolution: {integrity: sha512-iuh+gPf28RkltuJC7W5MRi6XAjTDCAPC/prJUpQoG4vIP3MJZ+GTydVnodXA7pwvTKb2cA0m9OFZW/cdWy/I/w==} + engines: {node: '>=6'} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -7040,6 +8943,10 @@ packages: sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + skin-tone@2.0.0: + resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} + engines: {node: '>=8'} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -7087,6 +8994,10 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + source-map@0.8.0-beta.0: resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} engines: {node: '>= 8'} @@ -7098,10 +9009,32 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + spawn-error-forwarder@1.0.0: + resolution: {integrity: sha512-gRjMgK5uFjbCvdibeGJuy3I5OYz6VLoVdsOJdA6wV0WlfQVLFueoqMxwwYD9RODdgb6oUIvlRlsyFSiQkMKu0g==} + + spawn-wrap@2.0.0: + resolution: {integrity: sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==} + engines: {node: '>=8'} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.21: + resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + speakingurl@14.0.1: resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} engines: {node: '>=0.10.0'} + split2@1.0.0: + resolution: {integrity: sha512-NKywug4u4pX/AZBB1FCPzZ6/7O+Xhz1qMVbzTvvKvikjO99oPN87SkK08mEY9P63/5lWjK+wgOOgApnTg5r6qg==} + split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} @@ -7122,6 +9055,9 @@ packages: resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} engines: {node: '>=10'} + stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + statuses@1.5.0: resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} engines: {node: '>= 0.6'} @@ -7134,6 +9070,9 @@ packages: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} + stream-combiner2@1.1.1: + resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} + streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} @@ -7194,6 +9133,10 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} + strip-bom@2.0.0: + resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} + engines: {node: '>=0.10.0'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -7210,6 +9153,14 @@ packages: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-final-newline@4.0.0: + resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} + engines: {node: '>=18'} + strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -7253,6 +9204,10 @@ packages: engines: {node: '>=16 || 14 >=14.17'} hasBin: true + super-regex@1.0.0: + resolution: {integrity: sha512-CY8u7DtbvucKuquCmOFEKhr9Besln7n9uN8eFbwcoGYWXOMW07u2o8njWaiXt11ylS3qoGF55pILjRmPlbodyg==} + engines: {node: '>=18'} + superjson@1.13.3: resolution: {integrity: sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==} engines: {node: '>=10'} @@ -7269,6 +9224,10 @@ packages: resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} engines: {node: '>=10'} + supports-hyperlinks@3.2.0: + resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==} + engines: {node: '>=14.18'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -7279,6 +9238,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + synckit@0.8.8: + resolution: {integrity: sha512-HwOKAP7Wc5aRGYdKH+dw0PRRpbO841v2DENBtjnR5HFWoiNByAl7vrx3p0G/rCyYXQsrxqtX48TImFtPcIHSpQ==} + engines: {node: ^14.18.0 || >=16.0.0} + tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} @@ -7300,10 +9263,18 @@ packages: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} engines: {node: '>=8'} + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + tempy@0.6.0: resolution: {integrity: sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==} engines: {node: '>=10'} + tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + terser-webpack-plugin@5.3.11: resolution: {integrity: sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==} engines: {node: '>= 10.13.0'} @@ -7329,6 +9300,49 @@ packages: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} + testcafe-browser-tools@2.0.26: + resolution: {integrity: sha512-nTKSJhBzn9BmnOs0xVzXMu8dN2Gu13Ca3x3SJr/zF6ZdKjXO82JlbHu55dt5MFoWjzAQmwlqBkSxPaYicsTgUw==} + engines: {node: '>= 0.10'} + + testcafe-hammerhead@31.7.2: + resolution: {integrity: sha512-wjZ3Y4fXnew6WaoMhD7jTe/zrzSYJMLZulX+/pXS6xed9meUx7zzCSc5epPJEW8Xy3Zo09n7w+m7+2SDej0/Iw==} + engines: {node: '>=14.0.0'} + + testcafe-legacy-api@5.1.8: + resolution: {integrity: sha512-Jp/8xPQ+tjr2iS569Og8fFRaSx/7h/N/t6DVzhWpVNO3D5AtPkGmSjCAABh7tHkUwrKfBI7sLuVaxekiT5PWTA==} + + testcafe-reporter-json@2.2.0: + resolution: {integrity: sha512-wfpNaZgGP2WoqdmnIXOyxcpwSzdH1HvzXSN397lJkXOrQrwhuGUThPDvyzPnZqxZSzXdDUvIPJm55tCMWbfymQ==} + engines: {node: '>=8.0.0'} + + testcafe-reporter-list@2.2.0: + resolution: {integrity: sha512-+6Q2CC+2B90OYED2Yx6GoBIMUYd5tADNUbOHu3Hgdd3qskzjBdKwpdDt0b7w0w7oYDO1/Uu4HDBTDud3lWpD4Q==} + + testcafe-reporter-minimal@2.2.0: + resolution: {integrity: sha512-iUSWI+Z+kVUAsGegMmEXKDiMPZHDxq+smo4utWwc3wI3Tk6jT8PbNvsROQAjwkMKDmnpo6To5vtyvzvK+zKGXA==} + + testcafe-reporter-spec@2.2.0: + resolution: {integrity: sha512-4jUN75Y7eaHQfSjiCLBXt/TvJMW76kBaZGC74sq03FJNBLoo8ibkEFzfjDJzNDCRYo+P7FjCx3vxGrzgfQU26w==} + + testcafe-reporter-xunit@2.2.3: + resolution: {integrity: sha512-aGyc+MZPsTNwd9SeKJSjFNwEZfILzFnObzOImaDbsf57disTQfEY+9japXWav/Ef5Cv04UEW24bTFl2Q4f8xwg==} + + testcafe-safe-storage@1.1.6: + resolution: {integrity: sha512-WFm1UcmO3uZs+uW8lYtBBJpnrvgTKkMQMKG9BvTEKbjeqhonEXVTxOkGEs3DM1ZB/ylPuwh7Jux7qUtjcM/D2Q==} + deprecated: The testcafe-safe-storage package has reached end-of-life and will not receive further updates. + + testcafe-selector-generator@0.1.0: + resolution: {integrity: sha512-MTw+RigHsEYmFgzUFNErDxui1nTYUk6nm2bmfacQiKPdhJ9AHW/wue4J/l44mhN8x3E8NgOUkHHOI+1TDFXiLQ==} + + testcafe@3.6.2: + resolution: {integrity: sha512-y7PGzuSQt82iSJNYkN7/78PsviyFZOSQDYkHXb8UFj7BKCgrLONxZ+WZ5uk5tb1tHU/sKTHkWTwVJHkGXIamVg==} + engines: {node: '>=16.0.0'} + hasBin: true + + text-extensions@2.4.0: + resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} + engines: {node: '>=8'} + text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} @@ -7345,21 +9359,39 @@ packages: thread-stream@2.7.0: resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + time-limit-promise@1.0.4: + resolution: {integrity: sha512-FLHDDsIDducw7MBcRWlFtW2Tm50DoKOSFf0Nzx17qwXj8REXCte0eUkHrJl9QU3Bl9arG3XNYX0PcHpZ9xyuLw==} + engines: {node: '>= 0.12'} + + time-span@5.1.0: + resolution: {integrity: sha512-75voc/9G4rDIJleOo4jPvN4/YC4GRZrY8yy1uU4lwrB3XEQbWve8zXoO5No4eFrGcTAMYyoY67p8jRQdtA1HbA==} + engines: {node: '>=12'} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} tinycolor2@1.6.0: resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinygradient@1.1.5: resolution: {integrity: sha512-8nIfc2vgQ4TeLnk2lFj4tRLvvJwEfQuabdsmvDdQPT0xlk9TaNtpGd6nNRxXoK6vQhN6RSzj+Cnp5tTQmpxmbw==} title-case@2.1.1: resolution: {integrity: sha512-EkJoZ2O3zdCz3zJsYCsxyq2OC5hrxR9mfdd5I+w8h/tmFfeOxJ+vvkxsKxdmN0WtS9zLdHEgfgVOiMVgv+Po4Q==} + tmp@0.0.28: + resolution: {integrity: sha512-c2mmfiBmND6SOVxzogm1oda0OJ1HZVIk/5n26N59dDTh80MUeavpiCls4PGAdkX1PFkKokLpcf7prSjCeXLsJg==} + engines: {node: '>=0.4.0'} + tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -7379,6 +9411,10 @@ packages: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} + tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + tough-cookie@4.1.4: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} @@ -7393,6 +9429,18 @@ packages: resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} engines: {node: '>=12'} + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + traverse@0.6.8: + resolution: {integrity: sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==} + engines: {node: '>= 0.4'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + trim-lines@3.0.1: resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} @@ -7403,6 +9451,15 @@ packages: trough@2.2.0: resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + truncate-utf8-bytes@1.0.2: + resolution: {integrity: sha512-95Pu1QXQvruGEhv62XCMO3Mm90GscOCClvrIUwCM0PYOXK3kaF3l3sIHxx71ThJfcbM2O5Au6SO3AWCSEfW4mQ==} + + ts-api-utils@1.4.3: + resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + ts-api-utils@2.0.0: resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==} engines: {node: '>=18.12'} @@ -7416,6 +9473,13 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + ts-loader@9.5.2: + resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + ts-node@10.9.2: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true @@ -7446,6 +9510,9 @@ packages: resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} engines: {node: '>=0.6.x'} + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + turbo-darwin-64@2.3.3: resolution: {integrity: sha512-bxX82xe6du/3rPmm4aCC5RdEilIN99VUld4HkFQuw+mvFg6darNBuQxyWSHZTtc25XgYjQrjsV05888w1grpaA==} cpu: [x64] @@ -7504,6 +9571,22 @@ packages: resolution: {integrity: sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw==} engines: {node: '>=6'} + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + type-fest@4.33.0: + resolution: {integrity: sha512-s6zVrxuyKbbAsSAD5ZPTB77q4YIdRctkTbJ2/Dqlinwz+8ooH2gd+YA7VA6Pa93KML9GockVvoxjZ2vHP+mu8g==} + engines: {node: '>=16'} + type-is@1.6.18: resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} engines: {node: '>= 0.6'} @@ -7524,15 +9607,38 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + typescript-chained-error@1.6.0: resolution: {integrity: sha512-DUH9Cf8AggyReFexCoVYofKqkLp95sRNZRMa7kQL4xpZd+eB6bmgD0YwD37aDwjupFjfCyYjkC0JGT/zc9JG8w==} engines: {node: '>=12'} + typescript-eslint@7.15.0: + resolution: {integrity: sha512-Ta40FhMXBCwHura4X4fncaCVkVcnJ9jnOq5+Lp4lN8F4DzHZtOwZdRvVBiNUGznUDHPwdGnrnwxmUOU2fFQqFA==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + typescript@4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + engines: {node: '>=4.2.0'} + hasBin: true + typescript@5.3.3: resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} engines: {node: '>=14.17'} hasBin: true + typescript@5.5.3: + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} + engines: {node: '>=14.17'} + hasBin: true + uglify-js@3.19.3: resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} @@ -7548,6 +9654,9 @@ packages: uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} + underscore@1.12.1: + resolution: {integrity: sha512-hEQt0+ZLDVUMhebKxL4x1BTtDY7bavVofhZ9KZ4aI26X9SRaE+Y3m83XUL1UP2jn8ynjndwCCpEHdUG+9pP1Tw==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -7555,6 +9664,10 @@ packages: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} engines: {node: '>=4'} + unicode-emoji-modifier-base@1.0.0: + resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} + engines: {node: '>=4'} + unicode-match-property-ecmascript@2.0.0: resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} engines: {node: '>=4'} @@ -7571,6 +9684,10 @@ packages: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} + unicorn-magic@0.3.0: + resolution: {integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==} + engines: {node: '>=18'} + unified@10.1.2: resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} @@ -7578,6 +9695,10 @@ packages: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + unist-util-filter@4.0.1: resolution: {integrity: sha512-RynicUM/vbOSTSiUK+BnaK9XMfmQUh6gyi7L6taNgc7FIf84GukXVV3ucGzEN/PhUUkdP5hb1MmXc+3cvPUm5Q==} @@ -7599,6 +9720,9 @@ packages: unist-util-visit@4.1.2: resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + universal-user-agent@7.0.2: + resolution: {integrity: sha512-0JCqzSKnStlRRQfCdowvqy3cy0Dvtlb8xecj/H8JFZuCze4rwjPZQOgvFvn0Ws/usCHQFGpyr+pB9adaGwXn4Q==} + universalify@0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} @@ -7615,6 +9739,9 @@ packages: resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} engines: {node: '>= 0.8'} + unquote@1.1.1: + resolution: {integrity: sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==} + upath@1.2.0: resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} engines: {node: '>=4'} @@ -7637,9 +9764,20 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-join@4.0.1: + resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} + + url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + url-parse@1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + url-to-options@2.0.0: + resolution: {integrity: sha512-mfONnc9dqO0J41wUh/El+plDskrIJRcyLcx6WjEGYW2K11RnjPDAgeoNFCallADaYJfcWIvAlYyZPBw02AbfIQ==} + engines: {node: '>=8'} + use-callback-ref@1.3.3: resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} engines: {node: '>=10'} @@ -7671,9 +9809,20 @@ packages: peerDependencies: react: ^16.8.0 || ^17 || ^18 + utf8-byte-length@1.0.5: + resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==} + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + uuid@10.0.0: + resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + hasBin: true + + uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true @@ -7694,6 +9843,9 @@ packages: resolution: {integrity: sha512-sgECfZthyaCKW10N0fm27cg8HYTFK5qMWgypqkXMQ4Wbl/zZKx7xZICgcoxIIE+WFAP/MBL2EFwC/YvLxw3Zeg==} engines: {node: '>=0.10.0'} + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + validate-npm-package-name@5.0.1: resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -7733,6 +9885,10 @@ packages: resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} engines: {node: '>=14'} + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} @@ -7761,6 +9917,27 @@ packages: engines: {node: '>= 10.13.0'} hasBin: true + webpack-cli@5.1.4: + resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} + engines: {node: '>=14.15.0'} + hasBin: true + peerDependencies: + '@webpack-cli/generators': '*' + webpack: 5.x.x + webpack-bundle-analyzer: '*' + webpack-dev-server: '*' + peerDependenciesMeta: + '@webpack-cli/generators': + optional: true + webpack-bundle-analyzer: + optional: true + webpack-dev-server: + optional: true + + webpack-merge@5.10.0: + resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} + engines: {node: '>=10.0.0'} + webpack-sources@1.4.3: resolution: {integrity: sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==} @@ -7768,6 +9945,20 @@ packages: resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} engines: {node: '>=10.13.0'} + webpack-visualizer-plugin2@1.1.0: + resolution: {integrity: sha512-pB2Z9a12m+LwjrfptyR4ReEPc0llOjsb2lXVLEJ4yOnRCBtLeWW+TZrZihUZhJDSW9tc60UXnj9/orgyagLOkg==} + engines: {npm: '>=5.0.0'} + + webpack@5.92.1: + resolution: {integrity: sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + webpack@5.97.1: resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} engines: {node: '>=10.13.0'} @@ -7782,6 +9973,10 @@ packages: resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} engines: {node: '>=12'} + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + whatwg-fetch@3.6.20: resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==} @@ -7789,10 +9984,18 @@ packages: resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} engines: {node: '>=12'} + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + whatwg-url@11.0.0: resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} engines: {node: '>=12'} + whatwg-url@14.1.0: + resolution: {integrity: sha512-jlf/foYIKywAt3x/XWKZ/3rz8OSJPiWktjmk891alJUEjiVxKX9LEO92qH3hv4aJ0mN3MWPvGMCy8jQi95xK4w==} + engines: {node: '>=18'} + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -7814,6 +10017,9 @@ packages: which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + which-promise@1.0.0: + resolution: {integrity: sha512-15ahjtDr3H+RBtTrvBcKhOFhIEiN3RZSCevDPWtBys+QUivZX9cYyNJcyWNIrUMVsgGrEuIThif9jxeEAQFauw==} + which-typed-array@1.1.18: resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==} engines: {node: '>= 0.4'} @@ -7827,6 +10033,13 @@ packages: engines: {node: '>= 8'} hasBin: true + wildcard@2.0.1: + resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + + windows-release@5.1.1: + resolution: {integrity: sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + winston-daily-rotate-file@4.7.1: resolution: {integrity: sha512-7LGPiYGBPNyGHLn9z33i96zx/bd71pjBn9tqQzO3I4Tayv94WPmBNwKC7CO1wPHdP9uvu+Md/1nr6VSH9h0iaA==} engines: {node: '>=8'} @@ -7905,6 +10118,9 @@ packages: workbox-window@6.6.0: resolution: {integrity: sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==} + workerpool@6.5.1: + resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} + wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -7920,6 +10136,9 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + write-file-atomic@4.0.2: resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -7952,9 +10171,17 @@ packages: resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} engines: {node: '>=12'} + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + y18n@4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} @@ -7965,6 +10192,9 @@ packages: yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yaml@2.7.0: resolution: {integrity: sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==} engines: {node: '>= 14'} @@ -7974,14 +10204,26 @@ packages: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} + yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} engines: {node: '>=12'} + yargs-unparser@2.0.0: + resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} + engines: {node: '>=10'} + yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} engines: {node: '>=8'} + yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} engines: {node: '>=12'} @@ -8012,6 +10254,10 @@ packages: resolution: {integrity: sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==} engines: {node: '>=12.20'} + yoctocolors@2.1.1: + resolution: {integrity: sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==} + engines: {node: '>=18'} + zod@3.24.1: resolution: {integrity: sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==} @@ -8051,6 +10297,14 @@ snapshots: jsonpointer: 5.0.1 leven: 3.1.0 + '@asamuzakjp/css-color@2.8.3': + dependencies: + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + lru-cache: 10.4.3 + '@babel/code-frame@7.26.2': dependencies: '@babel/helper-validator-identifier': 7.25.9 @@ -8072,7 +10326,7 @@ snapshots: '@babel/traverse': 7.26.5 '@babel/types': 7.26.5 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -8119,17 +10373,43 @@ snapshots: regexpu-core: 6.2.0 semver: 6.3.1 + '@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + + '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.26.5 + '@babel/helper-plugin-utils': 7.26.5 + debug: 4.4.0(supports-color@8.1.1) + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) lodash.debounce: 4.0.8 resolve: 1.22.10 transitivePeerDependencies: - supports-color + '@babel/helper-environment-visitor@7.24.7': + dependencies: + '@babel/types': 7.26.5 + '@babel/helper-member-expression-to-functions@7.25.9': dependencies: '@babel/traverse': 7.26.5 @@ -8242,96 +10522,155 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': + '@babel/plugin-proposal-async-generator-functions@7.20.7(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': + '@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': + '@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.26.0)': dependencies: + '@babel/compat-data': 7.26.5 '@babel/core': 7.26.0 + '@babel/helper-compilation-targets': 7.26.5 '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': + '@babel/plugin-proposal-private-methods@7.18.6(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) '@babel/helper-plugin-utils': 7.26.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-decorators@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': + '@babel/plugin-syntax-flow@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': + '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 @@ -8446,6 +10785,12 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-flow-strip-types@7.26.5(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-flow': 7.26.0(@babel/core@7.26.0) + '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -8593,6 +10938,35 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + + '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/types': 7.26.5 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-annotate-as-pure': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -8610,6 +10984,18 @@ snapshots: '@babel/core': 7.26.0 '@babel/helper-plugin-utils': 7.26.5 + '@babel/plugin-transform-runtime@7.23.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-plugin-utils': 7.26.5 + babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) + babel-plugin-polyfill-corejs3: 0.8.7(@babel/core@7.26.0) + babel-plugin-polyfill-regenerator: 0.5.5(@babel/core@7.26.0) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -8736,6 +11122,13 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/preset-flow@7.25.9(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-flow-strip-types': 7.26.5(@babel/core@7.26.0) + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': dependencies: '@babel/core': 7.26.0 @@ -8743,6 +11136,18 @@ snapshots: '@babel/types': 7.26.5 esutils: 2.0.3 + '@babel/preset-react@7.26.3(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-plugin-utils': 7.26.5 + '@babel/helper-validator-option': 7.25.9 + '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + '@babel/runtime-corejs3@7.26.0': dependencies: core-js-pure: 3.40.0 @@ -8765,7 +11170,7 @@ snapshots: '@babel/parser': 7.26.5 '@babel/template': 7.25.9 '@babel/types': 7.26.5 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -8784,24 +11189,175 @@ snapshots: dotenv-expand: 5.1.0 minimist: 1.2.8 + '@colors/colors@1.5.0': + optional: true + '@colors/colors@1.6.0': {} + '@commitlint/cli@19.3.0(@types/node@20.14.10)(typescript@5.5.3)': + dependencies: + '@commitlint/format': 19.5.0 + '@commitlint/lint': 19.7.1 + '@commitlint/load': 19.6.1(@types/node@20.14.10)(typescript@5.5.3) + '@commitlint/read': 19.5.0 + '@commitlint/types': 19.5.0 + execa: 8.0.1 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/config-conventional@19.2.2': + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-conventionalcommits: 7.0.2 + + '@commitlint/config-validator@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + ajv: 8.17.1 + + '@commitlint/ensure@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + lodash.snakecase: 4.1.1 + lodash.startcase: 4.4.0 + lodash.upperfirst: 4.3.1 + + '@commitlint/execute-rule@19.5.0': {} + + '@commitlint/format@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + + '@commitlint/is-ignored@19.7.1': + dependencies: + '@commitlint/types': 19.5.0 + semver: 7.6.3 + + '@commitlint/lint@19.7.1': + dependencies: + '@commitlint/is-ignored': 19.7.1 + '@commitlint/parse': 19.5.0 + '@commitlint/rules': 19.6.0 + '@commitlint/types': 19.5.0 + + '@commitlint/load@19.6.1(@types/node@20.14.10)(typescript@5.5.3)': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/execute-rule': 19.5.0 + '@commitlint/resolve-extends': 19.5.0 + '@commitlint/types': 19.5.0 + chalk: 5.4.1 + cosmiconfig: 9.0.0(typescript@5.5.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@20.14.10)(cosmiconfig@9.0.0(typescript@5.5.3))(typescript@5.5.3) + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + lodash.uniq: 4.5.0 + transitivePeerDependencies: + - '@types/node' + - typescript + + '@commitlint/message@19.5.0': {} + + '@commitlint/parse@19.5.0': + dependencies: + '@commitlint/types': 19.5.0 + conventional-changelog-angular: 7.0.0 + conventional-commits-parser: 5.0.0 + + '@commitlint/read@19.5.0': + dependencies: + '@commitlint/top-level': 19.5.0 + '@commitlint/types': 19.5.0 + git-raw-commits: 4.0.0 + minimist: 1.2.8 + tinyexec: 0.3.2 + + '@commitlint/resolve-extends@19.5.0': + dependencies: + '@commitlint/config-validator': 19.5.0 + '@commitlint/types': 19.5.0 + global-directory: 4.0.1 + import-meta-resolve: 4.1.0 + lodash.mergewith: 4.6.2 + resolve-from: 5.0.0 + + '@commitlint/rules@19.6.0': + dependencies: + '@commitlint/ensure': 19.5.0 + '@commitlint/message': 19.5.0 + '@commitlint/to-lines': 19.5.0 + '@commitlint/types': 19.5.0 + + '@commitlint/to-lines@19.5.0': {} + + '@commitlint/top-level@19.5.0': + dependencies: + find-up: 7.0.0 + + '@commitlint/types@19.5.0': + dependencies: + '@types/conventional-commits-parser': 5.0.1 + chalk: 5.4.1 + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + '@csstools/color-helpers@5.0.1': {} + + '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/color-helpers': 5.0.1 + '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) + '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + dependencies: + '@csstools/css-tokenizer': 3.0.3 + + '@csstools/css-tokenizer@3.0.3': {} + '@dabh/diagnostics@2.0.3': dependencies: colorspace: 1.1.4 enabled: 2.0.0 kuler: 2.0.0 + '@devexpress/bin-v8-flags-filter@1.3.0': {} + + '@devexpress/callsite-record@4.1.7': + dependencies: + '@types/lodash': 4.17.6 + callsite: 1.0.0 + chalk: 2.4.2 + error-stack-parser: 2.1.4 + highlight-es: 1.0.3 + lodash: 4.17.21 + pinkie-promise: 2.0.1 + '@discoveryjs/json-ext@0.5.7': {} '@ecency/bytebuffer@6.0.0': dependencies: long: 3.2.0 + '@electron/asar@3.2.18': + dependencies: + commander: 5.1.0 + glob: 7.2.3 + minimatch: 3.1.2 + '@emotion/is-prop-valid@1.2.2': dependencies: '@emotion/memoize': 0.8.1 @@ -8810,6 +11366,29 @@ snapshots: '@emotion/unitless@0.8.1': {} + '@engrave/eslint-config-engrave@1.0.0(@types/eslint@9.6.1)(eslint@8.57.0)(prettier@3.3.2)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/eslint-plugin': 6.7.0(@typescript-eslint/parser@6.7.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': 6.7.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + eslint-config-prettier: 9.0.0(eslint@8.57.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@6.7.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0) + eslint-plugin-no-only-tests: 3.1.0 + eslint-plugin-prettier: 5.0.0(@types/eslint@9.6.1)(eslint-config-prettier@9.0.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2) + eslint-plugin-security: 1.7.1 + transitivePeerDependencies: + - '@types/eslint' + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - prettier + - supports-color + - typescript + + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.0)': + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.4.1(eslint@8.57.1)': dependencies: eslint: 8.57.1 @@ -8820,7 +11399,7 @@ snapshots: '@eslint/eslintrc@2.1.4': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) espree: 9.6.1 globals: 13.24.0 ignore: 5.3.2 @@ -8831,6 +11410,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/js@8.57.0': {} + '@eslint/js@8.57.1': {} '@floating-ui/core@1.6.9': @@ -8854,19 +11435,6 @@ snapshots: '@hiveio/beekeeper@1.27.6-rc4': {} - '@hiveio/content-renderer@2.3.1(react-dom@18.3.0(react@18.3.0))(react@18.3.0)': - dependencies: - '@xmldom/xmldom': 0.8.10 - ow: 0.28.2 - react-twitter-embed: 4.0.4(react-dom@18.3.0(react@18.3.0))(react@18.3.0) - remarkable: 2.0.1 - sanitize-html: 2.13.0 - typescript-chained-error: 1.6.0 - universe-log: 5.2.0 - transitivePeerDependencies: - - react - - react-dom - '@hiveio/dhive@1.3.2': dependencies: '@ecency/bytebuffer': 6.0.0 @@ -8932,10 +11500,18 @@ snapshots: dependencies: react-hook-form: 7.54.2(react@18.3.0) + '@humanwhocodes/config-array@0.11.14': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.4.0(supports-color@8.1.1) + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8966,7 +11542,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -8979,14 +11555,14 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.10.4)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + jest-config: 29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -9011,7 +11587,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -9029,7 +11605,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.10.4 + '@types/node': 20.14.10 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -9051,7 +11627,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.10.4 + '@types/node': 20.14.10 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -9121,7 +11697,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -9218,13 +11794,86 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@octokit/auth-token@5.1.2': {} + + '@octokit/core@6.1.3': + dependencies: + '@octokit/auth-token': 5.1.2 + '@octokit/graphql': 8.2.0 + '@octokit/request': 9.2.0 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.8.0 + before-after-hook: 3.0.2 + universal-user-agent: 7.0.2 + + '@octokit/endpoint@10.1.2': + dependencies: + '@octokit/types': 13.8.0 + universal-user-agent: 7.0.2 + + '@octokit/graphql@8.2.0': + dependencies: + '@octokit/request': 9.2.0 + '@octokit/types': 13.8.0 + universal-user-agent: 7.0.2 + + '@octokit/openapi-types@23.0.1': {} + + '@octokit/plugin-paginate-rest@11.4.0(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/types': 13.8.0 + + '@octokit/plugin-retry@7.1.3(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.8.0 + bottleneck: 2.19.5 + + '@octokit/plugin-throttling@9.4.0(@octokit/core@6.1.3)': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/types': 13.8.0 + bottleneck: 2.19.5 + + '@octokit/request-error@6.1.6': + dependencies: + '@octokit/types': 13.8.0 + + '@octokit/request@9.2.0': + dependencies: + '@octokit/endpoint': 10.1.2 + '@octokit/request-error': 6.1.6 + '@octokit/types': 13.8.0 + fast-content-type-parse: 2.0.1 + universal-user-agent: 7.0.2 + + '@octokit/types@13.8.0': + dependencies: + '@octokit/openapi-types': 23.0.1 + '@pkgjs/parseargs@0.11.0': optional: true + '@pkgr/core@0.1.1': {} + '@playwright/test@1.49.1': dependencies: playwright: 1.49.1 + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + '@polka/url@1.0.0-next.28': {} '@radix-ui/number@1.0.1': @@ -10191,14 +12840,110 @@ snapshots: '@rushstack/eslint-patch@1.10.5': {} + '@sec-ant/readable-stream@0.4.1': {} + + '@semantic-release/commit-analyzer@13.0.1(semantic-release@24.0.0(typescript@5.5.3))': + dependencies: + conventional-changelog-angular: 8.0.0 + conventional-changelog-writer: 8.0.0 + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.0.0 + debug: 4.4.0(supports-color@8.1.1) + import-from-esm: 2.0.0 + lodash-es: 4.17.21 + micromatch: 4.0.8 + semantic-release: 24.0.0(typescript@5.5.3) + transitivePeerDependencies: + - supports-color + + '@semantic-release/error@4.0.0': {} + + '@semantic-release/github@10.3.5(semantic-release@24.0.0(typescript@5.5.3))': + dependencies: + '@octokit/core': 6.1.3 + '@octokit/plugin-paginate-rest': 11.4.0(@octokit/core@6.1.3) + '@octokit/plugin-retry': 7.1.3(@octokit/core@6.1.3) + '@octokit/plugin-throttling': 9.4.0(@octokit/core@6.1.3) + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + debug: 4.4.0(supports-color@8.1.1) + dir-glob: 3.0.1 + globby: 14.0.2 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + issue-parser: 7.0.1 + lodash-es: 4.17.21 + mime: 4.0.6 + p-filter: 4.1.0 + semantic-release: 24.0.0(typescript@5.5.3) + url-join: 5.0.0 + transitivePeerDependencies: + - supports-color + + '@semantic-release/gitlab@13.2.0(semantic-release@24.0.0(typescript@5.5.3))': + dependencies: + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + debug: 4.4.0(supports-color@8.1.1) + dir-glob: 3.0.1 + escape-string-regexp: 5.0.0 + formdata-node: 6.0.3 + fs-extra: 11.3.0 + globby: 14.0.2 + got: 14.4.5 + hpagent: 1.2.0 + lodash-es: 4.17.21 + parse-url: 9.2.0 + semantic-release: 24.0.0(typescript@5.5.3) + url-join: 4.0.1 + transitivePeerDependencies: + - supports-color + + '@semantic-release/npm@12.0.1(semantic-release@24.0.0(typescript@5.5.3))': + dependencies: + '@semantic-release/error': 4.0.0 + aggregate-error: 5.0.0 + execa: 9.5.2 + fs-extra: 11.3.0 + lodash-es: 4.17.21 + nerf-dart: 1.0.0 + normalize-url: 8.0.1 + npm: 10.9.2 + rc: 1.2.8 + read-pkg: 9.0.1 + registry-auth-token: 5.0.3 + semantic-release: 24.0.0(typescript@5.5.3) + semver: 7.6.3 + tempy: 3.1.0 + + '@semantic-release/release-notes-generator@14.0.3(semantic-release@24.0.0(typescript@5.5.3))': + dependencies: + conventional-changelog-angular: 8.0.0 + conventional-changelog-writer: 8.0.0 + conventional-commits-filter: 5.0.0 + conventional-commits-parser: 6.0.0 + debug: 4.4.0(supports-color@8.1.1) + get-stream: 7.0.1 + import-from-esm: 2.0.0 + into-stream: 7.0.0 + lodash-es: 4.17.21 + read-package-up: 11.0.0 + semantic-release: 24.0.0(typescript@5.5.3) + transitivePeerDependencies: + - supports-color + '@sinclair/typebox@0.27.8': {} '@sindresorhus/is@4.6.0': {} '@sindresorhus/is@5.6.0': {} + '@sindresorhus/is@7.0.1': {} + '@sindresorhus/merge-streams@2.3.0': {} + '@sindresorhus/merge-streams@4.0.0': {} + '@sinonjs/commons@3.0.1': dependencies: type-detect: 4.0.8 @@ -10225,13 +12970,13 @@ snapshots: dependencies: defer-to-connect: 2.0.1 - '@tailwindcss/typography@0.5.16(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)))': + '@tailwindcss/typography@0.5.16(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)))': dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 postcss-selector-parser: 6.0.10 - tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) '@tanstack/match-sorter-utils@8.19.4': dependencies: @@ -10297,7 +13042,7 @@ snapshots: '@tsconfig/node16@1.0.4': {} - '@turbo/gen@2.3.3(@types/node@20.10.4)(typescript@5.3.3)': + '@turbo/gen@2.3.3(@types/node@20.14.10)(typescript@5.5.3)': dependencies: '@turbo/workspaces': 2.3.3 commander: 10.0.1 @@ -10307,7 +13052,7 @@ snapshots: node-plop: 0.26.3 picocolors: 1.0.1 proxy-agent: 6.5.0 - ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.14.10)(typescript@5.5.3) update-check: 1.5.4 validate-npm-package-name: 5.0.1 transitivePeerDependencies: @@ -10333,7 +13078,7 @@ snapshots: '@types/accepts@1.3.7': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/aria-query@5.0.4': {} @@ -10363,25 +13108,31 @@ snapshots: '@types/body-parser@1.19.5': dependencies: '@types/connect': 3.4.38 - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/bs58@4.0.4': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 base-x: 3.0.10 + '@types/chai@4.3.16': {} + '@types/connect@3.4.38': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/content-disposition@0.5.8': {} + '@types/conventional-commits-parser@5.0.1': + dependencies: + '@types/node': 20.14.10 + '@types/cookies@0.9.0': dependencies: '@types/connect': 3.4.38 '@types/express': 5.0.0 '@types/keygrip': 1.0.6 - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/cors@2.8.17': dependencies: @@ -10427,11 +13178,13 @@ snapshots: '@types/estree@0.0.39': {} + '@types/estree@0.0.46': {} + '@types/estree@1.0.6': {} '@types/express-serve-static-core@5.0.5': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/qs': 6.9.18 '@types/range-parser': 1.2.7 '@types/send': 0.17.4 @@ -10446,11 +13199,11 @@ snapshots: '@types/glob@7.2.0': dependencies: '@types/minimatch': 5.1.2 - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/hast@2.3.10': dependencies: @@ -10479,13 +13232,19 @@ snapshots: '@types/jsdom@20.0.1': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/tough-cookie': 4.0.5 parse5: 7.2.1 - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} + '@types/jsdom@21.1.7': + dependencies: + '@types/node': 20.14.10 + '@types/tough-cookie': 4.0.5 + parse5: 7.2.1 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} '@types/keygrip@1.0.6': {} @@ -10502,7 +13261,9 @@ snapshots: '@types/http-errors': 2.0.4 '@types/keygrip': 1.0.6 '@types/koa-compose': 3.2.8 - '@types/node': 20.10.4 + '@types/node': 20.14.10 + + '@types/lodash@4.17.6': {} '@types/mdast@3.0.15': dependencies: @@ -10512,6 +13273,8 @@ snapshots: '@types/minimatch@5.1.2': {} + '@types/mocha@10.0.7': {} + '@types/ms@0.7.34': {} '@types/node@18.19.70': @@ -10522,10 +13285,18 @@ snapshots: dependencies: undici-types: 5.26.5 + '@types/node@20.14.10': + dependencies: + undici-types: 5.26.5 + + '@types/normalize-package-data@2.4.4': {} + '@types/oidc-provider@8.5.2': dependencies: '@types/koa': 2.15.0 - '@types/node': 20.10.4 + '@types/node': 20.14.10 + + '@types/parse-path@7.0.3': {} '@types/parse5@6.0.3': {} @@ -10554,7 +13325,11 @@ snapshots: '@types/resolve@1.17.1': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 + + '@types/sanitize-html@2.11.0': + dependencies: + htmlparser2: 8.0.2 '@types/sanitize-html@2.13.0': dependencies: @@ -10562,17 +13337,19 @@ snapshots: '@types/secure-random@1.1.3': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 + + '@types/semver@7.5.8': {} '@types/send@0.17.4': dependencies: '@types/mime': 1.3.5 - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/serve-static@1.15.7': dependencies: '@types/http-errors': 2.0.4 - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/send': 0.17.4 '@types/speakingurl@13.0.6': {} @@ -10583,7 +13360,7 @@ snapshots: '@types/through@0.0.33': dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 '@types/tinycolor2@1.4.6': {} @@ -10595,6 +13372,8 @@ snapshots: '@types/unist@2.0.11': {} + '@types/uuid@10.0.0': {} + '@types/validator@13.12.2': {} '@types/yargs-parser@21.0.3': {} @@ -10607,78 +13386,244 @@ snapshots: dependencies: '@types/node': 20.10.4 - '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3))(eslint@8.57.1)(typescript@5.3.3)': + '@typescript-eslint/eslint-plugin@6.7.0(@typescript-eslint/parser@6.7.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 6.7.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 6.7.0 + '@typescript-eslint/type-utils': 6.7.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 6.7.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 6.7.0 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/regexpp': 4.12.1 + '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/scope-manager': 7.15.0 + '@typescript-eslint/type-utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.15.0 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.2 + natural-compare: 1.4.0 + ts-api-utils: 1.4.3(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3))(eslint@8.57.1)(typescript@5.5.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.3.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.5.3) '@typescript-eslint/scope-manager': 8.20.0 - '@typescript-eslint/type-utils': 8.20.0(eslint@8.57.1)(typescript@5.3.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.3.3) + '@typescript-eslint/type-utils': 8.20.0(eslint@8.57.1)(typescript@5.5.3) + '@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.5.3) '@typescript-eslint/visitor-keys': 8.20.0 eslint: 8.57.1 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.0(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 2.0.0(typescript@5.5.3) + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@6.7.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/scope-manager': 6.7.0 + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 6.7.0 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/scope-manager': 7.15.0 + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) + '@typescript-eslint/visitor-keys': 7.15.0 + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3)': + '@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3)': dependencies: '@typescript-eslint/scope-manager': 8.20.0 '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.5.3) '@typescript-eslint/visitor-keys': 8.20.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 - typescript: 5.3.3 + typescript: 5.5.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/scope-manager@6.7.0': + dependencies: + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/visitor-keys': 6.7.0 + + '@typescript-eslint/scope-manager@7.15.0': + dependencies: + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/visitor-keys': 7.15.0 + '@typescript-eslint/scope-manager@8.20.0': dependencies: '@typescript-eslint/types': 8.20.0 '@typescript-eslint/visitor-keys': 8.20.0 - '@typescript-eslint/type-utils@8.20.0(eslint@8.57.1)(typescript@5.3.3)': + '@typescript-eslint/type-utils@6.7.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.5.3) + '@typescript-eslint/utils': 6.7.0(eslint@8.57.0)(typescript@5.5.3) + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.0 + ts-api-utils: 1.4.3(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@7.15.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) + '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + debug: 4.4.0(supports-color@8.1.1) + eslint: 8.57.0 + ts-api-utils: 1.4.3(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/type-utils@8.20.0(eslint@8.57.1)(typescript@5.5.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.3.3) - '@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.3.3) - debug: 4.4.0 + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.5.3) + '@typescript-eslint/utils': 8.20.0(eslint@8.57.1)(typescript@5.5.3) + debug: 4.4.0(supports-color@8.1.1) eslint: 8.57.1 - ts-api-utils: 2.0.0(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 2.0.0(typescript@5.5.3) + typescript: 5.5.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/types@6.7.0': {} + + '@typescript-eslint/types@7.15.0': {} + '@typescript-eslint/types@8.20.0': {} - '@typescript-eslint/typescript-estree@8.20.0(typescript@5.3.3)': + '@typescript-eslint/typescript-estree@6.7.0(typescript@5.5.3)': + dependencies: + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/visitor-keys': 6.7.0 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.15.0(typescript@5.5.3)': + dependencies: + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/visitor-keys': 7.15.0 + debug: 4.4.0(supports-color@8.1.1) + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.6.3 + ts-api-utils: 1.4.3(typescript@5.5.3) + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.20.0(typescript@5.5.3)': dependencies: '@typescript-eslint/types': 8.20.0 '@typescript-eslint/visitor-keys': 8.20.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 2.0.0(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 2.0.0(typescript@5.5.3) + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@6.7.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.7.0 + '@typescript-eslint/types': 6.7.0 + '@typescript-eslint/typescript-estree': 6.7.0(typescript@5.5.3) + eslint: 8.57.0 + semver: 7.6.3 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.15.0(eslint@8.57.0)(typescript@5.5.3)': + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) + '@typescript-eslint/scope-manager': 7.15.0 + '@typescript-eslint/types': 7.15.0 + '@typescript-eslint/typescript-estree': 7.15.0(typescript@5.5.3) + eslint: 8.57.0 transitivePeerDependencies: - supports-color + - typescript - '@typescript-eslint/utils@8.20.0(eslint@8.57.1)(typescript@5.3.3)': + '@typescript-eslint/utils@8.20.0(eslint@8.57.1)(typescript@5.5.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) '@typescript-eslint/scope-manager': 8.20.0 '@typescript-eslint/types': 8.20.0 - '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 8.20.0(typescript@5.5.3) eslint: 8.57.1 - typescript: 5.3.3 + typescript: 5.5.3 transitivePeerDependencies: - supports-color + '@typescript-eslint/visitor-keys@6.7.0': + dependencies: + '@typescript-eslint/types': 6.7.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.15.0': + dependencies: + '@typescript-eslint/types': 7.15.0 + eslint-visitor-keys: 3.4.3 + '@typescript-eslint/visitor-keys@8.20.0': dependencies: '@typescript-eslint/types': 8.20.0 @@ -10796,12 +13741,32 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 + '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(webpack-cli@5.1.4))': + dependencies: + webpack: 5.92.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.92.1) + + '@webpack-cli/info@2.0.2(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(webpack-cli@5.1.4))': + dependencies: + webpack: 5.92.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.92.1) + + '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(webpack-cli@5.1.4))': + dependencies: + webpack: 5.92.1(webpack-cli@5.1.4) + webpack-cli: 5.1.4(webpack@5.92.1) + '@xmldom/xmldom@0.8.10': {} '@xtuc/ieee754@1.2.0': {} '@xtuc/long@4.2.2': {} + JSONStream@1.3.5: + dependencies: + jsonparse: 1.3.1 + through: 2.3.8 + abab@2.0.6: {} abort-controller@3.0.0: @@ -10818,6 +13783,14 @@ snapshots: acorn: 8.14.0 acorn-walk: 8.3.4 + acorn-hammerhead@0.6.2: + dependencies: + '@types/estree': 0.0.46 + + acorn-import-attributes@1.9.5(acorn@8.14.0): + dependencies: + acorn: 8.14.0 + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: acorn: 8.14.0 @@ -10828,9 +13801,11 @@ snapshots: acorn@8.14.0: {} + address@2.0.3: {} + agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -10841,6 +13816,11 @@ snapshots: clean-stack: 2.2.0 indent-string: 4.0.0 + aggregate-error@5.0.0: + dependencies: + clean-stack: 5.2.0 + indent-string: 5.0.0 + ajv-formats@2.1.1(ajv@8.17.1): optionalDependencies: ajv: 8.17.1 @@ -10868,10 +13848,16 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ansi-colors@4.1.3: {} + ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 + ansi-escapes@7.0.0: + dependencies: + environment: 1.1.0 + ansi-regex@5.0.1: {} ansi-regex@6.1.0: {} @@ -10895,6 +13881,12 @@ snapshots: normalize-path: 3.0.0 picomatch: 2.3.1 + append-transform@2.0.0: + dependencies: + default-require-extensions: 3.0.1 + + archy@1.0.0: {} + arg@4.1.3: {} arg@5.0.2: {} @@ -10905,6 +13897,8 @@ snapshots: argparse@2.0.1: {} + argv-formatter@1.0.0: {} + aria-hidden@1.2.4: dependencies: tslib: 2.8.1 @@ -10920,6 +13914,10 @@ snapshots: call-bound: 1.0.3 is-array-buffer: 3.0.5 + array-find@1.0.0: {} + + array-ify@1.0.0: {} + array-includes@3.1.8: dependencies: call-bind: 1.0.8 @@ -10989,12 +13987,18 @@ snapshots: assert-plus@1.0.0: {} + assertion-error@1.1.0: {} + ast-types-flow@0.0.8: {} ast-types@0.13.4: dependencies: tslib: 2.8.1 + async-exit-hook@1.1.2: {} + + async@3.2.3: {} + async@3.2.6: {} asynckit@0.4.0: {} @@ -11079,6 +14083,14 @@ snapshots: '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 + babel-plugin-module-resolver@5.0.0: + dependencies: + find-babel-config: 2.1.2 + glob: 8.1.0 + pkg-up: 3.1.0 + reselect: 4.1.8 + resolve: 1.22.10 + babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): dependencies: '@babel/compat-data': 7.26.5 @@ -11096,6 +14108,21 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-polyfill-corejs3@0.8.7(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.4.4(@babel/core@7.26.0) + core-js-compat: 3.40.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-polyfill-regenerator@0.5.5(@babel/core@7.26.0): + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-define-polyfill-provider': 0.5.0(@babel/core@7.26.0) + transitivePeerDependencies: + - supports-color + babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 @@ -11103,6 +14130,8 @@ snapshots: transitivePeerDependencies: - supports-color + babel-plugin-syntax-trailing-function-commas@6.22.0: {} + babel-plugin-transform-remove-imports@1.8.0(@babel/core@7.26.0): dependencies: '@babel/core': 7.26.0 @@ -11146,6 +14175,8 @@ snapshots: bcp-47-match@2.0.3: {} + before-after-hook@3.0.2: {} + big.js@5.2.2: {} big.js@6.2.2: {} @@ -11172,6 +14203,12 @@ snapshots: boolbase@1.0.0: {} + bottleneck@2.19.5: {} + + bowser@1.6.0: {} + + bowser@2.11.0: {} + brace-expansion@1.1.11: dependencies: balanced-match: 1.0.2 @@ -11187,6 +14224,8 @@ snapshots: brorand@1.1.0: {} + browser-stdout@1.3.1: {} + browserify-aes@1.2.0: dependencies: buffer-xor: 1.0.3 @@ -11252,6 +14291,23 @@ snapshots: normalize-url: 8.0.1 responselike: 3.0.0 + cacheable-request@12.0.1: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 9.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + + caching-transform@4.0.0: + dependencies: + hasha: 5.2.2 + make-dir: 3.1.0 + package-hash: 4.0.0 + write-file-atomic: 3.0.3 + call-bind-apply-helpers@1.0.1: dependencies: es-errors: 1.3.0 @@ -11269,6 +14325,8 @@ snapshots: call-bind-apply-helpers: 1.0.1 get-intrinsic: 1.2.7 + callsite@1.0.0: {} + callsites@3.1.0: {} camel-case@3.0.0: @@ -11288,6 +14346,25 @@ snapshots: ccount@2.0.1: {} + chai@4.3.4: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 3.0.1 + get-func-name: 2.0.2 + pathval: 1.1.1 + type-detect: 4.0.8 + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + chalk@2.4.2: dependencies: ansi-styles: 3.2.1 @@ -11304,6 +14381,8 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + chalk@5.4.1: {} + change-case@3.1.0: dependencies: camel-case: 3.0.0 @@ -11339,6 +14418,10 @@ snapshots: chardet@0.7.0: {} + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -11351,8 +14434,18 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chrome-remote-interface@0.32.2: + dependencies: + commander: 2.11.0 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + chrome-trace-event@1.0.4: {} + ci-info@1.6.0: {} + ci-info@3.9.0: {} cipher-base@1.0.6: @@ -11376,6 +14469,10 @@ snapshots: clean-stack@2.2.0: {} + clean-stack@5.2.0: + dependencies: + escape-string-regexp: 5.0.0 + clean-webpack-plugin@4.0.0(webpack@5.97.1): dependencies: del: 4.1.1 @@ -11385,8 +14482,23 @@ snapshots: dependencies: restore-cursor: 3.1.0 + cli-highlight@2.1.11: + dependencies: + chalk: 4.1.2 + highlight.js: 10.7.3 + mz: 2.7.0 + parse5: 5.1.1 + parse5-htmlparser2-tree-adapter: 6.0.1 + yargs: 16.2.0 + cli-spinners@2.9.2: {} + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cli-width@3.0.0: {} client-only@0.0.1: {} @@ -11397,12 +14509,24 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 6.2.0 + cliui@7.0.4: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + cliui@8.0.1: dependencies: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone-deep@4.0.1: + dependencies: + is-plain-object: 2.0.4 + kind-of: 6.0.3 + shallow-clone: 3.0.1 + clone@1.0.4: {} clsx@1.2.1: {} @@ -11419,6 +14543,8 @@ snapshots: co@4.6.0: {} + coffeescript@2.7.0: {} + collect-v8-coverage@1.0.2: {} color-convert@1.9.3: @@ -11460,20 +14586,36 @@ snapshots: commander@10.0.1: {} + commander@2.11.0: {} + commander@2.20.3: {} commander@4.1.1: {} + commander@5.1.0: {} + commander@7.2.0: {} + commander@8.3.0: {} + common-path-prefix@3.0.0: {} common-tags@1.8.2: {} commondir@1.0.1: {} + compare-func@2.0.0: + dependencies: + array-ify: 1.0.0 + dot-prop: 5.3.0 + concat-map@0.0.1: {} + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + constant-case@2.0.0: dependencies: snake-case: 2.1.0 @@ -11485,6 +14627,43 @@ snapshots: content-type@1.0.5: {} + conventional-changelog-angular@7.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-angular@8.0.0: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-conventionalcommits@7.0.2: + dependencies: + compare-func: 2.0.0 + + conventional-changelog-writer@8.0.0: + dependencies: + '@types/semver': 7.5.8 + conventional-commits-filter: 5.0.0 + handlebars: 4.7.8 + meow: 13.2.0 + semver: 7.6.3 + + conventional-commits-filter@5.0.0: {} + + conventional-commits-parser@5.0.0: + dependencies: + JSONStream: 1.3.5 + is-text-path: 2.0.0 + meow: 12.1.1 + split2: 4.2.0 + + conventional-commits-parser@6.0.0: + dependencies: + meow: 13.2.0 + + convert-hrtime@5.0.0: {} + + convert-source-map@1.9.0: {} + convert-source-map@2.0.0: {} cookie@0.7.2: {} @@ -11535,6 +14714,22 @@ snapshots: object-assign: 4.1.1 vary: 1.1.2 + cosmiconfig-typescript-loader@6.1.0(@types/node@20.14.10)(cosmiconfig@9.0.0(typescript@5.5.3))(typescript@5.5.3): + dependencies: + '@types/node': 20.14.10 + cosmiconfig: 9.0.0(typescript@5.5.3) + jiti: 2.4.2 + typescript: 5.5.3 + + cosmiconfig@9.0.0(typescript@5.5.3): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.5.3 + create-hash@1.2.0: dependencies: cipher-base: 1.0.6 @@ -11591,8 +14786,14 @@ snapshots: crypto-js@4.2.0: {} + crypto-md5@1.0.0: {} + crypto-random-string@2.0.0: {} + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + css-color-keywords@1.0.0: {} css-selector-parser@1.4.1: {} @@ -11615,6 +14816,11 @@ snapshots: dependencies: cssom: 0.3.8 + cssstyle@4.2.1: + dependencies: + '@asamuzakjp/css-color': 2.8.3 + rrweb-cssom: 0.8.0 + csstype@3.1.3: {} d3-array@3.2.4: @@ -11655,8 +14861,12 @@ snapshots: d3-timer@3.0.1: {} + d3@3.5.17: {} + damerau-levenshtein@1.0.8: {} + dargs@8.1.0: {} + data-uri-to-buffer@6.0.2: {} data-urls@3.0.2: @@ -11665,6 +14875,11 @@ snapshots: whatwg-mimetype: 3.0.0 whatwg-url: 11.0.0 + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.1.0 + data-view-buffer@1.0.2: dependencies: call-bound: 1.0.3 @@ -11691,12 +14906,20 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: + debug@4.3.1: + dependencies: + ms: 2.1.2 + + debug@4.4.0(supports-color@8.1.1): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 8.1.1 decamelize@1.2.0: {} + decamelize@4.0.0: {} + decimal.js-light@2.5.1: {} decimal.js@10.4.3: {} @@ -11709,8 +14932,22 @@ snapshots: dependencies: mimic-response: 3.1.0 + dedent@0.4.0: {} + + dedent@0.6.0: {} + + dedent@0.7.0: {} + dedent@1.5.3: {} + deep-eql@3.0.1: + dependencies: + type-detect: 4.0.8 + + deep-eql@4.1.4: + dependencies: + type-detect: 4.0.8 + deep-equal@1.0.1: {} deep-equal@2.2.3: @@ -11740,6 +14977,10 @@ snapshots: deepmerge@4.3.1: {} + default-require-extensions@3.0.1: + dependencies: + strip-bom: 4.0.0 + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -11764,6 +15005,15 @@ snapshots: escodegen: 2.1.0 esprima: 4.0.1 + del@3.0.0: + dependencies: + globby: 6.1.0 + is-path-cwd: 1.0.0 + is-path-in-cwd: 1.0.1 + p-map: 1.2.0 + pify: 3.0.0 + rimraf: 2.7.1 + del@4.1.1: dependencies: '@types/glob': 7.2.0 @@ -11795,12 +15045,19 @@ snapshots: dequal@2.0.3: {} + des.js@1.1.0: + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + destroy@1.2.0: {} detect-newline@3.1.0: {} detect-node-es@1.1.0: {} + device-specs@1.0.1: {} + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -11862,6 +15119,10 @@ snapshots: dependencies: no-case: 2.3.2 + dot-prop@5.3.0: + dependencies: + is-obj: 2.0.0 + dot-prop@6.0.1: dependencies: is-obj: 2.0.0 @@ -11886,6 +15147,10 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + duplexer2@0.1.4: + dependencies: + readable-stream: 2.3.8 + duplexer@0.1.2: {} eastasianwidth@0.2.0: {} @@ -11903,6 +15168,8 @@ snapshots: electron-to-chromium@1.5.82: {} + elegant-spinner@1.0.1: {} + elliptic@6.6.1: dependencies: bn.js: 4.12.1 @@ -11913,12 +15180,18 @@ snapshots: minimalistic-assert: 1.0.1 minimalistic-crypto-utils: 1.0.1 + email-validator@2.0.4: {} + emittery@0.13.1: {} + emittery@0.4.1: {} + emoji-regex@8.0.0: {} emoji-regex@9.2.2: {} + emojilib@2.4.0: {} + emojis-list@3.0.0: {} enabled@2.0.0: {} @@ -11936,10 +15209,25 @@ snapshots: entities@4.5.0: {} + env-ci@11.1.0: + dependencies: + execa: 8.0.1 + java-properties: 1.0.2 + + env-paths@2.2.1: {} + + envinfo@7.14.0: {} + + environment@1.1.0: {} + error-ex@1.3.2: dependencies: is-arrayish: 0.2.1 + error-stack-parser@2.1.4: + dependencies: + stackframe: 1.3.4 + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -12052,6 +15340,8 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 + es6-error@4.1.1: {} + escalade@3.2.0: {} escape-html@1.0.3: {} @@ -12072,21 +15362,21 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@15.1.6(eslint@8.57.1)(typescript@5.3.3): + eslint-config-next@15.1.6(eslint@8.57.1)(typescript@5.5.3): dependencies: '@next/eslint-plugin-next': 15.1.6 '@rushstack/eslint-patch': 1.10.5 - '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3))(eslint@8.57.1)(typescript@5.3.3) - '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3))(eslint@8.57.1)(typescript@5.5.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.5.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.4(eslint@8.57.1) eslint-plugin-react-hooks: 5.1.0(eslint@8.57.1) optionalDependencies: - typescript: 5.3.3 + typescript: 5.5.3 transitivePeerDependencies: - eslint-import-resolver-webpack - eslint-plugin-import-x @@ -12096,6 +15386,10 @@ snapshots: dependencies: eslint: 8.57.1 + eslint-config-prettier@9.0.0(eslint@8.57.0): + dependencies: + eslint: 8.57.0 + eslint-config-turbo@2.4.0(eslint@8.57.1)(turbo@2.3.3): dependencies: eslint: 8.57.1 @@ -12113,7 +15407,7 @@ snapshots: eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) enhanced-resolve: 5.18.0 eslint: 8.57.1 fast-glob: 3.3.3 @@ -12122,22 +15416,96 @@ snapshots: is-glob: 4.0.3 stable-hash: 0.0.4 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@6.7.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.3.3) + '@typescript-eslint/parser': 6.7.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.5.3) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): + eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.7.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@6.7.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + has: 1.0.4 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 6.7.0(eslint@8.57.0)(typescript@5.5.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.57.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint@8.57.0) + hasown: 2.0.2 + is-core-module: 2.16.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3))(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -12148,7 +15516,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.3.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.5.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0(eslint-plugin-import@2.31.0)(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -12160,7 +15528,7 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.3.3) + '@typescript-eslint/parser': 8.20.0(eslint@8.57.1)(typescript@5.5.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack @@ -12185,6 +15553,18 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 + eslint-plugin-no-only-tests@3.1.0: {} + + eslint-plugin-prettier@5.0.0(@types/eslint@9.6.1)(eslint-config-prettier@9.0.0(eslint@8.57.0))(eslint@8.57.0)(prettier@3.3.2): + dependencies: + eslint: 8.57.0 + prettier: 3.3.2 + prettier-linter-helpers: 1.0.0 + synckit: 0.8.8 + optionalDependencies: + '@types/eslint': 9.6.1 + eslint-config-prettier: 9.0.0(eslint@8.57.0) + eslint-plugin-react-hooks@5.1.0(eslint@8.57.1): dependencies: eslint: 8.57.1 @@ -12211,6 +15591,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 + eslint-plugin-security@1.7.1: + dependencies: + safe-regex: 2.1.1 + eslint-plugin-turbo@2.4.0(eslint@8.57.1)(turbo@2.3.3): dependencies: dotenv: 16.0.3 @@ -12231,6 +15615,49 @@ snapshots: eslint-visitor-keys@4.2.0: {} + eslint@8.57.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.0) + '@eslint-community/regexpp': 4.12.1 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.1 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.6 + debug: 4.4.0(supports-color@8.1.1) + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.6.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.2 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + eslint@8.57.1: dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1) @@ -12244,7 +15671,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -12274,6 +15701,10 @@ snapshots: transitivePeerDependencies: - supports-color + esotope-hammerhead@0.6.8: + dependencies: + '@types/estree': 0.0.46 + espree@9.6.1: dependencies: acorn: 8.14.0 @@ -12311,6 +15742,31 @@ snapshots: md5.js: 1.3.5 safe-buffer: 5.2.1 + execa@3.4.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + p-finally: 2.0.1 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@4.1.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -12323,6 +15779,33 @@ snapshots: signal-exit: 3.0.7 strip-final-newline: 2.0.0 + execa@8.0.1: + dependencies: + cross-spawn: 7.0.6 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + execa@9.5.2: + dependencies: + '@sindresorhus/merge-streams': 4.0.0 + cross-spawn: 7.0.6 + figures: 6.1.0 + get-stream: 9.0.1 + human-signals: 8.0.0 + is-plain-obj: 4.1.0 + is-stream: 4.0.1 + npm-run-path: 6.0.0 + pretty-ms: 9.2.0 + signal-exit: 4.1.0 + strip-final-newline: 4.0.0 + yoctocolors: 2.1.1 + exit@0.1.2: {} expect@29.7.0: @@ -12343,10 +15826,14 @@ snapshots: extsprintf@1.4.1: {} + fast-content-type-parse@2.0.1: {} + fast-copy@3.0.2: {} fast-deep-equal@3.1.3: {} + fast-diff@1.3.0: {} + fast-equals@5.2.2: {} fast-glob@3.3.1: @@ -12375,6 +15862,8 @@ snapshots: fast-uri@3.0.5: {} + fastest-levenshtein@1.0.16: {} + fastq@1.18.0: dependencies: reusify: 1.0.4 @@ -12385,10 +15874,18 @@ snapshots: fecha@4.2.3: {} + figures@2.0.0: + dependencies: + escape-string-regexp: 1.0.5 + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 + figures@6.1.0: + dependencies: + is-unicode-supported: 2.1.0 + file-entry-cache@6.0.1: dependencies: flat-cache: 3.2.0 @@ -12407,6 +15904,10 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-babel-config@2.1.2: + dependencies: + json5: 2.2.3 + find-cache-dir@3.3.2: dependencies: commondir: 1.0.1 @@ -12418,6 +15919,16 @@ snapshots: common-path-prefix: 3.0.0 pkg-dir: 7.0.0 + find-up-simple@1.0.0: {} + + find-up@2.1.0: + dependencies: + locate-path: 2.0.0 + + find-up@3.0.0: + dependencies: + locate-path: 3.0.0 + find-up@4.1.0: dependencies: locate-path: 5.0.0 @@ -12433,12 +15944,25 @@ snapshots: locate-path: 7.2.0 path-exists: 5.0.0 + find-up@7.0.0: + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + unicorn-magic: 0.1.0 + + find-versions@6.0.0: + dependencies: + semver-regex: 4.0.5 + super-regex: 1.0.0 + flat-cache@3.2.0: dependencies: flatted: 3.3.2 keyv: 4.5.4 rimraf: 3.0.2 + flat@5.0.2: {} + flatted@3.3.2: {} fn.name@1.1.0: {} @@ -12449,6 +15973,11 @@ snapshots: dependencies: is-callable: 1.2.7 + foreground-child@2.0.0: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 3.0.7 + foreground-child@3.3.0: dependencies: cross-spawn: 7.0.6 @@ -12456,22 +15985,39 @@ snapshots: form-data-encoder@2.1.4: {} + form-data-encoder@4.0.2: {} + form-data@4.0.1: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + formdata-node@6.0.3: {} + fraction.js@4.3.7: {} fresh@0.5.2: {} + from2@2.3.0: + dependencies: + inherits: 2.0.4 + readable-stream: 2.3.8 + + fromentries@1.3.2: {} + fs-extra@10.1.0: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 universalify: 2.0.1 + fs-extra@11.3.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + fs-extra@9.1.0: dependencies: at-least-node: 1.0.0 @@ -12489,6 +16035,8 @@ snapshots: function-bind@1.1.2: {} + function-timeout@1.0.2: {} + function.prototype.name@1.1.8: dependencies: call-bind: 1.0.8 @@ -12504,6 +16052,8 @@ snapshots: get-caller-file@2.0.5: {} + get-func-name@2.0.2: {} + get-intrinsic@1.2.7: dependencies: call-bind-apply-helpers: 1.0.1 @@ -12519,6 +16069,13 @@ snapshots: get-nonce@1.0.1: {} + get-os-info@1.0.2: + dependencies: + getos: 3.2.1 + macos-release: 3.3.0 + os-family: 1.1.0 + windows-release: 5.1.1 + get-own-enumerable-property-symbols@3.0.2: {} get-package-type@0.1.0: {} @@ -12528,8 +16085,23 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 + get-stdin@4.0.1: {} + + get-stream@5.2.0: + dependencies: + pump: 3.0.2 + get-stream@6.0.1: {} + get-stream@7.0.1: {} + + get-stream@8.0.1: {} + + get-stream@9.0.1: + dependencies: + '@sec-ant/readable-stream': 0.4.1 + is-stream: 4.0.1 + get-symbol-description@1.1.0: dependencies: call-bound: 1.0.3 @@ -12544,10 +16116,29 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color + getos@3.2.1: + dependencies: + async: 3.2.6 + + git-log-parser@1.2.1: + dependencies: + argv-formatter: 1.0.0 + spawn-error-forwarder: 1.0.0 + split2: 1.0.0 + stream-combiner2: 1.1.1 + through2: 2.0.5 + traverse: 0.6.8 + + git-raw-commits@4.0.0: + dependencies: + dargs: 8.1.0 + meow: 12.1.1 + split2: 4.2.0 + git-revision-webpack-plugin@5.0.0(webpack@5.97.1): dependencies: webpack: 5.97.1 @@ -12582,6 +16173,18 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 + glob@8.1.0: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + global-directory@4.0.1: + dependencies: + ini: 4.1.1 + globals@11.12.0: {} globals@13.24.0: @@ -12654,6 +16257,22 @@ snapshots: p-cancelable: 3.0.0 responselike: 3.0.0 + got@14.4.5: + dependencies: + '@sindresorhus/is': 7.0.1 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 12.0.1 + decompress-response: 6.0.0 + form-data-encoder: 4.0.2 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 4.0.1 + responselike: 3.0.0 + type-fest: 4.33.0 + + graceful-fs@4.2.10: {} + graceful-fs@4.2.11: {} gradient-string@2.0.2: @@ -12663,6 +16282,10 @@ snapshots: graphemer@1.4.0: {} + graphlib@2.1.8: + dependencies: + lodash: 4.17.21 + gzip-size@6.0.0: dependencies: duplexer: 0.1.2 @@ -12696,6 +16319,8 @@ snapshots: dependencies: has-symbols: 1.1.0 + has@1.0.4: {} + hash-base@3.1.0: dependencies: inherits: 2.0.4 @@ -12707,6 +16332,11 @@ snapshots: inherits: 2.0.4 minimalistic-assert: 1.0.1 + hasha@5.2.2: + dependencies: + is-stream: 2.0.1 + type-fest: 0.8.1 + hasown@2.0.2: dependencies: function-bind: 1.1.2 @@ -12805,6 +16435,8 @@ snapshots: property-information: 6.5.0 space-separated-tokens: 2.0.2 + he@1.2.0: {} + header-case@1.0.1: dependencies: no-case: 2.3.2 @@ -12812,6 +16444,14 @@ snapshots: help-me@5.0.0: {} + highlight-es@1.0.3: + dependencies: + chalk: 2.4.2 + is-es2016-keyword: 1.0.0 + js-tokens: 3.0.2 + + highlight.js@10.7.3: {} + hive-auth-client@0.1.5: dependencies: crypto-js: 4.2.0 @@ -12836,10 +16476,22 @@ snapshots: dependencies: react-is: 16.13.1 + hook-std@3.0.0: {} + + hosted-git-info@7.0.2: + dependencies: + lru-cache: 10.4.3 + + hpagent@1.2.0: {} + html-encoding-sniffer@3.0.0: dependencies: whatwg-encoding: 2.0.0 + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + html-escaper@2.0.2: {} html-parse-stringify@3.0.1: @@ -12882,40 +16534,61 @@ snapshots: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color + http-status-codes@2.3.0: {} + http2-wrapper@2.2.1: dependencies: quick-lru: 5.1.1 resolve-alpn: 1.2.1 + httpntlm@1.8.13: + dependencies: + des.js: 1.1.0 + httpreq: 1.1.1 + js-md4: 0.3.2 + underscore: 1.12.1 + + httpreq@1.1.1: {} + https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color https@1.0.0: {} + human-signals@1.1.1: {} + human-signals@2.1.0: {} + human-signals@5.0.0: {} + + human-signals@8.0.0: {} + + humanize-duration@3.32.1: {} + + husky@9.0.11: {} + i18next-fs-backend@2.6.0: {} i18next@23.16.8: @@ -12928,6 +16601,10 @@ snapshots: dependencies: safer-buffer: 2.1.2 + iconv-lite@0.5.1: + dependencies: + safer-buffer: 2.1.2 + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 @@ -12945,15 +16622,43 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-from-esm@1.3.4: + dependencies: + debug: 4.4.0(supports-color@8.1.1) + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - supports-color + + import-from-esm@2.0.0: + dependencies: + debug: 4.4.0(supports-color@8.1.1) + import-meta-resolve: 4.1.0 + transitivePeerDependencies: + - supports-color + + import-lazy@3.1.0: {} + import-local@3.2.0: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 + import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: {} + indent-string@1.2.2: + dependencies: + get-stdin: 4.0.1 + minimist: 1.2.8 + repeating: 1.1.3 + indent-string@4.0.0: {} + indent-string@5.0.0: {} + + index-to-position@0.1.2: {} + inflight@1.0.6: dependencies: once: 1.4.0 @@ -12963,6 +16668,8 @@ snapshots: ini@1.3.8: {} + ini@4.1.1: {} + inline-style-parser@0.1.1: {} inquirer@7.3.3: @@ -13007,6 +16714,13 @@ snapshots: internmap@2.0.3: {} + interpret@3.1.1: {} + + into-stream@7.0.0: + dependencies: + from2: 2.3.0 + p-is-promise: 3.0.0 + ip-address@9.0.5: dependencies: jsbn: 1.1.0 @@ -13070,6 +16784,10 @@ snapshots: is-callable@1.2.7: {} + is-ci@1.2.1: + dependencies: + ci-info: 1.6.0 + is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -13087,12 +16805,20 @@ snapshots: is-decimal@2.0.1: {} + is-docker@2.2.1: {} + + is-es2016-keyword@1.0.0: {} + + is-extglob@1.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: dependencies: call-bound: 1.0.3 + is-finite@1.1.0: {} + is-fullwidth-code-point@3.0.0: {} is-generator-fn@2.1.0: {} @@ -13104,6 +16830,10 @@ snapshots: has-tostringtag: 1.0.2 safe-regex-test: 1.1.0 + is-glob@2.0.1: + dependencies: + is-extglob: 1.0.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -13131,22 +16861,40 @@ snapshots: is-obj@2.0.0: {} + is-path-cwd@1.0.0: {} + is-path-cwd@2.2.0: {} + is-path-in-cwd@1.0.1: + dependencies: + is-path-inside: 1.0.1 + is-path-in-cwd@2.1.0: dependencies: is-path-inside: 2.1.0 + is-path-inside@1.0.1: + dependencies: + path-is-inside: 1.0.2 + is-path-inside@2.1.0: dependencies: path-is-inside: 1.0.2 is-path-inside@3.0.3: {} + is-plain-obj@2.1.0: {} + is-plain-obj@4.1.0: {} + is-plain-object@2.0.4: + dependencies: + isobject: 3.0.1 + is-plain-object@5.0.0: {} + is-podman@1.0.1: {} + is-potential-custom-element-name@1.0.1: {} is-regex@1.2.1: @@ -13166,6 +16914,10 @@ snapshots: is-stream@2.0.1: {} + is-stream@3.0.0: {} + + is-stream@4.0.1: {} + is-string@1.1.1: dependencies: call-bound: 1.0.3 @@ -13177,16 +16929,26 @@ snapshots: has-symbols: 1.1.0 safe-regex-test: 1.1.0 + is-text-path@2.0.0: + dependencies: + text-extensions: 2.4.0 + is-typed-array@1.1.15: dependencies: which-typed-array: 1.1.18 + is-typedarray@1.0.0: {} + is-unicode-supported@0.1.0: {} + is-unicode-supported@2.1.0: {} + is-upper-case@1.1.2: dependencies: upper-case: 1.1.3 + is-utf8@0.2.1: {} + is-weakmap@2.0.2: {} is-weakref@1.1.0: @@ -13200,6 +16962,8 @@ snapshots: is-what@4.1.16: {} + is-windows@1.0.2: {} + isarray@1.0.0: {} isarray@2.0.5: {} @@ -13208,8 +16972,22 @@ snapshots: isexe@2.0.0: {} + isobject@3.0.1: {} + + issue-parser@7.0.1: + dependencies: + lodash.capitalize: 4.2.1 + lodash.escaperegexp: 4.1.2 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.uniqby: 4.7.0 + istanbul-lib-coverage@3.2.2: {} + istanbul-lib-hook@3.0.0: + dependencies: + append-transform: 2.0.0 + istanbul-lib-instrument@5.2.1: dependencies: '@babel/core': 7.26.0 @@ -13230,6 +17008,15 @@ snapshots: transitivePeerDependencies: - supports-color + istanbul-lib-processinfo@2.0.3: + dependencies: + archy: 1.0.0 + cross-spawn: 7.0.6 + istanbul-lib-coverage: 3.2.2 + p-map: 3.0.0 + rimraf: 3.0.2 + uuid: 8.3.2 + istanbul-lib-report@3.0.1: dependencies: istanbul-lib-coverage: 3.2.2 @@ -13238,7 +17025,7 @@ snapshots: istanbul-lib-source-maps@4.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) istanbul-lib-coverage: 3.2.2 source-map: 0.6.1 transitivePeerDependencies: @@ -13271,6 +17058,8 @@ snapshots: filelist: 1.0.4 minimatch: 3.1.2 + java-properties@1.0.2: {} + jest-changed-files@29.7.0: dependencies: execa: 5.1.1 @@ -13283,7 +17072,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3 @@ -13353,6 +17142,37 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@20.14.10)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.14.10 + ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -13392,7 +17212,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -13402,7 +17222,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.10.4 + '@types/node': 20.14.10 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -13441,7 +17261,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 jest-util: 29.7.0 jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): @@ -13476,7 +17296,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -13504,7 +17324,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 chalk: 4.1.2 cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 @@ -13550,7 +17370,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -13569,7 +17389,7 @@ snapshots: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.10.4 + '@types/node': 20.14.10 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -13578,19 +17398,19 @@ snapshots: jest-worker@26.6.2: dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 merge-stream: 2.0.0 supports-color: 7.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 merge-stream: 2.0.0 supports-color: 8.1.1 jest-worker@29.7.0: dependencies: - '@types/node': 20.10.4 + '@types/node': 20.14.10 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -13609,10 +17429,16 @@ snapshots: jiti@1.21.7: {} + jiti@2.4.2: {} + jose@5.9.6: {} joycon@3.1.1: {} + js-md4@0.3.2: {} + + js-tokens@3.0.2: {} + js-tokens@4.0.0: {} js-yaml@3.14.1: @@ -13661,12 +17487,42 @@ snapshots: - supports-color - utf-8-validate + jsdom@24.1.0: + dependencies: + cssstyle: 4.2.1 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.1 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.16 + parse5: 7.2.1 + rrweb-cssom: 0.7.1 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.1.0 + ws: 8.18.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + jsesc@3.0.2: {} jsesc@3.1.0: {} json-buffer@3.0.1: {} + json-parse-better-errors@1.0.2: {} + json-parse-even-better-errors@2.3.1: {} json-schema-traverse@0.4.1: {} @@ -13689,6 +17545,8 @@ snapshots: optionalDependencies: graceful-fs: 4.2.11 + jsonparse@1.3.1: {} + jsonpointer@5.0.1: {} jsx-ast-utils@3.3.5: @@ -13723,6 +17581,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kind-of@6.0.3: {} + kleur@3.0.3: {} kleur@4.1.5: {} @@ -13741,7 +17601,7 @@ snapshots: content-disposition: 0.5.4 content-type: 1.0.5 cookies: 0.9.1 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) delegates: 1.0.0 depd: 2.0.0 destroy: 1.2.0 @@ -13789,6 +17649,17 @@ snapshots: lines-and-columns@1.2.4: {} + linux-platform-info@0.0.3: + dependencies: + os-family: 1.1.0 + + load-json-file@4.0.0: + dependencies: + graceful-fs: 4.2.11 + parse-json: 4.0.0 + pify: 3.0.0 + strip-bom: 3.0.0 + loader-runner@4.3.0: {} loader-utils@2.0.4: @@ -13797,6 +17668,16 @@ snapshots: emojis-list: 3.0.0 json5: 2.2.3 + locate-path@2.0.0: + dependencies: + p-locate: 2.0.0 + path-exists: 3.0.0 + + locate-path@3.0.0: + dependencies: + p-locate: 3.0.0 + path-exists: 3.0.0 + locate-path@5.0.0: dependencies: p-locate: 4.1.0 @@ -13809,20 +17690,46 @@ snapshots: dependencies: p-locate: 6.0.0 + lodash-es@4.17.21: {} + + lodash.camelcase@4.3.0: {} + + lodash.capitalize@4.2.1: {} + lodash.castarray@4.4.0: {} lodash.debounce@4.0.8: {} + lodash.escaperegexp@4.1.2: {} + + lodash.flattendeep@4.4.0: {} + lodash.get@4.4.2: {} lodash.isequal@4.5.0: {} lodash.isplainobject@4.0.6: {} + lodash.isstring@4.0.1: {} + + lodash.kebabcase@4.1.1: {} + lodash.merge@4.6.2: {} + lodash.mergewith@4.6.2: {} + + lodash.snakecase@4.1.1: {} + lodash.sortby@4.7.0: {} + lodash.startcase@4.4.0: {} + + lodash.uniq@4.5.0: {} + + lodash.uniqby@4.7.0: {} + + lodash.upperfirst@4.3.1: {} + lodash@4.17.21: {} log-symbols@3.0.0: @@ -13834,6 +17741,13 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 + log-update-async-hook@2.0.7: + dependencies: + ansi-escapes: 4.3.2 + async-exit-hook: 1.1.2 + onetime: 2.0.1 + wrap-ansi: 7.0.0 + logform@2.7.0: dependencies: '@colors/colors': 1.6.0 @@ -13853,6 +17767,10 @@ snapshots: dependencies: js-tokens: 4.0.0 + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + lower-case-first@1.0.2: dependencies: lower-case: 1.1.4 @@ -13863,10 +17781,16 @@ snapshots: lru-cache@10.4.3: {} + lru-cache@2.6.3: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + lru-cache@7.18.3: {} lucide-react@0.259.0(react@18.3.0): @@ -13875,6 +17799,8 @@ snapshots: lz-string@1.5.0: {} + macos-release@3.3.0: {} + magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -13895,6 +17821,23 @@ snapshots: markdown-table@3.0.4: {} + marked-terminal@7.3.0(marked@12.0.2): + dependencies: + ansi-escapes: 7.0.0 + ansi-regex: 6.1.0 + chalk: 5.4.1 + cli-highlight: 2.1.11 + cli-table3: 0.6.5 + marked: 12.0.2 + node-emoji: 2.2.0 + supports-hyperlinks: 3.2.0 + + marked@12.0.2: {} + + match-url-wildcard@0.0.4: + dependencies: + escape-string-regexp: 1.0.5 + math-intrinsics@1.1.0: {} md5.js@1.3.5: @@ -14010,6 +17953,14 @@ snapshots: media-typer@0.3.0: {} + meow@12.1.1: {} + + meow@13.2.0: {} + + merge-stream@1.0.1: + dependencies: + readable-stream: 2.3.8 + merge-stream@2.0.0: {} merge2@1.4.1: {} @@ -14186,7 +18137,7 @@ snapshots: micromark@3.2.0: dependencies: '@types/debug': 4.1.12 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) decode-named-character-reference: 1.0.2 micromark-core-commonmark: 1.1.0 micromark-factory-space: 1.1.0 @@ -14216,8 +18167,16 @@ snapshots: dependencies: mime-db: 1.52.0 + mime@1.4.1: {} + + mime@4.0.6: {} + + mimic-fn@1.2.0: {} + mimic-fn@2.1.0: {} + mimic-fn@4.0.0: {} + mimic-response@3.1.0: {} mimic-response@4.0.0: {} @@ -14248,12 +18207,39 @@ snapshots: dependencies: minimist: 1.2.8 + mocha@10.6.0: + dependencies: + ansi-colors: 4.1.3 + browser-stdout: 1.3.1 + chokidar: 3.6.0 + debug: 4.4.0(supports-color@8.1.1) + diff: 5.2.0 + escape-string-regexp: 4.0.0 + find-up: 5.0.0 + glob: 8.1.0 + he: 1.2.0 + js-yaml: 4.1.0 + log-symbols: 4.1.0 + minimatch: 5.1.6 + ms: 2.1.3 + serialize-javascript: 6.0.2 + strip-json-comments: 3.1.1 + supports-color: 8.1.1 + workerpool: 6.5.1 + yargs: 16.2.0 + yargs-parser: 20.2.9 + yargs-unparser: 2.0.0 + + moment-duration-format-commonjs@1.0.1: {} + moment@2.30.1: {} mri@1.2.0: {} mrmime@2.0.0: {} + ms@2.1.2: {} + ms@2.1.3: {} multibase@4.0.6: @@ -14268,6 +18254,8 @@ snapshots: uint8arrays: 3.1.1 varint: 5.0.2 + mustache@2.3.2: {} + mute-stream@0.0.8: {} mz@2.7.0: @@ -14288,6 +18276,8 @@ snapshots: neo-async@2.6.2: {} + nerf-dart@1.0.0: {} + netmask@2.0.2: {} next-i18next@15.4.1(i18next@23.16.8)(next@14.2.23(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@18.3.0(react@18.3.0))(react@18.3.0))(react-i18next@15.4.0(i18next@23.16.8)(react-dom@18.3.0(react@18.3.0))(react@18.3.0))(react@18.3.0): @@ -14375,6 +18365,13 @@ snapshots: dependencies: lower-case: 1.1.4 + node-emoji@2.2.0: + dependencies: + '@sindresorhus/is': 4.6.0 + char-regex: 1.0.2 + emojilib: 2.4.0 + skin-tone: 2.0.0 + node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -14395,8 +18392,18 @@ snapshots: mkdirp: 0.5.6 resolve: 1.22.10 + node-preload@0.2.1: + dependencies: + process-on-spawn: 1.1.0 + node-releases@2.0.19: {} + normalize-package-data@6.0.2: + dependencies: + hosted-git-info: 7.0.2 + semver: 7.6.3 + validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} normalize-range@0.1.2: {} @@ -14409,12 +18416,55 @@ snapshots: dependencies: path-key: 3.1.1 + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + npm@10.9.2: {} + nth-check@2.1.1: dependencies: boolbase: 1.0.0 nwsapi@2.2.16: {} + nyc@17.0.0: + dependencies: + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + caching-transform: 4.0.0 + convert-source-map: 1.9.0 + decamelize: 1.2.0 + find-cache-dir: 3.3.2 + find-up: 4.1.0 + foreground-child: 2.0.0 + get-package-type: 0.1.0 + glob: 7.2.3 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-hook: 3.0.0 + istanbul-lib-instrument: 6.0.3 + istanbul-lib-processinfo: 2.0.3 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + make-dir: 3.1.0 + node-preload: 0.2.1 + p-map: 3.0.0 + process-on-spawn: 1.1.0 + resolve-from: 5.0.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + spawn-wrap: 2.0.0 + test-exclude: 6.0.0 + yargs: 15.4.1 + transitivePeerDependencies: + - supports-color + object-assign@4.1.1: {} object-hash@2.2.0: {} @@ -14469,7 +18519,7 @@ snapshots: dependencies: '@koa/cors': 5.0.0 '@koa/router': 13.1.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) eta: 3.5.0 got: 13.0.0 jose: 5.9.6 @@ -14499,10 +18549,18 @@ snapshots: dependencies: fn.name: 1.1.0 + onetime@2.0.1: + dependencies: + mimic-fn: 1.2.0 + onetime@5.1.2: dependencies: mimic-fn: 2.1.0 + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + only@0.0.2: {} opener@1.5.2: {} @@ -14539,6 +18597,8 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 + os-family@1.1.0: {} + os-tmpdir@1.0.2: {} ow@0.13.2: @@ -14561,6 +18621,22 @@ snapshots: p-cancelable@3.0.0: {} + p-cancelable@4.0.1: {} + + p-each-series@3.0.0: {} + + p-filter@4.1.0: + dependencies: + p-map: 7.0.3 + + p-finally@2.0.1: {} + + p-is-promise@3.0.0: {} + + p-limit@1.3.0: + dependencies: + p-try: 1.0.0 + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -14573,6 +18649,14 @@ snapshots: dependencies: yocto-queue: 1.1.1 + p-locate@2.0.0: + dependencies: + p-limit: 1.3.0 + + p-locate@3.0.0: + dependencies: + p-limit: 2.3.0 + p-locate@4.1.0: dependencies: p-limit: 2.3.0 @@ -14585,19 +18669,27 @@ snapshots: dependencies: p-limit: 4.0.0 + p-map@1.2.0: {} + p-map@2.1.0: {} p-map@3.0.0: dependencies: aggregate-error: 3.1.0 + p-map@7.0.3: {} + + p-reduce@3.0.0: {} + + p-try@1.0.0: {} + p-try@2.2.0: {} pac-proxy-agent@7.1.0: dependencies: '@tootallnate/quickjs-emscripten': 0.23.0 agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) get-uri: 6.0.4 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 @@ -14611,6 +18703,13 @@ snapshots: degenerator: 5.0.1 netmask: 2.0.2 + package-hash@4.0.0: + dependencies: + graceful-fs: 4.2.11 + hasha: 5.2.2 + lodash.flattendeep: 4.4.0 + release-zalgo: 1.0.0 + package-json-from-dist@1.0.1: {} pako@1.0.11: {} @@ -14633,6 +18732,11 @@ snapshots: is-decimal: 2.0.1 is-hexadecimal: 2.0.1 + parse-json@4.0.0: + dependencies: + error-ex: 1.3.2 + json-parse-better-errors: 1.0.2 + parse-json@5.2.0: dependencies: '@babel/code-frame': 7.26.2 @@ -14640,10 +18744,37 @@ snapshots: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + parse-json@8.1.0: + dependencies: + '@babel/code-frame': 7.26.2 + index-to-position: 0.1.2 + type-fest: 4.33.0 + + parse-ms@4.0.0: {} + parse-numeric-range@1.3.0: {} + parse-path@7.0.0: + dependencies: + protocols: 2.0.1 + parse-srcset@1.0.2: {} + parse-url@9.2.0: + dependencies: + '@types/parse-path': 7.0.3 + parse-path: 7.0.0 + + parse5-htmlparser2-tree-adapter@6.0.1: + dependencies: + parse5: 6.0.1 + + parse5@1.5.1: {} + + parse5@2.2.3: {} + + parse5@5.1.1: {} + parse5@6.0.1: {} parse5@7.2.1: @@ -14661,6 +18792,8 @@ snapshots: dependencies: no-case: 2.3.2 + path-exists@3.0.0: {} + path-exists@4.0.0: {} path-exists@5.0.0: {} @@ -14673,6 +18806,8 @@ snapshots: path-key@3.1.1: {} + path-key@4.0.0: {} + path-parse@1.0.7: {} path-scurry@1.11.1: @@ -14686,6 +18821,8 @@ snapshots: path-type@5.0.0: {} + pathval@1.1.1: {} + picocolors@1.0.1: {} picocolors@1.1.1: {} @@ -14694,12 +18831,20 @@ snapshots: pify@2.3.0: {} + pify@3.0.0: {} + pify@4.0.1: {} + pinkie-promise@1.0.0: + dependencies: + pinkie: 1.0.0 + pinkie-promise@2.0.1: dependencies: pinkie: 2.0.4 + pinkie@1.0.0: {} + pinkie@2.0.4: {} pino-abstract-transport@1.2.0: @@ -14742,6 +18887,11 @@ snapshots: pirates@4.0.6: {} + pkg-conf@2.1.0: + dependencies: + find-up: 2.1.0 + load-json-file: 4.0.0 + pkg-dir@4.2.0: dependencies: find-up: 4.1.0 @@ -14750,6 +18900,10 @@ snapshots: dependencies: find-up: 6.3.0 + pkg-up@3.1.0: + dependencies: + find-up: 3.0.0 + playwright-core@1.49.1: {} playwright-merge-html-reports@0.2.8(@playwright/test@1.49.1): @@ -14764,6 +18918,8 @@ snapshots: optionalDependencies: fsevents: 2.3.2 + pngjs@3.4.0: {} + pngjs@5.0.0: {} polished@1.9.3: {} @@ -14782,13 +18938,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.39 - postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)): dependencies: lilconfig: 3.1.3 yaml: 2.7.0 optionalDependencies: postcss: 8.4.39 - ts-node: 10.9.2(@types/node@20.10.4)(typescript@5.3.3) + ts-node: 10.9.2(@types/node@20.14.10)(typescript@5.5.3) postcss-nested@6.2.0(postcss@8.4.39): dependencies: @@ -14827,6 +18983,10 @@ snapshots: prelude-ls@1.2.1: {} + prettier-linter-helpers@1.0.0: + dependencies: + fast-diff: 1.3.0 + prettier-plugin-tailwindcss@0.3.0(prettier@3.4.2): dependencies: prettier: 3.4.2 @@ -14835,6 +18995,8 @@ snapshots: dependencies: prettier: 3.4.2 + prettier@3.3.2: {} + prettier@3.4.2: {} pretty-bytes@5.6.0: {} @@ -14851,12 +19013,26 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 + pretty-hrtime@1.0.3: {} + + pretty-ms@9.2.0: + dependencies: + parse-ms: 4.0.0 + process-nextick-args@2.0.1: {} + process-on-spawn@1.1.0: + dependencies: + fromentries: 1.3.2 + process-warning@3.0.0: {} process@0.11.10: {} + promisify-event@1.0.0: + dependencies: + pinkie-promise: 2.0.1 + prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -14870,10 +19046,14 @@ snapshots: property-information@6.5.0: {} + proto-list@1.2.4: {} + + protocols@2.0.1: {} + proxy-agent@6.5.0: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 7.18.3 @@ -14898,6 +19078,8 @@ snapshots: pure-rand@6.1.0: {} + qrcode-terminal@0.10.0: {} + qrcode@1.5.4: dependencies: dijkstrajs: 1.0.3 @@ -14940,6 +19122,19 @@ snapshots: react: 16.14.0 scheduler: 0.19.1 + react-dom@17.0.2(react@17.0.2): + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react: 17.0.2 + scheduler: 0.20.2 + + react-dom@18.3.0(react@17.0.2): + dependencies: + loose-envify: 1.4.0 + react: 17.0.2 + scheduler: 0.23.2 + react-dom@18.3.0(react@18.3.0): dependencies: loose-envify: 1.4.0 @@ -15072,10 +19267,10 @@ snapshots: react: 18.3.0 react-dom: 18.3.0(react@18.3.0) - react-twitter-embed@4.0.4(react-dom@18.3.0(react@18.3.0))(react@18.3.0): + react-twitter-embed@4.0.4(react-dom@18.3.0(react@17.0.2))(react@17.0.2): dependencies: - react: 18.3.0 - react-dom: 18.3.0(react@18.3.0) + react: 17.0.2 + react-dom: 18.3.0(react@17.0.2) scriptjs: 2.5.9 react@16.14.0: @@ -15084,6 +19279,11 @@ snapshots: object-assign: 4.1.1 prop-types: 15.8.1 + react@17.0.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react@18.3.0: dependencies: loose-envify: 1.4.0 @@ -15092,6 +19292,24 @@ snapshots: dependencies: pify: 2.3.0 + read-file-relative@1.2.0: + dependencies: + callsite: 1.0.0 + + read-package-up@11.0.0: + dependencies: + find-up-simple: 1.0.0 + read-pkg: 9.0.1 + type-fest: 4.33.0 + + read-pkg@9.0.1: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 6.0.2 + parse-json: 8.1.0 + type-fest: 4.33.0 + unicorn-magic: 0.1.0 + readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -15139,6 +19357,10 @@ snapshots: tiny-invariant: 1.3.3 victory-vendor: 36.9.2 + rechoir@0.8.0: + dependencies: + resolve: 1.22.10 + redent@3.0.0: dependencies: indent-string: 4.0.0 @@ -15176,6 +19398,8 @@ snapshots: dependencies: '@babel/runtime': 7.26.0 + regexp-tree@0.1.27: {} + regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -15199,6 +19423,10 @@ snapshots: rc: 1.2.8 safe-buffer: 5.2.1 + registry-auth-token@5.0.3: + dependencies: + '@pnpm/npm-conf': 2.3.1 + registry-url@3.1.0: dependencies: rc: 1.2.8 @@ -15281,6 +19509,10 @@ snapshots: rehype-stringify: 9.0.4 unified: 10.1.2 + release-zalgo@1.0.0: + dependencies: + es6-error: 4.1.1 + remark-gfm@3.0.1: dependencies: '@types/mdast': 3.0.15 @@ -15312,6 +19544,12 @@ snapshots: remove-accents@0.5.0: {} + repeating@1.1.3: + dependencies: + is-finite: 1.1.0 + + replicator@1.0.5: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -15320,12 +19558,20 @@ snapshots: requires-port@1.0.0: {} + reselect@4.1.8: {} + resolve-alpn@1.2.1: {} + resolve-cwd@1.0.0: + dependencies: + resolve-from: 2.0.0 + resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 + resolve-from@2.0.0: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -15382,6 +19628,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + rrweb-cssom@0.7.1: {} + + rrweb-cssom@0.8.0: {} + run-async@2.4.1: {} run-parallel@1.2.0: @@ -15423,10 +19673,18 @@ snapshots: es-errors: 1.3.0 is-regex: 1.2.1 + safe-regex@2.1.1: + dependencies: + regexp-tree: 0.1.27 + safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} + sanitize-filename@1.6.3: + dependencies: + truncate-utf8-bytes: 1.0.2 + sanitize-html@2.13.0: dependencies: deepmerge: 4.3.1 @@ -15454,6 +19712,11 @@ snapshots: loose-envify: 1.4.0 object-assign: 4.1.1 + scheduler@0.20.2: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -15494,10 +19757,55 @@ snapshots: secure-random@1.1.2: {} + semantic-release@24.0.0(typescript@5.5.3): + dependencies: + '@semantic-release/commit-analyzer': 13.0.1(semantic-release@24.0.0(typescript@5.5.3)) + '@semantic-release/error': 4.0.0 + '@semantic-release/github': 10.3.5(semantic-release@24.0.0(typescript@5.5.3)) + '@semantic-release/npm': 12.0.1(semantic-release@24.0.0(typescript@5.5.3)) + '@semantic-release/release-notes-generator': 14.0.3(semantic-release@24.0.0(typescript@5.5.3)) + aggregate-error: 5.0.0 + cosmiconfig: 9.0.0(typescript@5.5.3) + debug: 4.4.0(supports-color@8.1.1) + env-ci: 11.1.0 + execa: 9.5.2 + figures: 6.1.0 + find-versions: 6.0.0 + get-stream: 6.0.1 + git-log-parser: 1.2.1 + hook-std: 3.0.0 + hosted-git-info: 7.0.2 + import-from-esm: 1.3.4 + lodash-es: 4.17.21 + marked: 12.0.2 + marked-terminal: 7.3.0(marked@12.0.2) + micromatch: 4.0.8 + p-each-series: 3.0.0 + p-reduce: 3.0.0 + read-package-up: 11.0.0 + resolve-from: 5.0.0 + semver: 7.6.3 + semver-diff: 4.0.0 + signale: 1.4.0 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + - typescript + + semver-diff@4.0.0: + dependencies: + semver: 7.6.3 + + semver-regex@4.0.5: {} + semver@5.7.2: {} semver@6.3.1: {} + semver@7.5.3: + dependencies: + lru-cache: 6.0.0 + semver@7.6.2: {} semver@7.6.3: {} @@ -15517,6 +19825,8 @@ snapshots: set-blocking@2.0.0: {} + set-cookie-parser@2.7.1: {} + set-function-length@1.2.2: dependencies: define-data-property: 1.1.4 @@ -15550,6 +19860,10 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + shallow-clone@3.0.1: + dependencies: + kind-of: 6.0.3 + shallowequal@1.1.0: {} shebang-command@1.2.0: @@ -15596,6 +19910,12 @@ snapshots: signal-exit@4.1.0: {} + signale@1.4.0: + dependencies: + chalk: 2.4.2 + figures: 2.0.0 + pkg-conf: 2.1.0 + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -15616,6 +19936,10 @@ snapshots: sisteransi@1.0.5: {} + skin-tone@2.0.0: + dependencies: + unicode-emoji-modifier-base: 1.0.0 + slash@3.0.0: {} slash@4.0.0: {} @@ -15631,7 +19955,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -15661,6 +19985,8 @@ snapshots: source-map@0.6.1: {} + source-map@0.7.4: {} + source-map@0.8.0-beta.0: dependencies: whatwg-url: 7.1.0 @@ -15669,8 +19995,37 @@ snapshots: space-separated-tokens@2.0.2: {} + spawn-error-forwarder@1.0.0: {} + + spawn-wrap@2.0.0: + dependencies: + foreground-child: 2.0.0 + is-windows: 1.0.2 + make-dir: 3.1.0 + rimraf: 3.0.2 + signal-exit: 3.0.7 + which: 2.0.2 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.21 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.21 + + spdx-license-ids@3.0.21: {} + speakingurl@14.0.1: {} + split2@1.0.0: + dependencies: + through2: 2.0.5 + split2@4.2.0: {} sprintf-js@1.0.3: {} @@ -15685,6 +20040,8 @@ snapshots: dependencies: escape-string-regexp: 2.0.0 + stackframe@1.3.4: {} + statuses@1.5.0: {} statuses@2.0.1: {} @@ -15694,6 +20051,11 @@ snapshots: es-errors: 1.3.0 internal-slot: 1.1.0 + stream-combiner2@1.1.1: + dependencies: + duplexer2: 0.1.4 + readable-stream: 2.3.8 + streamsearch@1.1.0: {} string-length@4.0.2: @@ -15790,6 +20152,10 @@ snapshots: dependencies: ansi-regex: 6.1.0 + strip-bom@2.0.0: + dependencies: + is-utf8: 0.2.1 + strip-bom@3.0.0: {} strip-bom@4.0.0: {} @@ -15798,6 +20164,10 @@ snapshots: strip-final-newline@2.0.0: {} + strip-final-newline@3.0.0: {} + + strip-final-newline@4.0.0: {} + strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -15843,6 +20213,11 @@ snapshots: pirates: 4.0.6 ts-interface-checker: 0.1.13 + super-regex@1.0.0: + dependencies: + function-timeout: 1.0.2 + time-span: 5.1.0 + superjson@1.13.3: dependencies: copy-anything: 3.0.5 @@ -15859,6 +20234,11 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-hyperlinks@3.2.0: + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + supports-preserve-symlinks-flag@1.0.0: {} swap-case@1.1.2: @@ -15868,13 +20248,18 @@ snapshots: symbol-tree@3.2.4: {} + synckit@0.8.8: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.8.1 + tailwind-merge@1.14.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3))): dependencies: - tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + tailwindcss: 3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) - tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)): + tailwindcss@3.4.6(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -15893,7 +20278,7 @@ snapshots: postcss: 8.4.39 postcss-import: 15.1.0(postcss@8.4.39) postcss-js: 4.0.1(postcss@8.4.39) - postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3)) + postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3)) postcss-nested: 6.2.0(postcss@8.4.39) postcss-selector-parser: 6.1.2 resolve: 1.22.10 @@ -15905,6 +20290,8 @@ snapshots: temp-dir@2.0.0: {} + temp-dir@3.0.0: {} + tempy@0.6.0: dependencies: is-stream: 2.0.1 @@ -15912,6 +20299,22 @@ snapshots: type-fest: 0.16.0 unique-string: 2.0.0 + tempy@3.1.0: + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + + terser-webpack-plugin@5.3.11(webpack@5.92.1(webpack-cli@5.1.4)): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + jest-worker: 27.5.1 + schema-utils: 4.3.0 + serialize-javascript: 6.0.2 + terser: 5.37.0 + webpack: 5.92.1(webpack-cli@5.1.4) + terser-webpack-plugin@5.3.11(webpack@5.97.1): dependencies: '@jridgewell/trace-mapping': 0.3.25 @@ -15934,6 +20337,199 @@ snapshots: glob: 7.2.3 minimatch: 3.1.2 + testcafe-browser-tools@2.0.26: + dependencies: + array-find: 1.0.0 + debug: 4.4.0(supports-color@8.1.1) + dedent: 0.7.0 + del: 5.1.0 + execa: 3.4.0 + fs-extra: 10.1.0 + graceful-fs: 4.2.11 + linux-platform-info: 0.0.3 + lodash: 4.17.21 + mkdirp: 0.5.6 + mustache: 2.3.2 + nanoid: 3.3.8 + os-family: 1.1.0 + pify: 2.3.0 + pinkie: 2.0.4 + read-file-relative: 1.2.0 + which-promise: 1.0.0 + transitivePeerDependencies: + - supports-color + + testcafe-hammerhead@31.7.2: + dependencies: + '@adobe/css-tools': 4.4.1 + '@electron/asar': 3.2.18 + acorn-hammerhead: 0.6.2 + bowser: 1.6.0 + crypto-md5: 1.0.0 + debug: 4.3.1 + esotope-hammerhead: 0.6.8 + http-cache-semantics: 4.1.1 + httpntlm: 1.8.13 + iconv-lite: 0.5.1 + lodash: 4.17.21 + lru-cache: 2.6.3 + match-url-wildcard: 0.0.4 + merge-stream: 1.0.1 + mime: 1.4.1 + mustache: 2.3.2 + nanoid: 3.3.8 + os-family: 1.1.0 + parse5: 7.2.1 + pinkie: 2.0.4 + read-file-relative: 1.2.0 + semver: 7.5.3 + tough-cookie: 4.1.3 + tunnel-agent: 0.6.0 + ws: 7.5.10 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + testcafe-legacy-api@5.1.8: + dependencies: + async: 3.2.3 + dedent: 0.6.0 + highlight-es: 1.0.3 + lodash: 4.17.21 + moment: 2.30.1 + mustache: 2.3.2 + os-family: 1.1.0 + parse5: 2.2.3 + pify: 2.3.0 + pinkie: 2.0.4 + read-file-relative: 1.2.0 + strip-bom: 2.0.0 + testcafe-hammerhead: 31.7.2 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + testcafe-reporter-json@2.2.0: {} + + testcafe-reporter-list@2.2.0: {} + + testcafe-reporter-minimal@2.2.0: {} + + testcafe-reporter-spec@2.2.0: {} + + testcafe-reporter-xunit@2.2.3: {} + + testcafe-safe-storage@1.1.6: {} + + testcafe-selector-generator@0.1.0: {} + + testcafe@3.6.2: + dependencies: + '@babel/core': 7.26.0 + '@babel/plugin-proposal-async-generator-functions': 7.20.7(@babel/core@7.26.0) + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-proposal-decorators': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.26.0) + '@babel/plugin-proposal-private-methods': 7.18.6(@babel/core@7.26.0) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.26.0) + '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0) + '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) + '@babel/plugin-transform-runtime': 7.23.3(@babel/core@7.26.0) + '@babel/preset-env': 7.26.0(@babel/core@7.26.0) + '@babel/preset-flow': 7.25.9(@babel/core@7.26.0) + '@babel/preset-react': 7.26.3(@babel/core@7.26.0) + '@babel/runtime': 7.26.0 + '@devexpress/bin-v8-flags-filter': 1.3.0 + '@devexpress/callsite-record': 4.1.7 + '@types/node': 20.14.10 + address: 2.0.3 + async-exit-hook: 1.1.2 + babel-plugin-module-resolver: 5.0.0 + babel-plugin-syntax-trailing-function-commas: 6.22.0 + bowser: 2.11.0 + callsite: 1.0.0 + chai: 4.3.4 + chalk: 2.4.2 + chrome-remote-interface: 0.32.2 + coffeescript: 2.7.0 + commander: 8.3.0 + debug: 4.4.0(supports-color@8.1.1) + dedent: 0.4.0 + del: 3.0.0 + device-specs: 1.0.1 + diff: 4.0.2 + elegant-spinner: 1.0.1 + email-validator: 2.0.4 + emittery: 0.4.1 + error-stack-parser: 2.1.4 + execa: 4.1.0 + get-os-info: 1.0.2 + globby: 11.1.0 + graceful-fs: 4.2.11 + graphlib: 2.1.8 + http-status-codes: 2.3.0 + humanize-duration: 3.32.1 + import-lazy: 3.1.0 + indent-string: 1.2.2 + is-ci: 1.2.1 + is-docker: 2.2.1 + is-glob: 2.0.1 + is-podman: 1.0.1 + is-stream: 2.0.1 + json5: 2.2.3 + lodash: 4.17.21 + log-update-async-hook: 2.0.7 + make-dir: 3.1.0 + mime-db: 1.52.0 + moment: 2.30.1 + moment-duration-format-commonjs: 1.0.1 + mustache: 2.3.2 + nanoid: 3.3.8 + os-family: 1.1.0 + parse5: 1.5.1 + pify: 2.3.0 + pinkie: 2.0.4 + pngjs: 3.4.0 + pretty-hrtime: 1.0.3 + promisify-event: 1.0.0 + prompts: 2.4.2 + qrcode-terminal: 0.10.0 + read-file-relative: 1.2.0 + replicator: 1.0.5 + resolve-cwd: 1.0.0 + resolve-from: 4.0.0 + sanitize-filename: 1.6.3 + semver: 7.6.3 + set-cookie-parser: 2.7.1 + source-map-support: 0.5.21 + strip-bom: 2.0.0 + testcafe-browser-tools: 2.0.26 + testcafe-hammerhead: 31.7.2 + testcafe-legacy-api: 5.1.8 + testcafe-reporter-json: 2.2.0 + testcafe-reporter-list: 2.2.0 + testcafe-reporter-minimal: 2.2.0 + testcafe-reporter-spec: 2.2.0 + testcafe-reporter-xunit: 2.2.3 + testcafe-safe-storage: 1.1.6 + testcafe-selector-generator: 0.1.0 + time-limit-promise: 1.0.4 + tmp: 0.0.28 + tree-kill: 1.2.2 + typescript: 4.7.4 + unquote: 1.1.1 + url-to-options: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + text-extensions@2.4.0: {} + text-hex@1.0.0: {} text-table@0.2.0: {} @@ -15950,12 +20546,25 @@ snapshots: dependencies: real-require: 0.2.0 + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + through@2.3.8: {} + time-limit-promise@1.0.4: {} + + time-span@5.1.0: + dependencies: + convert-hrtime: 5.0.0 + tiny-invariant@1.3.3: {} tinycolor2@1.6.0: {} + tinyexec@0.3.2: {} + tinygradient@1.1.5: dependencies: '@types/tinycolor2': 1.4.6 @@ -15966,6 +20575,10 @@ snapshots: no-case: 2.3.2 upper-case: 1.1.3 + tmp@0.0.28: + dependencies: + os-tmpdir: 1.0.2 + tmp@0.0.33: dependencies: os-tmpdir: 1.0.2 @@ -15980,6 +20593,13 @@ snapshots: totalist@3.0.1: {} + tough-cookie@4.1.3: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + tough-cookie@4.1.4: dependencies: psl: 1.15.0 @@ -15997,20 +20617,46 @@ snapshots: dependencies: punycode: 2.3.1 + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + traverse@0.6.8: {} + + tree-kill@1.2.2: {} + trim-lines@3.0.1: {} triple-beam@1.4.1: {} trough@2.2.0: {} - ts-api-utils@2.0.0(typescript@5.3.3): + truncate-utf8-bytes@1.0.2: dependencies: - typescript: 5.3.3 + utf8-byte-length: 1.0.5 + + ts-api-utils@1.4.3(typescript@5.5.3): + dependencies: + typescript: 5.5.3 + + ts-api-utils@2.0.0(typescript@5.5.3): + dependencies: + typescript: 5.5.3 ts-custom-error@3.3.1: {} ts-interface-checker@0.1.13: {} + ts-loader@9.5.2(typescript@5.5.3)(webpack@5.92.1(webpack-cli@5.1.4)): + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.18.0 + micromatch: 4.0.8 + semver: 7.6.3 + source-map: 0.7.4 + typescript: 5.5.3 + webpack: 5.92.1(webpack-cli@5.1.4) + ts-node@10.9.2(@types/node@20.10.4)(typescript@5.3.3): dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -16028,6 +20674,25 @@ snapshots: typescript: 5.3.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optional: true + + ts-node@10.9.2(@types/node@20.14.10)(typescript@5.5.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.14.10 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.5.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 tsconfig-paths@3.15.0: dependencies: @@ -16044,6 +20709,10 @@ snapshots: tsscmp@1.0.6: {} + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + turbo-darwin-64@2.3.3: optional: true @@ -16085,6 +20754,14 @@ snapshots: type-fest@0.5.2: {} + type-fest@0.8.1: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + type-fest@4.33.0: {} + type-is@1.6.18: dependencies: media-typer: 0.3.0 @@ -16123,14 +20800,33 @@ snapshots: possible-typed-array-names: 1.0.0 reflect.getprototypeof: 1.0.10 + typedarray-to-buffer@3.1.5: + dependencies: + is-typedarray: 1.0.0 + typescript-chained-error@1.6.0: dependencies: clean-stack: 2.2.0 deepmerge: 4.3.1 ts-custom-error: 3.3.1 + typescript-eslint@7.15.0(eslint@8.57.0)(typescript@5.5.3): + dependencies: + '@typescript-eslint/eslint-plugin': 7.15.0(@typescript-eslint/parser@7.15.0(eslint@8.57.0)(typescript@5.5.3))(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/parser': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + '@typescript-eslint/utils': 7.15.0(eslint@8.57.0)(typescript@5.5.3) + eslint: 8.57.0 + optionalDependencies: + typescript: 5.5.3 + transitivePeerDependencies: + - supports-color + + typescript@4.7.4: {} + typescript@5.3.3: {} + typescript@5.5.3: {} + uglify-js@3.19.3: optional: true @@ -16147,10 +20843,14 @@ snapshots: uncrypto@0.1.3: {} + underscore@1.12.1: {} + undici-types@5.26.5: {} unicode-canonical-property-names-ecmascript@2.0.1: {} + unicode-emoji-modifier-base@1.0.0: {} + unicode-match-property-ecmascript@2.0.0: dependencies: unicode-canonical-property-names-ecmascript: 2.0.1 @@ -16162,6 +20862,8 @@ snapshots: unicorn-magic@0.1.0: {} + unicorn-magic@0.3.0: {} + unified@10.1.2: dependencies: '@types/unist': 2.0.11 @@ -16176,6 +20878,10 @@ snapshots: dependencies: crypto-random-string: 2.0.0 + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + unist-util-filter@4.0.1: dependencies: '@types/unist': 2.0.11 @@ -16207,6 +20913,8 @@ snapshots: unist-util-is: 5.2.1 unist-util-visit-parents: 5.1.3 + universal-user-agent@7.0.2: {} + universalify@0.2.0: {} universalify@2.0.1: {} @@ -16218,6 +20926,8 @@ snapshots: unpipe@1.0.0: {} + unquote@1.1.1: {} + upath@1.2.0: {} update-browserslist-db@1.1.2(browserslist@4.24.4): @@ -16241,11 +20951,17 @@ snapshots: dependencies: punycode: 2.3.1 + url-join@4.0.1: {} + + url-join@5.0.0: {} + url-parse@1.5.10: dependencies: querystringify: 2.2.0 requires-port: 1.0.0 + url-to-options@2.0.0: {} + use-callback-ref@1.3.3(@types/react@18.3.0)(react@18.3.0): dependencies: react: 18.3.0 @@ -16270,8 +20986,14 @@ snapshots: lodash.debounce: 4.0.8 react: 18.3.0 + utf8-byte-length@1.0.5: {} + util-deprecate@1.0.2: {} + uuid@10.0.0: {} + + uuid@8.3.2: {} + uuid@9.0.1: {} uvu@0.5.6: @@ -16291,6 +21013,11 @@ snapshots: vali-date@1.0.0: {} + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + validate-npm-package-name@5.0.1: {} validator@13.12.0: {} @@ -16345,6 +21072,10 @@ snapshots: dependencies: xml-name-validator: 4.0.0 + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + walker@1.0.8: dependencies: makeerror: 1.0.12 @@ -16385,6 +21116,29 @@ snapshots: - bufferutil - utf-8-validate + webpack-cli@5.1.4(webpack@5.92.1): + dependencies: + '@discoveryjs/json-ext': 0.5.7 + '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(webpack-cli@5.1.4)) + '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(webpack-cli@5.1.4)) + '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4(webpack@5.92.1))(webpack@5.92.1(webpack-cli@5.1.4)) + colorette: 2.0.20 + commander: 10.0.1 + cross-spawn: 7.0.6 + envinfo: 7.14.0 + fastest-levenshtein: 1.0.16 + import-local: 3.2.0 + interpret: 3.1.1 + rechoir: 0.8.0 + webpack: 5.92.1(webpack-cli@5.1.4) + webpack-merge: 5.10.0 + + webpack-merge@5.10.0: + dependencies: + clone-deep: 4.0.1 + flat: 5.0.2 + wildcard: 2.0.1 + webpack-sources@1.4.3: dependencies: source-list-map: 2.0.1 @@ -16392,6 +21146,47 @@ snapshots: webpack-sources@3.2.3: {} + webpack-visualizer-plugin2@1.1.0: + dependencies: + d3: 3.5.17 + mkdirp: 0.5.6 + prop-types: 15.8.1 + react: 17.0.2 + react-dom: 17.0.2(react@17.0.2) + + webpack@5.92.1(webpack-cli@5.1.4): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.6 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) + browserslist: 4.24.4 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.0 + es-module-lexer: 1.6.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.11(webpack@5.92.1(webpack-cli@5.1.4)) + watchpack: 2.4.2 + webpack-sources: 3.2.3 + optionalDependencies: + webpack-cli: 5.1.4(webpack@5.92.1) + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + webpack@5.97.1: dependencies: '@types/eslint-scope': 3.7.7 @@ -16426,15 +21221,26 @@ snapshots: dependencies: iconv-lite: 0.6.3 + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + whatwg-fetch@3.6.20: {} whatwg-mimetype@3.0.0: {} + whatwg-mimetype@4.0.0: {} + whatwg-url@11.0.0: dependencies: tr46: 3.0.0 webidl-conversions: 7.0.0 + whatwg-url@14.1.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 @@ -16479,6 +21285,12 @@ snapshots: which-module@2.0.1: {} + which-promise@1.0.0: + dependencies: + pify: 2.3.0 + pinkie-promise: 1.0.0 + which: 1.3.1 + which-typed-array@1.1.18: dependencies: available-typed-arrays: 1.0.7 @@ -16496,6 +21308,12 @@ snapshots: dependencies: isexe: 2.0.0 + wildcard@2.0.1: {} + + windows-release@5.1.1: + dependencies: + execa: 5.1.1 + winston-daily-rotate-file@4.7.1(winston@3.17.0): dependencies: file-stream-rotator: 0.6.1 @@ -16653,6 +21471,8 @@ snapshots: '@types/trusted-types': 2.0.7 workbox-core: 6.6.0 + workerpool@6.5.1: {} + wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -16673,6 +21493,13 @@ snapshots: wrappy@1.0.2: {} + write-file-atomic@3.0.3: + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + write-file-atomic@4.0.2: dependencies: imurmurhash: 0.1.4 @@ -16684,14 +21511,20 @@ snapshots: xml-name-validator@4.0.0: {} + xml-name-validator@5.0.0: {} + xmlchars@2.2.0: {} + xtend@4.0.2: {} + y18n@4.0.3: {} y18n@5.0.8: {} yallist@3.1.1: {} + yallist@4.0.0: {} + yaml@2.7.0: {} yargs-parser@18.1.3: @@ -16699,8 +21532,17 @@ snapshots: camelcase: 5.3.1 decamelize: 1.2.0 + yargs-parser@20.2.9: {} + yargs-parser@21.1.1: {} + yargs-unparser@2.0.0: + dependencies: + camelcase: 6.3.0 + decamelize: 4.0.0 + flat: 5.0.2 + is-plain-obj: 2.1.0 + yargs@15.4.1: dependencies: cliui: 6.0.0 @@ -16715,6 +21557,16 @@ snapshots: y18n: 4.0.3 yargs-parser: 18.1.3 + yargs@16.2.0: + dependencies: + cliui: 7.0.4 + escalade: 3.2.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + yargs@17.7.2: dependencies: cliui: 8.0.1 @@ -16742,6 +21594,8 @@ snapshots: yocto-queue@1.1.1: {} + yoctocolors@2.1.1: {} + zod@3.24.1: {} zustand@4.5.6(@types/react@18.3.0)(react@18.3.0): diff --git a/scripts/run_instance.sh b/scripts/run_instance.sh index 2b830577f2e1142d0715efd894c6112ba6624105..578be7584b1f0f5a1bfe6401b4d52a8f8470095d 100755 --- a/scripts/run_instance.sh +++ b/scripts/run_instance.sh @@ -13,6 +13,7 @@ OPTIONS: --wallet-endpoint=WALLET_ENDPOINT Wallet endpoint to be used by the new instance (default: 'https://wallet.hive.blog') --site-domain=SITE_DOMAIN Site domain to be used by the new instance (default: 'https://blog.hive.blog') --blog-domain=BLOG_DOMAIN Blog domain to be used by the new instance (default: 'https://blog.hive.blog') + --explorer-domain=EXPLORER_DOMAIN Explorer domain to be used by the new instance (default: 'https://explore.hive.blog') --chain-id=CHAIN_ID Chain ID to be used by the new instance (default: 'beeab0de00000000000000000000000000000000000000000000000000000000') --images-endpoint=URL IMAGES endpoint to be used by the new instance (default: 'https://images.hive.blog/') --app-scope=SCOPE App scope (eg. '@hive/auth') @@ -29,6 +30,7 @@ API_ENDPOINT=${API_ENDPOINT:-"https://api.hive.blog"} WALLET_ENDPOINT=${WALLET_ENDPOINT:-"https://wallet.hive.blog"} SITE_DOMAIN=${SITE_DOMAIN:-"https://blog.hive.blog"} BLOG_DOMAIN=${BLOG_DOMAIN:-"https://blog.hive.blog"} +EXPLORER_DOMAIN=${EXPLORER_DOMAIN:-"https://explore.openhive.network"} CHAIN_ID=${CHAIN_ID:-"beeab0de00000000000000000000000000000000000000000000000000000000"} IMAGES_ENDPOINT=${IMAGES_ENDPOINT:="https://images.hive.blog/"} TURBO_APP_SCOPE=${TURBO_APP_SCOPE:-} @@ -59,6 +61,10 @@ while [ $# -gt 0 ]; do arg="${1#*=}" BLOG_DOMAIN="$arg" ;; + --explorer-domain=*) + arg="${1#*=}" + EXPLORER_DOMAIN="$arg" + ;; --chain-id=*) arg="${1#*=}" CHAIN_ID="$arg" @@ -110,6 +116,7 @@ RUN_OPTIONS=( "--env" "REACT_APP_BLOG_DOMAIN=$BLOG_DOMAIN" "--env" "REACT_APP_IMAGES_ENDPOINT=$IMAGES_ENDPOINT" "--env" "REACT_APP_WALLET_ENDPOINT=$WALLET_ENDPOINT" + "--env" "REACT_APP_EXPLORER_DOMAIN=$EXPLORER_DOMAIN" "--env" "REACT_APP_SITE_DOMAIN=$SITE_DOMAIN" "--env" "REACT_APP_CHAIN_ID=$CHAIN_ID" "--env" "TURBO_APP_SCOPE=$TURBO_APP_SCOPE"