diff --git a/.eslintignore b/.eslintignore index 9b4fa7e2c7f..a304897c9eb 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,4 @@ /build -/.yarn \ No newline at end of file +/.yarn +/static/js/feedback-script.js +/external/keyring-api diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index f790312cfc5..7fc6c1d3c83 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,3 @@ -* @MetaMask/dev-ex +* @MetaMask/dev-ex @MetaMask/tech-writers /snaps/ @MetaMask/tech-writers @MetaMask/snaps -/wallet/ @MetaMask/tech-writers @ziad-saab +/wallet/ @MetaMask/tech-writers diff --git a/.github/workflows/build-lint.yml b/.github/workflows/build-lint.yml index f01758d2528..799f42ba7f7 100644 --- a/.github/workflows/build-lint.yml +++ b/.github/workflows/build-lint.yml @@ -9,6 +9,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 + with: + submodules: true - name: Use Node.js uses: actions/setup-node@v3 with: @@ -24,6 +26,8 @@ jobs: - prepare steps: - uses: actions/checkout@v3 + with: + submodules: true - name: Use Node.js uses: actions/setup-node@v3 with: @@ -46,6 +50,8 @@ jobs: - prepare steps: - uses: actions/checkout@v3 + with: + submodules: true - name: Use Node.js uses: actions/setup-node@v3 with: diff --git a/.github/workflows/publish-docs.yml b/.github/workflows/publish-docs.yml index 86fed01b580..9be26bdfce3 100644 --- a/.github/workflows/publish-docs.yml +++ b/.github/workflows/publish-docs.yml @@ -20,6 +20,7 @@ jobs: uses: actions/checkout@v3 with: ref: ${{ inputs.ref }} + submodules: true - name: Use Node.js uses: actions/setup-node@v3 with: diff --git a/.gitignore b/.gitignore index 8dea2eddc4a..aae1c6400f8 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ .docusaurus .cache-loader .idea +/snaps/reference/keyring-api # yarn v3 (w/o zero-install) # See: https://yarnpkg.com/getting-started/qa#which-files-should-be-gitignored diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000000..a7e1104515b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "external/keyring-api"] + path = external/keyring-api + url = git@github.com:MetaMask/keyring-api.git diff --git a/.vscode/settings.json b/.vscode/settings.json index 2ab108013fa..970b48f3b37 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,6 +1,5 @@ { "eslint.format.enable": true, - "eslint.packageManager": "yarn", "editor.codeActionsOnSave": { "source.fixAll.eslint": true }, diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b8fa32b92cd..725706d04be 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -9,6 +9,7 @@ guide in some places. - [Contribution workflow](#contribution-workflow) - [Preview locally](#preview-locally) +- [Update the submodule](#update-the-submodule) - [Style guide](#style-guide) - [Add images](#add-images) - [Format Markdown and MDX](#format-markdown-and-mdx) @@ -32,10 +33,11 @@ To contribute changes: If you don't have permission to assign yourself to it, leave a comment on the issue. 2. [Clone](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository) - this repository to your computer. + this repository to your computer and navigate into it. ```bash git clone https://github.com/MetaMask/metamask-docs.git + cd metamask-docs ``` > **Note**: If you don't have write access to this repository, you must [fork the @@ -46,10 +48,17 @@ To contribute changes: > > ```bash > git clone https://github.com//metamask-docs.git + > cd metamask-docs > git remote add upstream https://github.com/MetaMask/metamask-docs.git > ``` -3. [Create and checkout a topic branch](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging), +3. [Initialize and update the submodule.](#update-the-submodule) + + ```bash + git submodule init && git submodule update + ``` + +4. [Create and checkout a topic branch](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging), naming it appropriately. We recommend including the issue number and a short description in the branch name (for example, `183-doc-cli-option`), which is a reminder to fix only one issue in a PR. @@ -60,7 +69,7 @@ To contribute changes: > **Tip:** You can use a Git client such as [Fork](https://fork.dev/) instead of the command line. -4. Open this repository in a text editor of your choice (for example, +5. Open this repository in a text editor of your choice (for example, [VS Code](https://code.visualstudio.com/)) and make your changes. Make sure to [follow the style guidelines](https://docs-template.consensys.net/contribute/style-guide) and [format your Markdown correctly](https://docs-template.consensys.net/contribute/format-markdown). @@ -73,10 +82,10 @@ To contribute changes: > - If you delete, rename, or move a documentation file, make sure to add a > [redirect](https://docs-template.consensys.net/contribute/configure-docusaurus#redirects). -5. [Preview your changes locally](https://docs-template.consensys.net/contribute/preview) to check +6. [Preview your changes locally](https://docs-template.consensys.net/contribute/preview) to check that the changes render correctly. -6. Add and commit your changes, briefly describing your changes in the commit message. +7. Add and commit your changes, briefly describing your changes in the commit message. Push your changes to the remote origin. ```bash @@ -85,26 +94,41 @@ To contribute changes: git push origin ``` -7. On [this repository on GitHub](https://github.com/MetaMask/metamask-docs), you’ll see a banner +8. On [this repository on GitHub](https://github.com/MetaMask/metamask-docs), you’ll see a banner prompting you to create a PR with your recent changes. Create a PR, describing your changes in detail. [Link the issue](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) that your PR fixes by adding `fixes #` to the PR description. -8. Specific reviewers are automatically requested when you submit a PR. +9. Specific reviewers are automatically requested when you submit a PR. You can request additional reviewers in the right sidebar of your PR – for example, the original issue raiser. - Make any required changes to your PR based on reviewer feedback, repeating steps 4–6. + Make any required changes to your PR based on reviewer feedback, repeating steps 5–7. -9. After your PR is approved by two reviewers, all checks have passed, and your branch has no - conflicts with the main branch, you can merge your PR. - If you don't have merge access, a maintainer will merge your PR for you. - You can delete the topic branch after your PR is merged. +10. After your PR is approved by two reviewers, all checks have passed, and your branch has no + conflicts with the main branch, you can merge your PR. + If you don't have merge access, a maintainer will merge your PR for you. + You can delete the topic branch after your PR is merged. ## Preview locally [Preview the docs locally using npm or Yarn.](https://docs-template.consensys.net/contribute/preview) +## Update the submodule + +This repository uses the [`keyring-api`](https://github.com/MetaMask/keyring-api) repository as a +Git [submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules). + +Run the following command to initialize and update the submodule when you first clone the +repository, and every time the submodule's target commit is updated: + +```bash +git submodule init && git submodule update +``` + +> **Note**: You'll see when the submodule's commit is updated when you `git merge` or `git pull`. +> If you have trouble previewing the docs locally, try updating the submodule. + ## Style guide Refer to the [Consensys documentation style guide](https://docs-template.consensys.net/contribute/style-guide). diff --git a/README.md b/README.md index aeb3fd0d608..907a126d3f2 100644 --- a/README.md +++ b/README.md @@ -5,4 +5,43 @@ The documentation site is hosted at [`docs.metamask.io`](https://docs.metamask.i built using [Docusaurus](https://docusaurus.io/), a static site generator purpose-built for technical documentation. -Learn how to [contribute to the documentation](CONTRIBUTING.md). +## Build locally + +Build the documentation site locally using the following steps. + +### Prerequisites + +- [Node.js](https://nodejs.org/) version 16+ +- [Yarn](https://yarnpkg.com/) version 3 +- [Git](https://git-scm.com/) + +### Steps + +1. Clone the repository. + + ```bash + git clone https://github.com/MetaMask/metamask-docs.git + cd metamask-docs + ``` + +2. Initialize and update the [`keyring-api`](https://github.com/MetaMask/keyring-api) submodule. + + ```bash + git submodule init && git submodule update + ``` + +3. Install dependencies. + + ```bash + yarn install + ``` + +4. Start the development server. + + ```bash + yarn start + ``` + + Once the server starts, you can view the documentation at `http://localhost:3000`. + +For more information on contributing to the documentation, see the [full contribution guidelines](CONTRIBUTING.md). diff --git a/docusaurus.config.js b/docusaurus.config.js index 11939d7b5a3..bd52e3ca8ea 100644 --- a/docusaurus.config.js +++ b/docusaurus.config.js @@ -3,6 +3,7 @@ const codeTheme = require("prism-react-renderer/themes/dracula"); const remarkCodesandbox = require("remark-codesandbox"); +const path = require("path"); /** @type {import('@docusaurus/types').Config} */ const config = { @@ -32,8 +33,15 @@ const config = { scripts: [ { src: "https://cmp.osano.com/AzZMxHTbQDOQD8c1J/a2e89f0e-f467-4542-bfea-30ea2c1a6648/osano.js" }, { src: "https://plausible.io/js/script.js", defer: true, "data-domain": "docs.metamask.io" }, + { src: "/js/feedback-script.js", defer: true, async: true }, + { src: "/js/getfeedback.js", defer: true, async: true }, ], + markdown: { + mermaid: true, + }, + themes: ["@docusaurus/theme-mermaid"], + presets: [ [ "@metamask/docusaurus-openrpc/dist/preset", @@ -77,8 +85,39 @@ const config = { remarkPlugins: [ require("remark-docusaurus-tabs"), ], + admonitions: { + tag: ":::", + keywords: [ + "info", + "success", + "danger", + "note", + "tip", + "warning", + "important", + "caution", + "security", + "flaskOnly", + ], + }, }), ], + [ + "docusaurus-plugin-typedoc", + { + entryPoints: ["./external/keyring-api/src/index.ts"], + tsconfig: "./external/keyring-api/tsconfig.json", + readme: "snaps/reference/keyring-api-index/index.md", + out: path.join(__dirname, "snaps/reference/keyring-api"), + sidebar: { + filteredIds: ["reference/keyring-api/index"], + }, + useCodeBlocks: true, + expandObjects: true, + parametersFormat: "table", + hideGenerator: true, + }, + ], [ "@docusaurus/plugin-client-redirects", { @@ -114,7 +153,7 @@ const config = { }, { from: "/guide/provider-migration", - to: "/wallet/how-to/migrate-api", + to: "/wallet/concepts/apis", }, { from: "/guide/rpc-api", @@ -146,15 +185,15 @@ const config = { }, { from: "/guide/mobile-getting-started", - to: "/wallet/how-to/integrate-with-mobile", + to: "/wallet/how-to/connect/set-up-sdk", }, { from: "/guide/site-compatibility-checklist", - to: "/wallet/how-to/integrate-with-mobile", + to: "/wallet/how-to/connect/set-up-sdk", }, { from: "/guide/mobile-best-practices", - to: "/wallet/how-to/integrate-with-mobile", + to: "/wallet/how-to/connect/set-up-sdk", }, { from: "/guide/snaps", @@ -266,7 +305,7 @@ const config = { }, { from: "/wallet/how-to/use-mobile", - to: "/wallet/how-to/integrate-with-mobile", + to: "/wallet/how-to/connect/set-up-sdk", }, { from: "/wallet/how-to/use-onboarding-library", @@ -284,6 +323,26 @@ const config = { from: "/wallet/how-to/set-icon", to: "/wallet/how-to/display/icon", }, + { + from: "/wallet/concepts/provider-api", + to: "/wallet/concepts/apis", + }, + { + from: "/wallet/concepts/rpc-api", + to: "/wallet/concepts/apis", + }, + { + from: "/wallet/how-to/integrate-with-mobile", + to: "/wallet/how-to/connect/set-up-sdk", + }, + { + from: "/wallet/how-to/migrate-api", + to: "/wallet/concepts/apis", + }, + { + from: "/sdk", + to: "/wallet/how-to/connect/set-up-sdk", + }, ].reduce((acc, item) => { acc.push(item); acc.push({ from: item.from + ".html", to: item.to }); @@ -316,6 +375,10 @@ const config = { to: "wallet", label: "Wallet", }, + { + to: "/wallet/how-to/connect/set-up-sdk", + label: "SDK", + }, { to: "snaps", label: "Snaps", @@ -345,7 +408,7 @@ const config = { }, { label: "How to guides", - to: "/wallet/category/how-to", + to: "/wallet/how-to", }, { label: "Concepts", @@ -432,7 +495,7 @@ const config = { }, prism: { theme: codeTheme, - additionalLanguages: ["csharp","swift"], + additionalLanguages: ["csharp","swift","gradle","kotlin"], }, algolia: { // The application ID provided by Algolia @@ -463,6 +526,20 @@ const config = { //... other Algolia params }, + mermaid: { + options: { + fontFamily: "arial, verdana, sans-serif;", + wrap: true, + sequence: { + diagramMarginX: 25, + diagramMarginY: 25, + }, + flowchart: { + diagramPadding: 5, + nodeSpacing: 75, + }, + }, + }, }), }; diff --git a/external/keyring-api b/external/keyring-api new file mode 160000 index 00000000000..1c8eeb9beef --- /dev/null +++ b/external/keyring-api @@ -0,0 +1 @@ +Subproject commit 1c8eeb9beef7f21ca0bd394b6fe06fea856e3520 diff --git a/package.json b/package.json index 476541971be..9ad837ab054 100644 --- a/package.json +++ b/package.json @@ -15,26 +15,34 @@ "write-heading-ids": "docusaurus write-heading-ids", "typecheck": "tsc", "lint": "eslint .", - "lint:fix": "eslint . --fix" + "lint:fix": "eslint . --fix", + "postinstall": "cd external/keyring-api && yarn install" }, "dependencies": { - "@docusaurus/core": "2.4.1", - "@docusaurus/plugin-content-docs": "2.4.1", + "@docusaurus/core": "2.4.3", + "@docusaurus/plugin-content-docs": "2.4.3", + "@docusaurus/theme-common": "^2.4.3", + "@docusaurus/theme-mermaid": "^2.4.3", "@mdx-js/react": "^1.6.22", "@metamask/design-tokens": "^1.11.1", "@metamask/docusaurus-openrpc": "^0.2.2", "clsx": "^1.2.1", + "docusaurus-plugin-typedoc": "1.0.0-next.17", "node-polyfill-webpack-plugin": "^2.0.1", + "prettier": "^3.0.0", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", "react-dom": "^17.0.2", + "react-player": "^2.13.0", "remark-codesandbox": "^0.10.1", - "remark-docusaurus-tabs": "^0.2.0" + "remark-docusaurus-tabs": "^0.2.0", + "typedoc": "^0.25.1", + "typedoc-plugin-markdown": "4.0.0-next.22" }, "devDependencies": { - "@docusaurus/eslint-plugin": "2.4.1", - "@docusaurus/module-type-aliases": "2.4.1", - "@docusaurus/plugin-client-redirects": "2.4.1", + "@docusaurus/eslint-plugin": "2.4.3", + "@docusaurus/module-type-aliases": "2.4.3", + "@docusaurus/plugin-client-redirects": "2.4.3", "@lavamoat/allow-scripts": "^2.3.0", "@tsconfig/docusaurus": "^1.0.5", "@typescript-eslint/eslint-plugin": "^5.41.0", @@ -75,7 +83,8 @@ "@metamask/docusaurus-openrpc>@metamask/open-rpc-docs-react>@stoplight/mosaic>@fortawesome/fontawesome-svg-core": false, "@metamask/docusaurus-openrpc>@metamask/open-rpc-docs-react>@stoplight/mosaic>@fortawesome/fontawesome-svg-core>@fortawesome/fontawesome-common-types": false, "@docusaurus/core>webpack-dev-server>ws>bufferutil": false, - "@docusaurus/core>webpack-dev-server>ws>utf-8-validate": false + "@docusaurus/core>webpack-dev-server>ws>utf-8-validate": false, + "$root$": false } } } diff --git a/snaps-sidebar.js b/snaps-sidebar.js index abd68afde38..e1d89988817 100644 --- a/snaps-sidebar.js +++ b/snaps-sidebar.js @@ -46,7 +46,50 @@ const sidebar = { type: "category", label: "Reference", link: { type: "generated-index", slug: "/reference" }, - items: [{ type: "autogenerated", dirName: "reference" }], + items: [ + { + type: "doc", + id: "reference/rpc-api", + }, + { + type: "doc", + id: "reference/exports", + }, + { + type: "doc", + id: "reference/permissions", + }, + { + type: "category", + label: "Snaps command line interface", + link: { + type: "doc", + id: "reference/cli/index", + }, + items: [ + { + type: "doc", + id: "reference/cli/options", + }, + { + type: "doc", + id: "reference/cli/subcommands", + }, + ], + }, + { + type: "category", + label: "Keyring API", + link: { + type: "doc", + id: "reference/keyring-api/index", + }, + customProps: { + flask_only: true, + }, + items: require("./snaps/reference/keyring-api/typedoc-sidebar.cjs"), + }, + ], }, ], }; diff --git a/snaps/assets/features/locale.png b/snaps/assets/features/locale.png new file mode 100644 index 00000000000..70217677a7f Binary files /dev/null and b/snaps/assets/features/locale.png differ diff --git a/snaps/assets/keyring/accounts-ui.png b/snaps/assets/keyring/accounts-ui.png new file mode 100644 index 00000000000..08f13f4f150 Binary files /dev/null and b/snaps/assets/keyring/accounts-ui.png differ diff --git a/snaps/assets/keyring/add-snap-account.png b/snaps/assets/keyring/add-snap-account.png new file mode 100644 index 00000000000..54253be9ff2 Binary files /dev/null and b/snaps/assets/keyring/add-snap-account.png differ diff --git a/snaps/assets/keyring/asynchronous-flow.png b/snaps/assets/keyring/asynchronous-flow.png new file mode 100644 index 00000000000..a2450b6184c Binary files /dev/null and b/snaps/assets/keyring/asynchronous-flow.png differ diff --git a/snaps/assets/keyring/components-diagram.png b/snaps/assets/keyring/components-diagram.png new file mode 100644 index 00000000000..50d9470040c Binary files /dev/null and b/snaps/assets/keyring/components-diagram.png differ diff --git a/snaps/assets/keyring/create-account-flow.png b/snaps/assets/keyring/create-account-flow.png new file mode 100644 index 00000000000..952f17cb652 Binary files /dev/null and b/snaps/assets/keyring/create-account-flow.png differ diff --git a/snaps/assets/keyring/synchronous-flow.png b/snaps/assets/keyring/synchronous-flow.png new file mode 100644 index 00000000000..7ee914fe85d Binary files /dev/null and b/snaps/assets/keyring/synchronous-flow.png differ diff --git a/snaps/concepts/anatomy.md b/snaps/concepts/anatomy.md index d4f3c7ed7b9..13c212525a3 100644 --- a/snaps/concepts/anatomy.md +++ b/snaps/concepts/anatomy.md @@ -1,5 +1,5 @@ --- -description: Learn about the anatomy of a snap project. +description: Learn about the anatomy of a Snap project. sidebar_position: 1 --- @@ -23,7 +23,7 @@ template-snap-monorepo/ | | | |- index.ts | | ├─ snap.manifest.json | | ├─ package.json -| | |- ... (snap content) +| | |- ... (Snap content) ├─ package.json ├─ ... (other stuff) ``` @@ -31,24 +31,24 @@ template-snap-monorepo/ Source files other than `index.ts` are located through its imports. The defaults can be overwritten in the [configuration file](#configuration-file). -:::tip Create a snap project -When you create a new snap project using `mm-snap init`, it has all these files. +:::tip Create a Snap project +When you create a new Snap project using `mm-snap init`, it has all these files. Still, we recommend -[cloning the template snap repository to get started](../get-started/quickstart.md). +[cloning the template Snap repository to get started](../get-started/quickstart.md). ::: -This page examines the major components of a snap: +This page examines the major components of a Snap: -- [The source code](#source-code) contains the primary code of the snap. -- [The manifest file](#manifest-file) tells MetaMask important information about the snap. -- [The configuration file](#configuration-file) specifies configuration options for the snap. -- [The bundle file](#bundle-file) is the output file of the published snap. +- [The source code](#source-code) contains the primary code of the Snap. +- [The manifest file](#manifest-file) tells MetaMask important information about the Snap. +- [The configuration file](#configuration-file) specifies configuration options for the Snap. +- [The bundle file](#bundle-file) is the output file of the published Snap. ## Source code -If you're familiar with JavaScript or TypeScript development, developing a snap might feel familiar +If you're familiar with JavaScript or TypeScript development, developing a Snap might feel familiar to you. -Consider this simple snap, `hello-snap`: +Consider this simple Snap, `Hello World`: ```typescript title="index.ts" module.exports.onRpcRequest = async ({ origin, request }) => { @@ -63,64 +63,60 @@ module.exports.onRpcRequest = async ({ origin, request }) => { }; ``` -To communicate with the outside world, the snap must implement its own JSON-RPC API by exposing +To communicate with the outside world, the Snap must implement its own JSON-RPC API by exposing the exported function [`onRpcRequest`](../reference/exports.md#onrpcrequest). -Whenever the snap receives a JSON-RPC request from a dapp or another snap, this handler function is +Whenever the Snap receives a JSON-RPC request from a dapp or another Snap, this handler function is called with the specified parameters. -In addition to being able to expose a JSON-RPC API, snaps can access the global object `snap`. +In addition to being able to expose a JSON-RPC API, Snaps can access the global object `snap`. You can use this object to make Snaps-specific JSON-RPC requests. -If a dapp wants to use `hello-snap`, it can implement something like this: +If a dapp wants to use `Hello World`, assuming the Snap is published to npm using the package name `hello-snap`, the dapp can implement something like this: ```javascript -// Connect to the snap, enabling its usage inside the dapp +// Connect to the Snap, enabling its usage inside the dapp +// If the Snap is not already installed, the MetaMask user +// will be prompted to install it await window.ethereum.request({ - method: "wallet_enable", - params: [ - { - wallet_snap: { - "npm:hello-snap": { - version: "^1.0.0", - }, - }, - }, - ], + method: "wallet_requestSnaps", + params: { + "npm:hello-snap": {}, + }, }); -// Invoke the "hello" RPC method exposed by the snap -const hello = await window.ethereum.request({ +// Invoke the "hello" RPC method exposed by the Snap +const response = await window.ethereum.request({ method: "wallet_invokeSnap", params: { snapId: "npm:hello-snap", request: { method: "hello" } }, }); -console.log(hello); // 'world!' +console.log(response); // 'world!' ``` -The snap's RPC API is completely up to you, as long as it's a valid +The Snap's RPC API is completely up to you, as long as it's a valid [JSON-RPC](https://www.jsonrpc.org/specification) API. -:::tip Does my snap need to have an RPC API? +:::tip Does my Snap need to have an RPC API? No, that's also up to you! -If your snap can do something useful without receiving and responding to JSON-RPC requests, such as +If your Snap can do something useful without receiving and responding to JSON-RPC requests, such as providing [transaction insights](../reference/exports.md#ontransaction), then you can skip exporting `onRpcRequest`. However, if you want to do something such as manage the user's keys for a particular protocol and -create a dapp that, for example, sends transactions for that protocol using your snap, you must +create a dapp that, for example, sends transactions for that protocol using your Snap, you must specify an RPC API. ::: ## Manifest file -To get MetaMask to execute your snap, you must have a valid manifest file named `snap.manifest.json`, +To get MetaMask to execute your Snap, you must have a valid manifest file named `snap.manifest.json`, located in your package root directory. -The manifest file of `hello-snap` would look something like this: +The manifest file of `Hello World` would look something like this: ```json { "version": "1.0.0", - "proposedName": "hello-snap", - "description": "A snap that says hello!", + "proposedName": "Hello World", + "description": "A Snap that says hello!", "repository": { "type": "git", "url": "https://github.com/Hello/hello-snap.git" @@ -141,62 +137,50 @@ The manifest file of `hello-snap` would look something like this: } ``` -The manifest tells MetaMask important information about your snap, such as where it's published -(using `source.location`) and how to verify the integrity of the snap source code (by attempting to +The manifest tells MetaMask important information about your Snap, such as where it's published +(using `source.location`) and how to verify the integrity of the Snap source code (by attempting to reproduce the `source.shasum` value). :::note -Currently, snaps can only be +Currently, Snaps can only be [published to the official npm registry](https://docs.npmjs.com/packages-and-modules/contributing-packages-to-the-registry), and the manifest must also match the corresponding fields of the `package.json` file. -In the future, developers will be able to distribute snaps in different ways, and the manifest will +In the future, developers will be able to distribute Snaps in different ways, and the manifest will expand to support different publishing solutions. -The [snaps publishing specification](https://github.com/MetaMask/SIPs/blob/main/SIPS/sip-9.md) +The [Snaps publishing specification](https://github.com/MetaMask/SIPs/blob/main/SIPS/sip-9.md) details the requirements of both `snap.manifest.json` and its relationship to `package.json`. ::: You might need to modify some manifest fields manually. -For example, if you change the location of the (optional) icon SVG file, you must update +For example, if you change the location of the icon SVG file, you must update `source.location.npm.iconPath` to match. You can also use the [command line](../reference/cli/index.md) to update some fields for you. For example, `mm-snap build` or `mm-snap manifest --fix` updates `source.shasum`. ## Configuration file -The snap configuration file, `snap.config.js`, should be placed in the project root directory. +The Snap configuration file, `snap.config.ts`, should be placed in the project root directory. You can override the default values of the [Snaps CLI options](../reference/cli/options.md) by specifying -them in the `cliOptions` property of the configuration file. +them in the `config` object of the configuration file. For example: -```javascript -module.exports = { - cliOptions: { - src: "lib/index.js", - dist: "out", - port: 9000, - }, -}; -``` - -If you want to customize the Browserify build process, you can provide the `bundlerCustomizer` property. -It's a function that takes one argument, the -[browserify object](https://github.com/browserify/browserify#api-example) which MetaMask uses -internally to bundle the snap. -You can transform it in any way you want, for example, adding plugins. -The `bundleCustomizer` function looks something like this: +```ts +import { resolve } from 'path'; +import type { SnapConfig } from '@metamask/snaps-cli'; -```javascript -const brfs = require("brfs"); - -module.exports = { - cliOptions: { - /* ... */ +const config: SnapConfig = { + bundler: 'webpack', + input: resolve(__dirname, 'src/index.ts'), + server: { + port: 8080, }, - bundlerCustomizer: (bundler) => { - bundler.transform(brfs); + polyfills: { + buffer: true, }, }; + +export default config; ``` :::note @@ -208,12 +192,18 @@ shouldn't contain any secrets. ## Bundle file -Because of the way snaps are executed, they must be published as a single `.js` file containing the +Because of the way Snaps are executed, they must be published as a single `.js` file containing the entire source code and all dependencies. Moreover, the [Snaps execution environment](execution-environment.md) has no DOM, no Node.js APIs, and no filesystem access, so anything that relies on the DOM doesn't work, and any Node -built-ins must be bundled along with the snap. +built-ins must be bundled along with the Snap. -Use the command `mm-snap build` to bundle your snap using [Browserify](https://browserify.org). +Use the command `mm-snap build` to bundle your Snap using +[webpack](https://webpack.js.org/) or +[Browserify](https://browserify.org). This command finds all dependencies using your specified main entry point and outputs a bundle file to your specified output path. + +:::note +If you are using the template Snap monorepo, running `yarn start` will bundle your Snap for you. +::: diff --git a/snaps/concepts/design-guidelines.md b/snaps/concepts/design-guidelines.md index 0d81f1025f5..c72114e19ba 100644 --- a/snaps/concepts/design-guidelines.md +++ b/snaps/concepts/design-guidelines.md @@ -1,29 +1,29 @@ --- -description: Learn about best practices for creating snap installation flows. +description: Learn about best practices for creating Snap installation flows. sidebar_position: 5 --- # Snaps design guidelines -This page outlines guiding principles for designers, developers, builders, and writers to create snap installation flows that are accessible to all users. Use these guidelines when introducing your snap within a dapp or website. +This page outlines guiding principles for designers, developers, builders, and writers to create Snap installation flows that are accessible to all users. Use these guidelines when introducing your Snap within a dapp or website. ## Why this matters -The snap installation process contains critical info about your snap, including what it does, how it enhances your application, and why it’s beneficial for users. It's important to provide this information on your website or dapp to help users understand the purpose and benefits of the snap before installing it. Without this information, users may drop out during installation or install the snap without fully understanding its purpose. +The Snap installation process contains critical info about your Snap, including what it does, how it enhances your application, and why it’s beneficial for users. It's important to provide this information on your website or dapp to help users understand the purpose and benefits of the Snap before installing it. Without this information, users may drop out during installation or install the Snap without fully understanding its purpose. ## Guidelines at a glance **Metadata must-haves** - Keep your name to **21 characters or less** (including spaces). -- Never use “snap” in your snap’s name. Use the space for something more descriptive. +- Never use “Snap” in your Snap’s name. Use the space for something more descriptive. - Your avatar should fit in a **32px circular frame, SVG format**. - Always aim for a short and simple copy. **Before** asking for permission to install, provide users with **clear and concise information** about: -- _What_ the snap does and _how_ it meets their needs. -- _How_ the snap works. +- _What_ the Snap does and _how_ it meets their needs. +- _How_ the Snap works. - Any _security precautions_ they may need to know about. Write in active voice and use sentence case. Avoid jargon—write in plain language that can be understood at a glance. @@ -44,69 +44,69 @@ Consider whether the details that interest you as a developer are relevant to th Identify synonyms and eliminate them. Each important object and action should have a single word to represent it. Inconsistency can blur the lines for users, creating uncertainty and confusion. -## Introducing your snap +## Introducing your Snap -Use conversational language when explaining the snap. If you need to use a technical term, briefly define it so everyone can understand. Avoid jargon whenever possible, and keep your words short and simple. Introduce your snap in the context of your application to make it clear what the user gets if they install it. +Use conversational language when explaining the Snap. If you need to use a technical term, briefly define it so everyone can understand. Avoid jargon whenever possible, and keep your words short and simple. Introduce your Snap in the context of your application to make it clear what the user gets if they install it. -![Introducing your snap's features via a modal](../assets/install-modal.png) +![Introducing your Snap's features via a modal](../assets/install-modal.png) -:::note How to (not) describe what your snap does +:::note How to (not) describe what your Snap does **Don'ts** -❌ _Allow the snap to perform actions that run periodically at fixed times, dates, or intervals. This can be used to trigger time-sensitive interactions or notifications._ +❌ _Allow the Snap to perform actions that run periodically at fixed times, dates, or intervals. This can be used to trigger time-sensitive interactions or notifications._ -❌ _Allow this snap to display notifications regarding your Ethereum Name Service expiration._ +❌ _Allow this Snap to display notifications regarding your Ethereum Name Service expiration._ **Do's** -✅ _Let this snap schedule and run recurring tasks or notifications._ +✅ _Let this Snap schedule and run recurring tasks or notifications._ -✅ _Let this snap notify you when your ENS is about to expire._ +✅ _Let this Snap notify you when your ENS is about to expire._ ::: -### Details to include when introducing your snap +### Details to include when introducing your Snap -This is your chance to share the benefits of your snap with the intended user. If it isn’t clear what a user stands to gain from your snap, chances are they won’t even install it. So don’t be afraid to think like a marketer and emphasize the benefits of your snap. +This is your chance to share the benefits of your Snap with the intended user. If it isn’t clear what a user stands to gain from your Snap, chances are they won’t even install it. So don’t be afraid to think like a marketer and emphasize the benefits of your Snap. -Consider introducing your snap on your website with a modal, tooltip, or card. This introduction can happen before or alongside the installation prompt, but should always be clear and descriptive. +Consider introducing your Snap on your website with a modal, tooltip, or card. This introduction can happen before or alongside the installation prompt, but should always be clear and descriptive. #### Important details include: -- What your snap does, why someone would use it, and how it works. +- What your Snap does, why someone would use it, and how it works. - Security precautions in plain, basic language that anyone can understand. -- Descriptions of the features that make your snap appealing to the intended users. +- Descriptions of the features that make your Snap appealing to the intended users. :::tip Tip -Some studies estimate users read only 20-28% of the text on any screen, so write about your snap with language that’s impactful, clear, and direct. +Some studies estimate users read only 20-28% of the text on any screen, so write about your Snap with language that’s impactful, clear, and direct. ::: ## Embedded in existing flows -Introduce the snap as a natural extension of existing elements on your screen, and suggest installation when the time is right. This can be a make or break moment for your snap, so put yourself in the shoes of the intended user. +Introduce the Snap as a natural extension of existing elements on your screen, and suggest installation when the time is right. This can be a make or break moment for your Snap, so put yourself in the shoes of the intended user. -At what point does it make the most sense to prompt an install? Don’t ask the user to install your snap before they do anything in the dapp or website, as they will probably decline. Instead, **wait to prompt installation** **until a point where the snap is required**. +At what point does it make the most sense to prompt an install? Don’t ask the user to install your Snap before they do anything in the dapp or website, as they will probably decline. Instead, **wait to prompt installation** **until a point where the Snap is required**. -In the following example, a key management snap is suggested in the context of a network picker screen. +In the following example, a key management Snap is suggested in the context of a network picker screen. -![Installation and connection to your snap embedded in existing flows](../assets/picker.png) +![Installation and connection to your Snap embedded in existing flows](../assets/picker.png) ## Making the most of your metadata -Your snap’s avatar and name will be among the first things a user sees when deciding whether to install your snap. These are also a key part of your identity, so it’s worth spending a bit of time on this step. +Your Snap’s avatar and name will be among the first things a user sees when deciding whether to install your Snap. These are also a key part of your identity, so it’s worth spending a bit of time on this step. **Avatar** -Your snap’s avatar should be suitable for a **32 px circular frame in SVG format**. Avoid using images with small details, as they won't be impactful in the allotted space. Aim for something bold, simple, and easily understood. +Your Snap’s avatar should be suitable for a **32 px circular frame in SVG format**. Avoid using images with small details, as they won't be impactful in the allotted space. Aim for something bold, simple, and easily understood. **Name** -Your snap's name should be short and easy to remember. It should be **21 characters maximum**, **including spaces**, to ensure that it is easy to read and fits comfortably on small screens. +Your Snap's name should be short and easy to remember. It should be **21 characters maximum**, **including spaces**, to ensure that it is easy to read and fits comfortably on small screens. -Using a descriptive name can help users understand how they will benefit from installing your snap, and may increase the likelihood that they will install and use it. **Never** use the word **“snap”** in your name — your name should be specific and memorable, and which will differentiate your snap from others. +Using a descriptive name can help users understand how they will benefit from installing your Snap, and may increase the likelihood that they will install and use it. **Never** use the word **“Snap”** in your name — your name should be specific and memorable, and which will differentiate your Snap from others. -:::note How to (not) name your snap +:::note How to (not) name your Snap **Don'ts** @@ -126,9 +126,9 @@ Using a descriptive name can help users understand how they will benefit from in ::: -![How your snap’s avatar and name is displayed during installation](../assets/install.png) -![How your snap’s name is displayed during transaction insights](../assets/insights.png) -![How your snap’s avatar and name is displayed during a custom dialog screen](../assets/dialog.png) +![How your Snap’s avatar and name is displayed during installation](../assets/install.png) +![How your Snap’s name is displayed during transaction insights](../assets/insights.png) +![How your Snap’s avatar and name is displayed during a custom dialog screen](../assets/dialog.png) ## Upleveling your copy diff --git a/snaps/concepts/execution-environment.md b/snaps/concepts/execution-environment.md index da962b23e07..44c96242bf7 100644 --- a/snaps/concepts/execution-environment.md +++ b/snaps/concepts/execution-environment.md @@ -31,13 +31,13 @@ The following globals are also available: The execution environment is instrumented in this way to: -1. Prevent snaps from influencing any other running code, including MetaMask itself. - That is, prevent all snaps from polluting the global environment and malicious snaps from +1. Prevent Snaps from influencing any other running code, including MetaMask itself. + That is, prevent all Snaps from polluting the global environment and malicious Snaps from stealing the user's stuff. -1. Prevent snaps from accessing sensitive JavaScript APIs (such as `fetch`) without permission. +1. Prevent Snaps from accessing sensitive JavaScript APIs (such as `fetch`) without permission. 1. Ensure that the execution environment is "fully virtualizable," that is, platform-independent. -This allows you to safely execute snaps anywhere, without the snap needing to worry about where and +This allows you to safely execute Snaps anywhere, without the Snap needing to worry about where and how it's executed. ## Secure ECMAScript (SES) diff --git a/snaps/concepts/keyring-api.md b/snaps/concepts/keyring-api.md new file mode 100644 index 00000000000..87ebef87467 --- /dev/null +++ b/snaps/concepts/keyring-api.md @@ -0,0 +1,291 @@ +--- +description: Learn about the Snaps Keyring API. +sidebar_position: 6 +sidebar_custom_props: + flask_only: true +--- + +# About the Keyring API + +:::flaskOnly +::: + +:::tip API documentation +See the [Keyring API reference](../reference/keyring-api/index.md) for all the Keyring API methods. +::: + +The Snaps Keyring API integrates custom EVM accounts inside MetaMask. +Previously, you needed a companion dapp to display custom EVM accounts, such multi-party computation +(MPC) accounts. +Now you can display these custom accounts alongside regular MetaMask accounts in the UI: + +

+Keyring Snap accounts in Metamask UI +

+ +[Create a Keyring Snap to integrate custom EVM accounts in MetaMask.](../tutorials/custom-evm-accounts.md) +Your dapp can then use the [`eth_requestAccounts`](/wallet/reference/eth_requestaccounts) MetaMask +JSON-RPC API method to connect to the custom accounts, and seamlessly interact with them using other +[JSON-RPC methods](/wallet/reference/eth_subscribe). + +## Terminology + +The following terminology is used across the Keyring API: + +- **Blockchain account**: An object in a single blockchain, representing an account, with its + balance, nonce, and other account details. +- **Request**: A request from a dapp to MetaMask. +- **Keyring account**: An account model that represents one or more blockchain accounts. +- **Keyring Snap**: A Snap that implements the Keyring API. +- **Keyring request**: A request from MetaMask to a Keyring Snap. + MetaMask wraps the original request sent by the dapp and adds some metadata to it. + +## Components diagram + +The following diagram shows the components you encounter when interacting with accounts managed by a +Keyring Snap: + +

+ +```mermaid +graph TD + User -->|Starts a request| Dapp + Dapp -->|Submits a request| MetaMask + MetaMask -->|Submits requests
and manages accounts| Snap + Site[Snap UI] -->|Manages requests
and accounts| Snap + User -.->|Uses for
Snap-specific logic| Site +``` + +

+ +- **User**: The user interacting with the Snap, the dapp, and MetaMask. +- **Dapp**: The dapp requesting an action to be performed on an account. +- **MetaMask**: The wallet the dapp connects to. + MetaMask routes requests to the Keyring Snaps and lets the user perform some level of account management. +- **Snap**: A Snap that implements the Keyring API to manage the user's accounts, and to handle + requests that use these accounts. +- **Snap UI**: The Snap's UI component that allows the user to interact with the Snap to perform + custom operations on accounts and requests. + +## Keyring interface + +The first step to create a Keyring Snap is to implement the +[`Keyring`](../reference/keyring-api/type-aliases/Keyring.md) interface. +This interface describes all the methods necessary to make your custom EVM accounts work inside +MetaMask with your own logic. + +The following sections describe the different flows that the `Keyring` interface handles. + +### Snap account creation flow + +The first interaction between users and the Keyring Snap is the Snap account creation process. +The flow looks like the following: + +```mermaid +%%{ + init: { + 'sequence': { + 'actorMargin': 25, + 'width': 225 + } + } +}%% + +sequenceDiagram +autonumber + +actor User +participant MetaMask +participant Snap +participant Site as Snap UI + +alt Optional + User ->>+ MetaMask: Add new Snap account + MetaMask ->> MetaMask: Display suggested Snaps + User ->> MetaMask: Select Snap + MetaMask ->> Site: Open in a new tab + deactivate MetaMask +end + +alt If the Snap is not installed yet + Site ->>+ MetaMask: Install Snap + MetaMask ->> MetaMask: Display permissions dialog + User ->> MetaMask: Approve permissions + MetaMask -->>- Site: OK +end + +User ->>+ Site: Create new account +Site ->> Site: Custom logic to create account +Site ->>+ Snap: keyring_createAccount(options) +Snap ->> Snap: Custom logic to create account +Snap ->>+ MetaMask: snap_manageAccounts("event:accountCreated", account) +User ->> MetaMask: Approve account creation +MetaMask -->>- Snap: OK +Snap -->>- Site: OK +Site -->>- User: Done +``` + +The MetaMask account selection modal has an option called **Add Snap account**: + +

+Add Snap account option +

+ +This option shows a list of Keyring Snaps. +Each Snap redirects the user to the companion dapp that contains all the UI to configure and manage the Snap. + +The dapp presents a custom UI allowing the user to configure their custom EVM account. +The dapp uses the [`createAccount`](../reference/keyring-api/classes/KeyringSnapRpcClient.md#createaccount) +method of the `KeyringSnapRpcClient`, which calls the `Keyring` interface's method of the same name. +You can find an example of this in the [example Keyring Snap companion dapp](https://github.com/MetaMask/snap-simple-keyring/blob/d3f7f0156c59059c995fea87f90a3d0ad3a4c135/packages/site/src/pages/index.tsx#L136). + +The `createAccount` method of the `Keyring` interface creates the account based on the parameters passed +to the method. +The Snap keeps track of the accounts that it creates using [`snap_manageState`](../reference/rpc-api.md#snap_managestate). +Once the Snap has created an account, it notifies MetaMask using the +[`createAccount`](../reference/rpc-api.md#createaccount) sub-method of `snap_manageAccounts`. +You can find an example of this process in the +[example companion dapp](https://github.com/MetaMask/snap-simple-keyring/blob/d3f7f0156c59059c995fea87f90a3d0ad3a4c135/packages/snap/src/keyring.ts#L61). + +Once the Snap has created an account, that account can be used to sign messages and transactions. + +### Synchronous signing flow + +If the Keyring Snap can sign transactions directly, it implements a simple synchronous signing flow. +If the Snap needs a third party such as a hardware key or a second account's signature (for example, +in a threshold signature scheme), it implements an [asynchronous signing flow](#asynchronous-signing-flow). +The synchronous flow looks like the following: + +```mermaid +%%{ + init: { + 'sequence': { + 'actorMargin': 25, + 'width': 225 + } + } +}%% + +sequenceDiagram + autonumber + + actor User + participant Dapp + participant MetaMask + participant Snap + + User ->>+ Dapp: Create new sign request + Dapp ->>+ MetaMask: personal_sign(request) + User -) MetaMask: Approve operation + + MetaMask ->>+ Snap: keyring_submitRequest(request) + Snap ->> Snap: Add request to Snap's state + Snap ->> Snap: signature = signRequest(request) + Snap -->>- MetaMask: signature + + MetaMask -->>- Dapp: signature + + Dapp -->>- User: Signature +``` + +See the [example Keyring Snap companion dapp](https://github.com/MetaMask/snap-simple-keyring) for a +full example. + +The flow starts when a dapp calls a [MetaMask JSON-RPC method](/wallet/reference/eth_subscribe), or +when the user initiates a new funds transfer from the MetaMask UI. +At that point, MetaMask detects that this interaction is requested for an account controlled by the +Keyring Snap. + +After the user approves the transaction in the UI, MetaMask calls the `submitRequest` method of the +`Keyring` interface. +`submitRequest` receives the original RPC request, and returns a +[`SubmitRequestResponse`](../reference/keyring-api/variables/SubmitRequestResponseStruct.md) +with `pending` set to `false`, and `result` set to the requested signature. + +:::caution important +If the Keyring Snap receives an +[`eth_sendTransaction`](/wallet/reference/eth_sendTransaction) request, it should treat it like an +[`eth_signTransaction`](https://ethereum.org/en/developers/docs/apis/json-rpc/#eth_signtransaction) request. +That is, the Snap is responsible for providing the signature in the response, and MetaMask is +responsible for broadcasting the transaction. +::: + +### Asynchronous signing flow + +If the Keyring Snap implements a complex scheme such as threshold signing, it implements an +asynchronous signing flow with more `Keyring` methods. +The asynchronous flow looks like the following: + +```mermaid +%%{ + init: { + 'sequence': { + 'actorMargin': 20, + 'width': 200 + } + } +}%% + +sequenceDiagram + autonumber + + actor User + participant Dapp + participant MetaMask + participant Snap + participant Site as Snap's UI + + User ->>+ Dapp: Create new sign request + Dapp ->>+ MetaMask: personal_sign(request) + User -) MetaMask: Approve operation + + MetaMask ->>+ Snap: keyring_submitRequest(request) + Snap ->> Snap: Add request to Snap's state + Snap -->>- MetaMask: OK + deactivate MetaMask + + loop Polling + Site ->>+ Snap: keyring_listRequests() + Snap -->>- Site: requests + + alt There is a pending request + User ->>+ Site: Approve request + Site ->>+ Snap: keyring_approveRequest(id) + Snap ->> Snap: signature = signRequest(request) + Snap ->>+ MetaMask: snap_manageAccounts("submit", id, signature) + + MetaMask -->> Dapp: signature + MetaMask -->>- Snap: OK + Snap -->>- Site: OK + deactivate Site + + Dapp -->>- User: Signature + end + end +``` + +The flow starts the same way as the [synchronous flow](#synchronous-signing-flow): a dapp or user +initiates a request to sign a transaction or arbitrary data. +After approval, the `submitRequest` method of the Snap's `Keyring` interface is called. + +Since the Snap doesn't answer the request directly, it stores the pending request in its internal +state using [`snap_manageState`](../reference/rpc-api.md#snap_managestate). +This list of pending requests is returned when the `listRequests` or `getRequest` methods of the +`Keyring` interface are called. + +After storing the pending request, the Snap creates a pop-up using +[`snap_dialog`](../reference/rpc-api.md#snap_dialog) instructing the user to go to the companion +dapp's URL. + +The dapp lists the Snap's pending requests using an RPC call facilitated by the +[`listRequests`](../reference/keyring-api/classes/KeyringSnapRpcClient.md#listrequests) +method of the `KeyringSnapRpcClient`. +The user can then act on those requests using whatever process applies to the Snap. + +Once the signing process completes, the companion dapp resolves the request using the +[`approveRequest`](../reference/keyring-api/classes/KeyringSnapRpcClient.md#approverequest) +method of the `KeyringSnapRpcClient`, which calls the `Keyring` interface's method of the same name. +This method receives the request's ID and final result. + +When `approveRequest` is called, it can resolve the pending request by using the +[`submitResponse`](../reference/rpc-api.md#submitresponse) sub-method of `snap_manageAccounts`. diff --git a/snaps/concepts/lifecycle.md b/snaps/concepts/lifecycle.md index 8a5b09e711f..4efa63970e3 100644 --- a/snaps/concepts/lifecycle.md +++ b/snaps/concepts/lifecycle.md @@ -1,22 +1,20 @@ --- -description: Learn about the lifecycle of a snap. +description: Learn about the lifecycle of a Snap. sidebar_position: 2 --- # Snaps lifecycle Just like [service workers](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API) or -AWS lambda functions, snaps are designed to wake up in response to messages/events, and shut down +AWS lambda functions, Snaps are designed to wake up in response to messages/events, and shut down when idle. Snaps have an ephemeral lifecycle: they're here one moment, gone the next. -Also, if MetaMask detects that a snap becomes unresponsive, it shuts the snap down. -This doesn't mean that you can't create long-running snaps, but it does mean that your snaps must -handle being shut down, especially when they're not within the JSON-RPC request/response cycle. +Also, if MetaMask detects that a Snap becomes unresponsive, it shuts the Snap down. -A snap is considered unresponsive if: +A Snap is considered unresponsive if: 1. It hasn't received a JSON-RPC request for 30 seconds. 1. It takes more than 60 seconds to process a JSON-RPC request. -Stopped snaps start whenever they receive a JSON-RPC request, unless they're disabled. -If a snap is disabled, the user must re-enable it before it can start again. +Stopped Snaps start whenever they receive a JSON-RPC request, unless they're disabled. +If a Snap is disabled, the user must re-enable it before it can start again. diff --git a/snaps/concepts/user-interface.md b/snaps/concepts/user-interface.md index 697ad10e3b3..5f036595666 100644 --- a/snaps/concepts/user-interface.md +++ b/snaps/concepts/user-interface.md @@ -1,28 +1,28 @@ --- -description: Learn about the user interface of a snap. +description: Learn about the user interface of a Snap. sidebar_position: 3 --- # Snaps user interface -Any snap must represent itself and what it does to the end user. -Using the MetaMask settings page, the user can see their installed snaps. -For each snap, the user can: +Any Snap must represent itself and what it does to the end user. +Using the MetaMask settings page, the user can see their installed Snaps. +For each Snap, the user can: - See most of its manifest data. - See its execution status (running, stopped, or crashed). -- Enable and disable the snap. +- Enable and disable the Snap. -Other than the settings page, a snap can modify the MetaMask UI using +Other than the settings page, a Snap can modify the MetaMask UI using [custom UI](../how-to/use-custom-ui.md) in only two ways: - By opening a dialog using the [`snap_dialog`](../reference/rpc-api.md#snap_dialog) RPC method. - By returning transaction insights from the [`onTransaction`](../reference/exports.md#ontransaction) export. -This means that most snaps must rely on dapps/websites and their own RPC methods to present their +This means that most Snaps must rely on dapps/websites and their own RPC methods to present their data to the user. -Providing more ways for snaps to modify the MetaMask UI is an important goal of the Snaps system, -and over time more and more snaps will be able to contain their user interfaces entirely within +Providing more ways for Snaps to modify the MetaMask UI is an important goal of the Snaps system, +and over time more and more Snaps will be able to contain their user interfaces entirely within MetaMask itself. diff --git a/snaps/get-started/install-flask.md b/snaps/get-started/install-flask.md new file mode 100644 index 00000000000..fdb069440cd --- /dev/null +++ b/snaps/get-started/install-flask.md @@ -0,0 +1,35 @@ +--- +description: Install MetaMask Flask to start building your own Snaps. +sidebar_position: 1 +--- + +# Install MetaMask Flask + +To get started building your own Snaps, you must [install the MetaMask Flask browser extension](#install-the-metamask-flask-browser-extension). + +:::danger Developers only +MetaMask Flask is an experimental tool only for developers. +If you are not a developer, you should not install MetaMask Flask. +::: + +## Prerequisites + +- Up-to-date Chromium or Firefox browser +- [Node.js](https://nodejs.org/) version 16 or later +- [Yarn](https://yarnpkg.com/) version 3 + +## Install the MetaMask Flask browser extension + +[MetaMask Flask](https://metamask.io/flask/) is an experimental playground that provides developers +access to upcoming MetaMask features. It is available as a browser extension. + +While a small set of audited Snaps are allowlisted in the stable version of the MetaMask browser +extension, MetaMask Flask is intended for developers building and testing Snaps locally or from npm. +Also, new Snaps API features are enabled in Flask for testing and developer feedback before they're +enabled in MetaMask stable. + +:::caution Install in a new browser profile +Install the [Metamask Flask browser extension](https://chrome.google.com/webstore/detail/metamask-flask-developmen/ljfoeinjpaedjfecbmggjgodbgkmjkjk) +in a new browser profile, or disable any existing installed versions of MetaMask before installing +Flask. Running multiple instances of MetaMask in the same browser profile breaks dapp interactions. +::: diff --git a/snaps/get-started/install-snaps.md b/snaps/get-started/install-snaps.md deleted file mode 100644 index 7d442962865..00000000000 --- a/snaps/get-started/install-snaps.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -description: Install Snaps dependencies. -sidebar_position: 1 ---- - -# Install Snaps - -To install Snaps, you must [install the MetaMask Flask browser extension](#install-the-metamask-flask-browser-extension). - -## Prerequisites - -- Up-to-date Chromium or Firefox browser -- [Node.js](https://nodejs.org/) version 16 or later -- [Yarn](https://yarnpkg.com/) version 3 - -## Install the MetaMask Flask browser extension - -[MetaMask Flask](https://metamask.io/flask/) is an experimental playground that provides developers -access to upcoming MetaMask features. It is available as a browser extension. - -Snaps is the first feature rolled out in the Flask environment. - -:::caution Install in a new browser profile -Install the [Metamask Flask browser extension](https://chrome.google.com/webstore/detail/metamask-flask-developmen/ljfoeinjpaedjfecbmggjgodbgkmjkjk) in a new browser profile, or disable any existing installed versions of MetaMask before installing -Flask. Running multiple instances of MetaMask in the same browser profile breaks dapp interactions. -::: diff --git a/snaps/get-started/quickstart.md b/snaps/get-started/quickstart.md index 22a926e6f77..b224f2a341a 100644 --- a/snaps/get-started/quickstart.md +++ b/snaps/get-started/quickstart.md @@ -6,14 +6,14 @@ sidebar_position: 2 # Snaps quickstart Get started with Snaps using the [`@metamask/create-snap` CLI](https://github.com/MetaMask/snaps/tree/main/packages/create-snap). -With the CLI, you can initialize a snap monorepo project built with TypeScript and React. +With the CLI, you can initialize a Snap monorepo project built with TypeScript and React. ## Prerequisites -- [Snaps installed](install-snaps.md) +- [MetaMask Flask installed](install-flask.md) :::tip - Snaps works with the latest LTS version of Node.js, but we recommend using the version specified in + MetaMask Snaps works with the latest LTS version of Node.js, but we recommend using the version specified in the template's [`.nvmrc`](https://github.com/MetaMask/template-snap-monorepo/blob/main/.nvmrc) file. ::: @@ -22,7 +22,7 @@ With the CLI, you can initialize a snap monorepo project built with TypeScript a ## Create the project -Create a new snap project using the [`@metamask/create-snap` CLI](https://github.com/MetaMask/snaps/tree/main/packages/create-snap) by running: +Create a new Snap project using the [`@metamask/create-snap` CLI](https://github.com/MetaMask/snaps/tree/main/packages/create-snap) by running: ```bash yarn create @metamask/snap your-snap-name @@ -34,9 +34,9 @@ or npm create @metamask/snap your-snap-name ``` -See the section [Snaps anatomy](../concepts/anatomy.md) to learn about the anatomy of your snap project files. +See the section [Snaps anatomy](../concepts/anatomy.md) to learn about the anatomy of your Snap project files. -## Start the snap +## Start the Snap From the root of the newly created project, install the project dependencies using Yarn: @@ -50,20 +50,20 @@ Start the development server: yarn start ``` -You are now serving the snap and its front-end at [`http://localhost:8000`](http://localhost:8000/). +You are now serving the Snap at [`http://localhost:8080`](http://localhost:8080/) and its front-end at [`http://localhost:8000`](http://localhost:8000/). -## Connect to the snap +## Connect to the Snap On the front-end, select the **Connect** button and the MetaMask Flask extension pops up and -requires you to approve the snap's permissions. +requires you to approve the Snap's permissions. Once connected, select the **Send message** button to display a custom message within a confirmation -screen in MetaMask. +screen in MetaMask Flask. -## Customize the snap +## Customize the Snap Open the project in a text editor. -You can customize your snap by editing `index.ts` in the `packages/snap/src` folder. +You can customize your Snap by editing `index.ts` in the `packages/snap/src` folder. `index.ts` contains an example request that uses the [`snap_dialog`](../reference/rpc-api.md#snapdialog) method to display a custom confirmation screen: @@ -83,7 +83,7 @@ export const onRpcRequest: OnRpcRequestHandler = ({ origin, request }) => { text(`Hello, **${origin}**!`), text('This custom confirmation is just for display purposes.'), text( - 'But you can edit the snap source code to make it do something, if you want to!', + 'But you can edit the Snap source code to make it do something, if you want to!', ), ]), }, @@ -94,15 +94,15 @@ export const onRpcRequest: OnRpcRequestHandler = ({ origin, request }) => { }; ``` -Edit the text in the `description` or `textAreaContent` field and select the **Reconnect** button -on the front-end to re-install the snap. +Edit the text in any `text()` component and select the **Reconnect** button +on the front-end to re-install the Snap. :::note -MetaMask automatically re-installs locally hosted snaps whenever it receives a connection request +MetaMask Flask automatically re-installs locally hosted Snaps whenever it receives a connection request for them. ::: The next time you select the **Send message** button, you see the updated text in the confirmation screen. -You've now successfully connected, installed, interacted with, and customized your snap! -Learn more about [developing a snap](../how-to/develop-a-snap.md). +You've now successfully connected, installed, interacted with, and customized your Snap! +Learn more about [developing a Snap](../how-to/develop-a-snap.md). diff --git a/snaps/how-to/develop-a-snap.md b/snaps/how-to/develop-a-snap.md index 2fde0adf6d1..cf99652536d 100644 --- a/snaps/how-to/develop-a-snap.md +++ b/snaps/how-to/develop-a-snap.md @@ -1,30 +1,31 @@ --- -description: Develop, test, and publish a snap. +description: Develop, test, and publish a Snap. sidebar_position: 1 --- -# Develop a snap +# Develop a Snap -A snap can extend the dapp-facing [MetaMask JSON-RPC API](/wallet/reference/rpc-api) in +A Snap can extend the dapp-facing [MetaMask JSON-RPC API](/wallet/reference/rpc-api) in arbitrary ways, or integrate with and extend the functionality of MetaMask using the -[Snaps JSON-RPC API](../reference/rpc-api.md) and [permissions](request-permissions.md). +[Snaps Exports](../reference/exports.md), [Snaps JSON-RPC API](../reference/rpc-api.md), and +[permissions](request-permissions.md). -Before developing a snap, it's important to understand: +Before developing a Snap, it's important to understand: -- [The snap anatomy](../concepts/anatomy.md). -- [The snap lifecycle](../concepts/lifecycle.md). -- [The snap user interface](../concepts/user-interface.md). -- [The Snaps execution environment](../concepts/execution-environment.md). +- [The Snap anatomy](../concepts/anatomy.md). +- [The Snap lifecycle](../concepts/lifecycle.md). +- [The Snap user interface](../concepts/user-interface.md). +- [The MetaMask Snaps execution environment](../concepts/execution-environment.md). You can [get started quickly using the Snaps template](../get-started/quickstart.md) or follow a [tutorial](/snaps/category/tutorials). -This page describes additional important steps when developing a snap. +This page describes additional important steps when developing a Snap. ## Detect the user's MetaMask version -When developing a website that depends on Snaps, you need to know whether the user has -[MetaMask Flask](../get-started/install-snaps.md#install-metamask-flask) installed. +When developing a website that depends on [MetaMask Flask](../get-started/install-flask.md#install-metamask-flask), +you first need to know whether the user has it installed. The following example uses the [`@metamask/detect-provider`](https://npmjs.com/package/@metamask/detect-provider) package to get @@ -50,24 +51,29 @@ if (provider && isFlask) { } ``` -## Test your snap +## Test your Snap -Test your snap by hosting it locally using `mm-snap serve`, installing it in Flask, and calling its +Test your Snap by hosting it locally using `mm-snap serve`, installing it in Flask, and calling its API methods from a web page. -## Debug your snap +:::note +If you use the template Snap monorepo, running `yarn start` will serve the Snap at +[`http://localhost:8080`](http://localhost:8080/) +::: + +## Debug your Snap -To debug your snap, use `console.log` and inspect the MetaMask background process. -You can add your log statements in your source code and build your snap, or add them directly -to your snap bundle and use `mm-snap manifest --fix` to update the `shasum` in your snap manifest file. -The manifest `shasum` must match the contents of your bundle at the time MetaMask fetches your snap. +To debug your Snap, use `console.log` and inspect the MetaMask background process. +You can add your log statements in your source code and build your Snap, or add them directly +to your Snap bundle and use `mm-snap manifest --fix` to update the `shasum` in your Snap manifest file. +The manifest `shasum` must match the contents of your bundle at the time MetaMask fetches your Snap. :::note -Because adding logs modifies the snap source code, you must re-install the snap whenever you add a +Because adding logs modifies the Snap source code, you must re-install the Snap whenever you add a log statement. ::: -The snap log output is only visible in the extension background process console. +The Snap log output is only visible in the extension background process console. If you're using a Chromium browser, use the following steps to inspect the background process and view its console: @@ -78,53 +84,59 @@ view its console: The log output displays in the console that pops up. -## Publish your snap +## Publish your Snap -Snaps are npm packages, so publishing a snap is as simple as publishing an npm package. +Snaps are npm packages, so publishing a Snap is as simple as publishing an npm package. Refer to the [npm CLI documentation](https://docs.npmjs.com/cli/v8/commands/npm-publish) for details on publishing to the public registry. The following details are specific to Snaps: -- The version in `package.json` and `snap.manifest.json` must match. +- The version in `package.json` and `snap.manifest.json` should match. +- The `repository.url` field in `package.json` should match the correct repository for your Snap. +- The `source.location.npm.packageName` in `snap.manifest.json` should match the name in `package.json`. +- The `proposedName` in `snap.manifest.json` should be a human-readable name and should not include + the words "MetaMask" or "Snap." - The image specified in `iconPath` in the manifest file is used as the icon displayed when - installing and displaying confirmations from the snap. + installing the Snap, in custom dialogs, and in the settings menu. + - This icon should be a valid SVG. + - The icon will be cropped in a circle when displayed in MetaMask; you do not need to make the icon circular. -After publishing the snap, any dapp can connect to the snap by using the snap ID `npm:[packageName]`. +After publishing the Snap, any dapp can connect to the Snap by using the Snap ID `npm:[packageName]`. + +:::caution +If you are using the Snap template, make sure to only publish the Snap package in `/packages/snap`. +You can use the [Snaps Simulator](https://metamask.github.io/snaps/snaps-simulator/staging/#/manifest) to verify +that your Snap was published correctly — just select **localhost** in the top right corner and change the +Snap location to **npm** and the ID of your Snap. + +Also, make sure to update the manifest file, icon file, and README to differentiate your Snap from the template. +::: -## Distribute your snap +## Distribute your Snap -Since snaps are currently intended for a developer audience, MetaMask doesn't currently facilitate -distributing snaps to a wide audience. -If you have a website that expects the user to install a snap, ask the user to install MetaMask -Flask, and then ask the user to install the snap using the -[`wallet_enable`](../reference/rpc-api.md#wallet_enable) API method. +You should deploy a dapp where users can learn about your Snap and install it, or integrate with your existing dapp. -In the future, MetaMask will create some way for users to more easily discover snaps, but everyone -can always build, publish, and use snaps without MetaMask's permission. -(Although we may try to make it difficult to use known scams.) +If your Snap is designed to communicate with dapps, you can encourage other dapp developers to [integrate your Snap](work-with-existing-snaps.md). ## Resources and tools -You can review the growing number of -[example snaps](https://github.com/MetaMask/snaps-monorepo/tree/main/packages/examples) maintained -by MetaMask, as well as the following fully functional and open source snaps: +You can review the growing number of [example Snaps](https://github.com/MetaMask/snaps/tree/main/packages/examples) maintained by MetaMask, as well as the following fully functional and open source Snaps: +- [Dogecoin](https://github.com/ziad-saab/dogecoin-snap) - [StarkNet](https://github.com/Consensys/starknet-snap) -- [FilSnap for Filecoin](https://github.com/Chainsafe/filsnap/) -- [Password Manager Snap](https://github.com/ritave/snap-passwordManager) +- [MobyMask Phishing Warning](https://github.com/Montoya/mobymask-snap) - [Transaction Simulation with Ganache](https://github.com/Montoya/tx-simulation-with-ganache-snap) - (uses Truffle for local testing) -MetaMask also maintains tools to help developers build, debug, and maintain snaps: +MetaMask also maintains tools to help developers build, debug, and maintain Snaps: -- [Template snap](https://github.com/MetaMask/template-snap-monorepo) - A template that includes +- [Template Snap](https://github.com/MetaMask/template-snap-monorepo) - A template that includes TypeScript/React and vanilla JavaScript options and a CLI for building, packaging, and deploying - your snap and a companion dapp. -- [Snaps Simulator](https://metamask.github.io/snaps/snaps-simulator/latest) - A developer tool built for simulating snaps in the browser, streamlining the development process. + your Snap and a companion dapp. +- [Snaps Simulator](https://metamask.github.io/snaps/snaps-simulator/latest) - A developer tool built for simulating Snaps in the browser, streamlining the development process. - [Snaps Truffle Box](https://trufflesuite.com/boxes/metamask-snap-box/) - A template that combines - the TypeScript template snap and Truffle so you can easily test snaps that use smart contracts + the TypeScript template Snap and Truffle so you can easily test Snaps that use smart contracts with Ganache. -- [Test snaps](https://github.com/MetaMask/test-snaps) - A collection of test snaps and a dapp for +- [Test Snaps](https://github.com/MetaMask/test-snaps) - A collection of test Snaps and a dapp for evaluating them. If you have any questions, ask them on diff --git a/snaps/how-to/manage-keys.md b/snaps/how-to/manage-keys.md index f4b24866c2a..9c8dc85fd6f 100644 --- a/snaps/how-to/manage-keys.md +++ b/snaps/how-to/manage-keys.md @@ -10,7 +10,7 @@ their approval. :::caution important Managing users' keys comes with great responsibility: Misplaced or stolen -private keys can lead to a complete loss of funds for users of your snap. +private keys can lead to a complete loss of funds for users of your Snap. ::: ## Responsible key management @@ -30,7 +30,7 @@ The general rule is: **Don't create a situation where your users can lose assets :::danger examples of irresponsible key management: -- Allowing extraction of private keys outside the snap in any way, especially through RPC or +- Allowing extraction of private keys outside the Snap in any way, especially through RPC or network connections. - Executing arbitrary or untrusted code with access to private keys. - Not getting properly informed consent before performing irreversible operations. @@ -81,7 +81,7 @@ For example, to derive Dogecoin keys: m/44'/3'/0'/0/{address_index} ``` - To get the second Dogecoin account, add the following code to your snap: + To get the second Dogecoin account, add the following code to your Snap: ```javascript import { getBIP44AddressKeyDeriver } from '@metamask/key-tree'; @@ -106,7 +106,8 @@ For example, to derive Dogecoin keys: ## Examples -The following are examples of existing snaps that manage accounts and keys: +The following are examples of existing Snaps that manage accounts and keys: -- [KeystoneHQ's Btcsnap](https://github.com/KeystoneHQ/btcsnap-1) -- [Consensys's Starknet Snap](https://github.com/Consensys/starknet-snap) \ No newline at end of file +- [Dogecoin Snap tutorial](https://github.com/ziad-saab/dogecoin-snap) +- [Consensys StarkNet Snap](https://github.com/Consensys/starknet-snap) +- [Account Labs Bitcoin Snap](https://github.com/snapdao/btcsnap) diff --git a/snaps/how-to/request-permissions.md b/snaps/how-to/request-permissions.md index bbc5aa784d0..fb1e94e6bc0 100644 --- a/snaps/how-to/request-permissions.md +++ b/snaps/how-to/request-permissions.md @@ -5,10 +5,10 @@ sidebar_position: 2 # Request permissions -To access certain powerful JavaScript globals or API methods, a snap must ask the user for permission. +To access certain powerful JavaScript globals or API methods, a Snap must ask the user for permission. Snaps follow the [EIP-2255 wallet permissions specification](https://eips.ethereum.org/EIPS/eip-2255), -and you must specify a snap's required permissions in the `initialPermissions` field of the -[manifest file](../concepts/anatomy.md#manifest-file). +and you must specify a Snap's required permissions (except for [dynamic permissions](#dynamic-permissions)) +in the `initialPermissions` field of the [manifest file](../concepts/anatomy.md#manifest-file). ## RPC API permissions @@ -38,3 +38,15 @@ permission, add the following to the manifest file: "endowment:network-access": {} }, ``` + +## Dynamic permissions + +Dynamic permissions are not requested in the manifest file. +Instead, your Snap can acquire dynamic permissions during its lifecycle. + +For example, your Snap can request permission to call the Ethereum provider's +[`eth_accounts`](../reference/permissions.md#eth_accounts) RPC method by calling the provider's +[`eth_requestAccounts`](/wallet/reference/eth_requestaccounts) RPC method. + +See the [`eth_accounts` Dynamic Permission](../reference/permissions.md#eth_accounts) +for more information. diff --git a/snaps/how-to/troubleshoot.md b/snaps/how-to/troubleshoot.md index ed95d41bb30..6ec3e29d824 100644 --- a/snaps/how-to/troubleshoot.md +++ b/snaps/how-to/troubleshoot.md @@ -1,11 +1,11 @@ --- description: Solve common issues. -sidebar_position: 5 +sidebar_position: 7 --- # Troubleshoot -This page describes common issues you may encounter when developing a snap, and how to resolve them. +This page describes common issues you may encounter when developing a Snap, and how to resolve them. If you encounter any issues that you can't solve on your own, please [open a GitHub issue](https://github.com/MetaMask/snaps-monorepo/issues). @@ -15,7 +15,7 @@ If you encounter any issues that you can't solve on your own, please Because [Secure ECMAScript (SES)](../concepts/execution-environment.md) adds additional restrictions on the JavaScript runtime on top of strict mode, code that executes normally under strict mode might not under SES. -`mm-snap build` by default attempts to execute a snap in a stubbed SES environment. +`mm-snap build` by default attempts to execute a Snap in a stubbed SES environment. You can also disable this behavior and run the evaluation step separately using `mm-snap eval`. If an error is thrown during this step, it's likely due to a SES incompatibility, and you must fix the issues manually. @@ -23,7 +23,7 @@ These incompatibilities tend to occur in dependencies. While the errors you get from SES may seem scary, they're usually not that hard to fix. The actual file, function, and variable names in the `mm-snap eval` error stack trace might not make -a lot of sense to you, but the line numbers should correspond to your snap +a lot of sense to you, but the line numbers should correspond to your Snap [bundle file](../concepts/anatomy.md#bundle-file). Thus, you can identify if the error is due to your code or one of your dependencies. If the problem is in a dependency, you can try a different version or to fix the issue locally by @@ -34,18 +34,18 @@ To give you an idea of a common error and how to fix it, "sloppily" declared var assigning to a new variable without an explicit variable declaration) are forbidden in strict mode, and therefore in SES as well. If you get an error during the `eval` step that says something like `variableName is not defined`, -simply prepending `var variableName;` to your snap bundle may solve the problem. +simply prepending `var variableName;` to your Snap bundle may solve the problem. (This actually happened so frequently with [Babel's](https://babeljs.io/) `regeneratorRuntime` that `mm-snap build` automatically handles that one.) :::caution -Run `mm-snap manifest --fix` if you modified your snap bundle after building. -Otherwise your manifest `shasum` value won't be correct, and attempting to install your snap fails. +Run `mm-snap manifest --fix` if you modified your Snap bundle after building. +Otherwise your manifest `shasum` value won't be correct, and attempting to install your Snap fails. ::: ### Use other build tools -If you prefer building your snap with a build system you're more comfortable with, Snaps implements +If you prefer building your Snap with a build system you're more comfortable with, Snaps implements plugins for several other build systems: - [Webpack](https://www.npmjs.com/package/@metamask/snaps-webpack-plugin) @@ -61,7 +61,7 @@ You may also benefit from running `mm-snap eval` to detect any SES issues up fro ## Patch dependencies -Some dependencies might make use of APIs that aren't available in the +Some dependencies might use APIs that aren't available in the [Snaps execution environment](../concepts/execution-environment.md). To work around this, we recommend checking if another library is available that makes use of those APIs. @@ -104,7 +104,7 @@ This section also describes patching strategies for fixing dependencies that try `cross-fetch` is a popular library used for cross-platform access to the `fetch` API across multiple environments. -Under the hood, however, the library uses `XMLHttpRequest` and thus causes issues when used in a snap. +Under the hood, however, the library uses `XMLHttpRequest` and thus causes issues when used in a Snap. You can easily patch this issue using `patch-package`. Open `node_modules/cross-fetch/browser-ponyfill.js` and find the following lines near the bottom of diff --git a/snaps/how-to/use-custom-ui.md b/snaps/how-to/use-custom-ui.md index 129dee615a0..f2502aabdbc 100644 --- a/snaps/how-to/use-custom-ui.md +++ b/snaps/how-to/use-custom-ui.md @@ -80,6 +80,22 @@ const content = panel([ ]); ``` +### image + +Outputs an image. +This component takes an inline SVG. +It does not support remote URLs. +You can embed JPG or PNG in SVG using data URIs. +The SVG is rendered within an \ tag, which prevents JavaScript or interaction events from being supported. + +```javascript +import { image } from '@metamask/snaps-ui'; + +// ... + +const content = image(''); +``` + ### panel Outputs a panel, which can be used as a container for other components. @@ -124,5 +140,9 @@ const content = text('This is a simple text UI'); ## Markdown -Text-based components accept a very small subset of Markdown: `**bold**` and `_italic_`. +Text-based components accept a very small subset of inline Markdown: `**bold**` and `_italic_`. This subset will be increased in the future. + +## Emoji + +Text-based components accept emoji. diff --git a/snaps/how-to/use-keyring-api.md b/snaps/how-to/use-keyring-api.md new file mode 100644 index 00000000000..395c57ea4d1 --- /dev/null +++ b/snaps/how-to/use-keyring-api.md @@ -0,0 +1,169 @@ +--- +description: Use the KeyringSnapRpcClient from a dapp. +sidebar_label: Use the Keyring API +sidebar_position: 5 +sidebar_custom_props: + flask_only: true +--- + +# Use the Keyring API from a dapp + +:::flaskOnly +::: + + +Your dapp can use the [Keyring API](../concepts/keyring-api.md) to interact with custom EVM accounts. +Use the [`KeyringSnapRpcClient`](../reference/keyring-api/classes/KeyringSnapRpcClient.md) +of the Keyring API to invoke Keyring RPC methods on your [Keyring Snap](../concepts/keyring-api.md#terminology). + +:::tip tutorial +You can follow the end-to-end tutorial to [create a Snap to connect to custom EVM accounts](../tutorials/custom-evm-accounts.md). +::: + +:::info API documentation +See the [Keyring API reference](../reference/keyring-api/index.md) for all the Keyring API methods. +::: + +## Create the KeyringSnapRpcClient + +To use the `KeyringSnapRpcClient`, install `@metamask/keyring-api` in your project directory using +Yarn or npm: + +```bash +yarn add @metamask/keyring-api +``` + +or + +```bash +npm install @metamask/keyring-api +``` + +Create the client by adding the following to your project script: + +```ts +import { KeyringSnapRpcClient } from "@metamask/keyring-api"; + +let client = new KeyringSnapRpcClient(snapId, window.ethereum); +``` + +## Call Keyring API methods + +You can now use the `KeyringSnapRpcClient` to invoke the following +[`Keyring API`](../reference/keyring-api/index.md) methods on your Snap. + +### createAccount + +Creates a Keyring account. + +```ts +let keyringAccount = await client.createAccount("KeyringAccount1"); +``` + +### getAccount + +Gets a Keyring account. + +```ts +// accountId is returned when the account is created using createAccount. +let keyringAccount = await client.getAccount(accountId); +``` + +### listAccounts + +Lists all Keyring accounts created by the Snap. + +```ts +let keyringAccounts = await client.listAccounts(); +``` + +### updateAccount + +Updates a Keyring account. + +```ts +let updatedAccount = await client.updateAccount(modifiedKeyringAccount); +``` + +### deleteAccount + +Deletes a Keyring account. + +```ts +let snapResponse = await client.deleteAccount(accountId); +``` + +### submitRequest + +Submits a Keyring request. + +```ts +import { v4 as uuid } from "uuid"; + +// Example submitting an eth_sendTransaction request +let submitRequestResponse = await client.submitRequest({ + // ID of the account to which you want to submit this request + account: accountId, + scope: "eip155:1", // Ethereum Mainnet + request: { + jsonrpc: "2.0", + // Unique ID to identify every request + id: uuid(), + // The method and parameter structure is subjective to the Keyring API implementation in the Snap code. + method: "eth_sendTransaction", + params: + { + from: "", + to: "0xcEF0f7f7ee1650b4A8151f605d9258bA65D733F5", + data, + chainId: "1", + }, + , + }, +}); +``` + +### getRequest + +Gets a Keyring request. + +```ts +// requestId is returned during request submission. +let keyringRequest = await client.getRequest(requestId); +``` + +### listRequests + +Lists all requests submitted to the Snap. + +```ts +let requests = await client.listRequests(); +``` + +### approveRequest + +Approves a request. + +```ts +// requestId is returned during request submission. +await client.approveRequest(requestId); +``` + +### rejectRequest + +Rejects a request. + +```ts +// requestId is returned during request submission. +await client.rejectRequest(requestId); +``` + +### filterAccountChains + +Returns a filtered list of CAIP-2 IDs representing the supported chains. + +```ts +// accountId - ID of the account to be checked +// chains - List of chains (CAIP-2) to be checked +let supportedChains = await client.filterAccountChains(accountId, chains); +``` diff --git a/snaps/how-to/work-with-existing-snaps.md b/snaps/how-to/work-with-existing-snaps.md new file mode 100644 index 00000000000..1e9df347965 --- /dev/null +++ b/snaps/how-to/work-with-existing-snaps.md @@ -0,0 +1,117 @@ +--- +description: Connect your dapp to existing, third-party Snaps. +sidebar_position: 6 +--- + +# Work with third-party Snaps + +Some existing, third-party Snaps are designed to communicate with dapps. +As a dapp developer, you can use these Snaps to take advantage of new features enabled by Snaps. +This is possible because [Snaps can expose a JSON-RPC API](../reference/exports.md#onrpcrequest). +Snaps can decide to make their API available to dapps by requesting the +[`endowment:rpc`](../reference/permissions.md#endowmentrpc) permission. + +## Connect to a Snap + +Connect to a Snap by calling the [`wallet_requestSnaps`](../reference/rpc-api.md#wallet_requestsnaps) +method from your dapp. +If a user doesn't have the Snap installed in their MetaMask wallet, MetaMask prompts the user to +install the Snap. +The following are different possible outcomes from calling `wallet_requestSnaps`. + +### User rejects the installation request + +If the user rejects the installation request, the call to `wallet_requestSnaps` throws the following error: + +```json +{ "code": 4001, "message": "User rejected the request." } +``` + +### User approves the installation request + +If the user approves the installation request, the call to `wallet_requestSnaps` returns an object +with the following shape: + +```json +{ + "SNAP_ID": { + "blocked": false, + "enabled": true, + "id": "SNAP_ID", + "initialPermissions": { + // ...all the permissions in the Snap's manifest + }, + "version": "SNAP_VERSION" + } +} +``` + +### Snap is already installed + +If the Snap is already installed, the call to `wallet_requestSnaps` returns the same object as for a +new installation of the Snap, but the user won't see a confirmation pop-up asking them to install the Snap. + +:::caution important +Snaps are installed into the MetaMask instance of each user. +If a Snap stores data, that data is specific to that user's MetaMask instance. +However, that data can be shared with multiple dapps. +Do not assume that data stored by a Snap is unique to your dapp. +::: + +## Determine whether a Snap is installed + +Determine whether a Snap is installed by calling the [`wallet_getSnaps`](../reference/rpc-api.md#wallet_getsnaps) +method from your dapp. +This method returns a list of only those Snaps that are connected to your current dapp. + +The response is in the form of an object keyed by the ID of the Snap. +Each value is a nested object with additional information, such as the version of the Snap that is installed. + +:::note +`wallet_getSnaps` only returns the Snaps that are connected to your dapp. +The user may have other Snaps installed that your dapp is not aware of. +::: + +The following example verifies whether a Snap with ID `npm:super-snap` is installed: + +```ts +const snaps = await ethereum.request({ + method: 'wallet_getSnaps' +}); + +const isMySnapInstalled = Object.keys(snaps).includes('npm:super-snap'); +``` + +If you need to work with a specific version of a Snap, you can instead iterate over +`Object.values(snaps)`, and use the `id` and `version` properties inside each object to determine +whether the Snap is installed with the required version. + +:::note +A user cannot install multiple versions of a Snap into a single MetaMask instance. +You should avoid requiring a specific version of a Snap unless you absolutely need to. +In most cases, you should request the latest version of the Snap and architect your dapp to be able +to work with that version. +::: + +## Reconnect to a Snap + +At any time, a user can open their MetaMask Snaps settings menu and see all the dapps connected to a Snap. +From that menu they can revoke a dapp connection. +If your dapp loses the connection to a Snap, you can reconnect by calling +[`wallet_requestSnaps`](../reference/rpc-api.md#wallet_requestsnaps). +Since the Snap is already installed, this returns a success response without MetaMask showing a pop-up. +However, if the user has disabled the Snap, the response has `enabled` set to `false` for your `SNAP_ID`: + +```json +{ + "SNAP_ID": { + "blocked": false, + "enabled": false, + "id": "SNAP_ID", + "initialPermissions": { + // ...all the permissions in the Snap's manifest + }, + "version": "SNAP_VERSION" + } +} +``` diff --git a/snaps/index.mdx b/snaps/index.mdx index 84da8544eeb..323c63732fa 100644 --- a/snaps/index.mdx +++ b/snaps/index.mdx @@ -6,26 +6,25 @@ import CardList from '@site/src/components/CardList' # Extend the functionality of MetaMask using Snaps -Snaps is an open source system that allows anyone to safely extend the functionality of MetaMask, +MetaMask Snaps is an open source system that allows anyone to safely extend the functionality of MetaMask, creating new web3 end user experiences. -Get started by [installing Snaps](get-started/install-snaps.md). +Want to build your own Snaps? Get started by [installing MetaMask Flask](get-started/install-flask.md). :::note -- Snaps is pre-release software. -- To learn how to integrate your dapp with MetaMask, visit the - [MetaMask wallet developer documentation](../wallet). +To learn how to integrate your dapp with MetaMask, visit the +[MetaMask wallet developer documentation](../wallet). ::: -## What is a snap? +## What is a Snap? -A snap is a JavaScript program run in an isolated environment that customizes the wallet experience. +A Snap is a JavaScript program run in an isolated environment that customizes the wallet experience. Snaps have access to a limited set of capabilities, determined by the [permissions](how-to/request-permissions.md) the user granted them during installation. -## What can you do with a snap? +## What can you do with a Snap? -A snap can add new API methods to MetaMask, add support for different blockchain protocols, or +A Snap can add new API methods to MetaMask, add support for different blockchain protocols, or modify existing functionalities using the [Snaps JSON-RPC API](reference/rpc-api.md). Features include: @@ -79,12 +78,19 @@ Features include: href: "reference/permissions#endowmentnetwork-access", title: "Network access", description: <>Make API calls using fetch(). + }, + { + icon: require("./assets/features/locale.png").default, + href: "reference/rpc-api#snap_getlocale", + title: "Localization", + description: "Translate your snap UI based on the user's locale.", + flaskOnly: true } ]} /> ## Questions? -If you have questions about using Snaps or want to propose a new feature, you can interact with the -Snaps team and community on [GitHub discussions](https://github.com/MetaMask/snaps-monorepo/discussions) -and the Snaps channel on [Consensys Discord](https://discord.gg/consensys). +If you have questions about using MetaMask Snaps or want to propose a new feature, you can interact with the +MetaMask Snaps team and community on [GitHub discussions](https://github.com/MetaMask/snaps/discussions) +and the **snaps-dev-metamask** channel on [Consensys Discord](https://discord.gg/consensys). diff --git a/snaps/reference/cli/index.md b/snaps/reference/cli/index.md index 74ace5238bf..1764b3b612e 100644 --- a/snaps/reference/cli/index.md +++ b/snaps/reference/cli/index.md @@ -8,7 +8,7 @@ sidebar_position: 3 This reference describes the syntax of the Snaps command line interface (CLI) subcommands and options. :::note -The CLI is installed when you [create a snap project](../../get-started/quickstart.md). +The CLI is installed when you [create a Snap project](../../get-started/quickstart.md). ::: You can specify subcommands and options using the `mm-snap` command: diff --git a/snaps/reference/cli/options.md b/snaps/reference/cli/options.md index 9f31818b220..875b614a776 100644 --- a/snaps/reference/cli/options.md +++ b/snaps/reference/cli/options.md @@ -32,7 +32,7 @@ bundle: 'out/bundle.js' -Path to the snap [bundle file](../../concepts/anatomy.md#bundle-file). +Path to the Snap [bundle file](../../concepts/anatomy.md#bundle-file). The default is `dist/bundle.js`. You can use this option with the [`eval`](subcommands.md#e-eval) subcommand. @@ -125,7 +125,7 @@ eval: false -Indicates whether to attempt to evaluate the snap bundle in SES. +Indicates whether to attempt to evaluate the Snap bundle in SES. The default is `true`. You can use this option with the [`build`](subcommands.md#b-build) and @@ -157,7 +157,7 @@ fix: false -When validating the snap [manifest file](../../concepts/anatomy.md#manifest-file) using the +When validating the Snap [manifest file](../../concepts/anatomy.md#manifest-file) using the [`manifest`](subcommands.md#m-manifest) subcommand, indicates whether to make necessary changes to the manifest file. The default is `true`. @@ -199,7 +199,7 @@ manifest: false -Indicates whether to validate the snap [manifest file](../../concepts/anatomy.md#manifest-file). +Indicates whether to validate the Snap [manifest file](../../concepts/anatomy.md#manifest-file). The default is `true`. You can use this option with the [`build`](subcommands.md#b-build) and @@ -231,7 +231,7 @@ outfileName: 'snap.js' -Output file name when building a snap from source. +Output file name when building a Snap from source. The default is `bundle.js`. You can use this option with the [`build`](subcommands.md#b-build) and @@ -327,7 +327,7 @@ src: 'lib/index.js' -Path to the snap source file. +Path to the Snap source file. The default is `src/index.js`. You can use this option with the [`build`](subcommands.md#b-build) and @@ -460,7 +460,7 @@ You can use this option with the [`build`](subcommands.md#b-build) and [`watch`](subcommands.md#w-watch) subcommands. :::note -For TypeScript snaps, `--transpilationMode` must be set to either `localOnly` or `localAndDeps`. +For TypeScript Snaps, `--transpilationMode` must be set to either `localOnly` or `localAndDeps`. ::: ## verboseErrors diff --git a/snaps/reference/cli/subcommands.md b/snaps/reference/cli/subcommands.md index 503a6edc099..f05f5e192da 100644 --- a/snaps/reference/cli/subcommands.md +++ b/snaps/reference/cli/subcommands.md @@ -26,7 +26,7 @@ mm-snap b -s lib/index.js -d out -n snap.js -Builds a snap from source. +Builds a Snap from source. `b` is an alias for `build`. @@ -48,7 +48,7 @@ mm-snap e -b out/snap.js -Attempts to evaluate the snap bundle in SES. +Attempts to evaluate the Snap bundle in SES. `e` is an alias for `eval`. @@ -70,8 +70,8 @@ mm-snap i my-snap -Initializes a snap project in the specified directory. -If no directory is specified, the snap project is initialized in the current directory. +Initializes a Snap project in the specified directory. +If no directory is specified, the Snap project is initialized in the current directory. `i` is an alias for `init`. @@ -93,7 +93,7 @@ mm-snap m --fix false -Validates the snap [manifest file](../../concepts/anatomy.md#manifest-file). +Validates the Snap [manifest file](../../concepts/anatomy.md#manifest-file). `m` is an alias for `manifest`. @@ -115,7 +115,7 @@ mm-snap s -r out -p 9000 -Locally serves snap files for testing. +Locally serves Snap files for testing. `s` is an alias for `serve`. @@ -137,7 +137,7 @@ mm-snap w -s lib/index.js -d out -Rebuilds a snap from source upon changes to the files in the parent and child directories of the +Rebuilds a Snap from source upon changes to the files in the parent and child directories of the source directory. :::note diff --git a/snaps/reference/exports.md b/snaps/reference/exports.md index 4a21ec8f6c1..b050eea384a 100644 --- a/snaps/reference/exports.md +++ b/snaps/reference/exports.md @@ -6,19 +6,19 @@ sidebar_position: 2 # Snaps exports -A snap can export the following methods. +A Snap can export the following methods. ## onRpcRequest -To communicate with dapps and other snaps, a snap must implement its own JSON-RPC API by exporting +To communicate with dapps and other Snaps, a Snap must implement its own JSON-RPC API by exporting `onRpcRequest`. -Whenever the snap receives a JSON-RPC request, the `onRpcRequest` handler method is called. +Whenever the Snap receives a JSON-RPC request, the `onRpcRequest` handler method is called. :::caution important -If your snap can do something useful without receiving and responding to JSON-RPC requests, such as +If your Snap can do something useful without receiving and responding to JSON-RPC requests, such as providing [transaction insights](#ontransaction), you can skip exporting `onRpcRequest`. However, if you want to do something such as manage the user's keys for a particular protocol and -create a dapp that sends transactions for that protocol via your snap, for example, you must +create a dapp that sends transactions for that protocol via your Snap, for example, you must specify an RPC API. ::: @@ -74,13 +74,13 @@ module.exports.onRpcRequest = async ({ origin, request }) => { ## onTransaction -To provide transaction insights before a user signs a transaction, a snap must export `onTransaction`. +To provide transaction insights before a user signs a transaction, a Snap must export `onTransaction`. Whenever there's a contract interaction, and a transaction is submitted using the MetaMask extension, MetaMask calls this method. MetaMask passes the raw unsigned transaction payload to the `onTransaction` handler method. :::note -For MetaMask to call the snap's `onTransaction` method, you must request the +For MetaMask to call the Snap's `onTransaction` method, you must request the [`endowment:transaction-insight`](permissions.md#endowmenttransaction-insight) permission. ::: @@ -150,12 +150,12 @@ module.exports.onTransaction = async ({ ## onCronjob -To run periodic actions for the user (cron jobs), a snap must export `onCronjob`. +To run periodic actions for the user (cron jobs), a Snap must export `onCronjob`. This method is called at the specified times with the specified payloads defined in the [`endowment:cronjob`](permissions.md#endowmentcronjob) permission. :::note -For MetaMask to call the snap's `onCronjob` method, you must request the +For MetaMask to call the Snap's `onCronjob` method, you must request the [`endowment:cronjob`](permissions.md#endowmentcronjob) permission. ::: diff --git a/snaps/reference/keyring-api-index/index.md b/snaps/reference/keyring-api-index/index.md new file mode 100644 index 00000000000..3e8be7556bc --- /dev/null +++ b/snaps/reference/keyring-api-index/index.md @@ -0,0 +1,10 @@ +# Keyring API + +This section describes the [Keyring API](../../concepts/keyring-api.md) methods. + +:::tip Learn more +- Follow the end-to-end tutorial to [create a Keyring Snap to connect to custom EVM accounts](../../tutorials/custom-evm-accounts.md). +- Learn [how to use the Keyring API from a dapp](../../how-to/use-keyring-api.md). +- See the [`keyring-api`](https://github.com/MetaMask/keyring-api) repository on GitHub for more + information about using this module. +::: diff --git a/snaps/reference/permissions.md b/snaps/reference/permissions.md index a09370ec1b2..8ba32d567e1 100644 --- a/snaps/reference/permissions.md +++ b/snaps/reference/permissions.md @@ -5,13 +5,28 @@ sidebar_position: 4 # Snaps permissions -You can [request the following permissions](../how-to/request-permissions.md) in your snap manifest -file. +Your Snap can [request the following permissions](../how-to/request-permissions.md). -## endowment:cronjob +## RPC API permissions -To run periodic actions for the user (cron jobs), a snap must request the `endowment:cronjob` permission. -This permission allows the snap to specify cron jobs that trigger the exported +You must request permission to use any +[restricted JSON-RPC API methods](rpc-api.md#restricted-methods). + +For example, to request to use [`snap_dialog`](rpc-api.md#snap_dialog), add the following to the +manifest file: + +```json +"initialPermissions": { + "snap_dialog": {} +}, +``` + +## Endowments + +### endowment:cronjob + +To run periodic actions for the user (cron jobs), a Snap must request the `endowment:cronjob` permission. +This permission allows the Snap to specify cron jobs that trigger the exported [`onCronjob`](../reference/exports.md#oncronjob) method. Specify this permission in the manifest file as follows: @@ -51,10 +66,10 @@ Specify this permission in the manifest file as follows: } ``` -## endowment:ethereum-provider +### endowment:ethereum-provider -To communicate with a node using MetaMask, a snap must request the `endowment:ethereum-provider` permission. -This permission exposes the global API `ethereum` to the snap execution environment. +To communicate with a node using MetaMask, a Snap must request the `endowment:ethereum-provider` permission. +This permission exposes the global API `ethereum` to the Snap execution environment. This global is an EIP-1193 provider. Specify this permission in the manifest file as follows: @@ -65,23 +80,16 @@ Specify this permission in the manifest file as follows: }, ``` -## endowment:long-running - -A snap that is computationally heavy and can't finish execution within the -[snap lifecycle requirements](../concepts/lifecycle.md) must request the `endowment:long-running` permission. -This permission allows the snap to run indefinitely while processing RPC requests. - -Specify this permission in the manifest file as follows: - -```json -"initialPermissions": { - "endowment:long-running": {} -}, -``` +:::note +The global `ethereum` API in Snaps has fewer capabilities than `window.ethereum` for dapps. +You can only use it to make read requests from the RPC provider, not to write to the blockchain or initiate transactions. +You can also use it to connect to Ethereum accounts with `eth_requestAccounts` and then use `personal_sign` with +those connected accounts. +::: -## endowment:network-access +### endowment:network-access -To access the internet, a snap must request the `endowment:network-access` permission. +To access the internet, a Snap must request the `endowment:network-access` permission. This permission exposes the global `fetch` API to the Snaps execution environment. :::caution @@ -98,18 +106,23 @@ Specify this permission in the manifest file as follows: }, ``` -### Same-origin policy and CORS +#### Same-origin policy and CORS -`fetch()` requests in a snap are bound by browsers' [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#cross-origin_network_access). Since snap code is executed in an iframe with the `sandbox` property, the browser sends an `Origin` header with the value `null` with outgoing requests. For the snap to be able to read the response, the server must send an [`Access-Control-Allow-Origin`](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) CORS header with the value `*` or `null` in the response. +`fetch()` requests in a Snap are bound by the browser's [same-origin policy](https://developer.mozilla.org/en-US/docs/Web/Security/Same-origin_policy#cross-origin_network_access). +Since Snap code is executed in an iframe with the `sandbox` property, the browser sends an `Origin` +header with the value `null` with outgoing requests. +For the Snap to be able to read the response, the server must send an +[`Access-Control-Allow-Origin`](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) CORS header +with the value `*` or `null` in the response. -## endowment:rpc +### endowment:rpc -To handle arbitrary JSON-RPC requests, a snap must request the `endowment:rpc` permission. -This permission grants a snap access to JSON-RPC requests sent to the snap, using the exported +To handle arbitrary JSON-RPC requests, a Snap must request the `endowment:rpc` permission. +This permission grants a Snap access to JSON-RPC requests sent to the Snap, using the exported [`onRpcRequest`](exports.md#onrpcrequest) method. This permission requires an object with a `snaps` or `dapps` property (or both), to signal if the -snap can receive JSON-RPC requests from other snaps, or dapps, respectively. +snap can receive JSON-RPC requests from other Snaps, or dapps, respectively. The default for both properties is `false`. Specify this permission in the manifest file as follows: @@ -125,13 +138,13 @@ Specify this permission in the manifest file as follows: } ``` -## endowment:transaction-insight +### endowment:transaction-insight -To provide transaction insights, a snap must request the `endowment:transaction-insight` permission. -This permission grants a snap read-only access to raw transaction payloads, before they're accepted +To provide transaction insights, a Snap must request the `endowment:transaction-insight` permission. +This permission grants a Snap read-only access to raw transaction payloads, before they're accepted for signing by the user, by exporting the [`onTransaction`](../reference/exports.md#ontransaction) method. -This permission requires an object with an `allowTransactionOrigin` property to signal if the snap +This permission requires an object with an `allowTransactionOrigin` property to signal if the Snap should pass the `transactionOrigin` property as part of the `onTransaction` parameters. This property represents the transaction initiator origin. The default is `false`. @@ -146,10 +159,10 @@ Specify this permission in the manifest file as follows: }, ``` -## endowment:webassembly +### endowment:webassembly -To use WebAssembly, a snap must request the `endowment:webassembly` permission. -This permission exposes the global `WebAssembly` API to the snap execution environment. +To use WebAssembly, a Snap must request the `endowment:webassembly` permission. +This permission exposes the global `WebAssembly` API to the Snap execution environment. Specify this permission in the manifest file as follows: @@ -158,3 +171,38 @@ Specify this permission in the manifest file as follows: "endowment:webassembly": {} }, ``` + +## Dynamic permissions + +Dynamic permissions are not requested in the manifest file. +Instead, your Snap can acquire dynamic permissions during its lifecycle. + +### eth_accounts + +A Snap can request permission to call the Ethereum provider's [`eth_accounts`](/wallet/reference/eth_accounts) +RPC method by calling the provider's [`eth_requestAccounts`](/wallet/reference/eth_requestaccounts) RPC method. +Calling `eth_requestAccounts` requires the [`ethereum-provider`](#endowmentethereum-provider) endowment. + +You can check the presence of the permission by calling [`wallet_getPermissions`](/wallet/reference/wallet_getpermissions). +If the permission is present, the result contains a permission with a `parentCapability` of `eth_accounts`. +It comes with a caveat of `restrictReturnedAccounts`, an array of all the accounts the user allows for this Snap. +The following is an example `eth_accounts` permission: + +```json +{ + "id": "47vm2UUi1pccNAeYKGmwF", // example + "parentCapability": "eth_accounts", + "invoker": "npm:SNAP_ID", + "caveats": [ + { + "type": "restrictReturnedAccounts", + "value": [ + "0xc403b37bf1e700cb214ea1be9de066824b420de6" // example connected account #1 + ] + } + ], + "date": 1692616452846 +} +``` + +The user can revoke this permission by going to the Snap's settings under **Snap permissions**. \ No newline at end of file diff --git a/snaps/reference/rpc-api.md b/snaps/reference/rpc-api.md index f9e3107620e..442d4c3f590 100644 --- a/snaps/reference/rpc-api.md +++ b/snaps/reference/rpc-api.md @@ -6,9 +6,9 @@ sidebar_position: 1 # Snaps JSON-RPC API Snaps communicate with MetaMask using the Snaps JSON-RPC API. -These API methods allow snaps to modify the functionality of MetaMask, and websites (dapps) to -install and communicate with individual snaps. -Some methods are only callable by snaps, and some are only callable by websites. +These API methods allow Snaps to modify the functionality of MetaMask, and websites (dapps) to +install and communicate with individual Snaps. +Some methods are only callable by Snaps, and some are only callable by websites. ## Unrestricted methods @@ -16,21 +16,21 @@ You can call unrestricted methods without requesting permission to do so. ### wallet_getSnaps -Returns the IDs of the caller's permitted snaps and some relevant metadata. +Returns the IDs of the caller's permitted Snaps and some relevant metadata. This method is only callable by websites. #### Returns -An object containing the requester's permitted snaps. -Each snap is an object containing: +An object containing the requester's permitted Snaps. +Each Snap is an object containing: -- `id` - The ID of the snap. -- `initialPermissions` - The initial permissions of the snap, which will be requested when the snap +- `id` - The ID of the Snap. +- `initialPermissions` - The initial permissions of the Snap, which will be requested when the Snap is installed. -- `version` - The version of the snap. -- `enabled` - `true` if the snap is enabled, `false` otherwise. -- `blocked` - `true` if the snap is blocked, `false` otherwise. +- `version` - The version of the Snap. +- `enabled` - `true` if the Snap is enabled, `false` otherwise. +- `blocked` - `true` if the Snap is blocked, `false` otherwise. #### Example @@ -47,7 +47,7 @@ console.log(result); # Result ```javascript -// Example result if any snaps are permitted +// Example result if any Snaps are permitted { 'npm:@metamask/example-snap': { version: '1.0.0', @@ -62,26 +62,26 @@ console.log(result); ### wallet_requestSnaps -Requests permission for a website to communicate with the specified snaps and attempts to install +Requests permission for a website to communicate with the specified Snaps and attempts to install them if they're not already installed. -If the installation of any snap fails, returns the error that caused the failure. +If the installation of any Snap fails, returns the error that caused the failure. -You can optionally specify a [SemVer range](https://www.npmjs.com/package/semver) for a snap. -MetaMask attempts to install a version of the snap that satisfies the requested range. -If a compatible version of a snap is already installed, the request succeeds. -If an incompatible version is installed, MetaMask attempts to update the snap to the latest version +You can optionally specify a [SemVer range](https://www.npmjs.com/package/semver) for a Snap. +MetaMask attempts to install a version of the Snap that satisfies the requested range. +If a compatible version of a Snap is already installed, the request succeeds. +If an incompatible version is installed, MetaMask attempts to update the Snap to the latest version that satisfies the requested range. -The request succeeds if the snap is successfully updated. +The request succeeds if the Snap is successfully updated. This method is only callable by websites. #### Parameters -An object containing the snaps to request permission to communicate with. +An object containing the Snaps to request permission to communicate with. #### Returns -An object mapping the IDs of installed snaps to either their metadata or an error if installation fails. +An object mapping the IDs of installed Snaps to either their metadata or an error if installation fails. #### Example @@ -133,7 +133,7 @@ try { ## Restricted methods -For restricted methods callable by snaps, a snap must request permission to call the method in the +For restricted methods callable by Snaps, a Snap must request permission to call the method in the [snap manifest file](../how-to/request-permissions.md). For restricted methods callable by websites, a website must request permission to call the method using [`wallet_requestPermissions`](/wallet/reference/rpc-api/#wallet_requestpermissions). @@ -147,7 +147,7 @@ There are three types of dialogs with different parameters and return types: - [Confirmation](#confirmation-dialog) - [Prompt](#prompt-dialog) -This method is only callable by snaps. +This method is only callable by Snaps. #### Alert dialog @@ -160,7 +160,7 @@ An object containing the contents of the alert dialog: - `type` - The type of dialog (`'Alert'`). - `content` - The content of the alert, as a [custom UI](../how-to/use-custom-ui.md) component. -#### Example +##### Example ```javascript import { panel, text, heading } from '@metamask/snaps-ui'; @@ -194,7 +194,7 @@ An object containing the contents of the confirmation dialog: `true` if the confirmation was accepted, `false` otherwise. -#### Example +##### Example ```javascript import { panel, text, heading } from '@metamask/snaps-ui'; @@ -229,9 +229,9 @@ An object containing the contents of the prompt dialog: ##### Returns -The text entered by the user. +The text entered by the user if the prompt was submitted or `null` if the prompt was rejected or closed. If the user does not enter any text and submits the prompt, the value is an empty string. -#### Example +##### Example ```javascript import { panel, text, heading } from '@metamask/snaps-ui'; @@ -269,7 +269,7 @@ This method is designed to be used with the for user addresses, but it's your responsibility to know how to use those keys to, for example, derive an address for the relevant protocol or sign a transaction for the user. -This method is only callable by snaps. +This method is only callable by Snaps. #### Parameters @@ -349,7 +349,7 @@ Gets the [BIP-32](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki derivation path specified by the `path` parameter. Note that this returns the public key, not the extended public key (`xpub`), or Ethereum address. -This method is only callable by snaps. +This method is only callable by Snaps. #### Parameters @@ -426,7 +426,14 @@ This method is designed to be used with the for user addresses, but it's your responsibility to know how to use those keys to, for example, derive an address for the relevant protocol or sign a transaction for the user. -This method is only callable by snaps. +This method is only callable by Snaps. + +:::caution +Coin type 60 is reserved for MetaMask accounts and blocked for Snaps. +If you wish to connect to MetaMask accounts in a Snap, use +[`endowment:ethereum-provider`](../reference/permissions.md/#endowmentethereum-provider) and +`eth_requestAccounts`. +::: #### Parameters @@ -499,17 +506,17 @@ const addressKey1 = await deriveDogecoinAddress(1); ### snap_getEntropy -Gets a deterministic 256-bit entropy value, specific to the snap and the user's account. +Gets a deterministic 256-bit entropy value, specific to the Snap and the user's account. You can use this entropy to generate a private key, or any other value that requires a high level of randomness. -Other snaps can't access this entropy, and it changes if the user's secret recovery phrase changes. +Other Snaps can't access this entropy, and it changes if the user's secret recovery phrase changes. You can optionally specify a salt to generate different entropy for different purposes. Using a salt results in entropy unrelated to the entropy generated without a salt. -This value is deterministic: it's always the same for the same snap, user account, and salt. +This value is deterministic: it's always the same for the same Snap, user account, and salt. -This method is only callable by snaps. +This method is only callable by Snaps. #### Parameters @@ -555,12 +562,277 @@ console.log(entropy); +### snap_getLocale + +:::flaskOnly +::: + +Gets the user's locale setting. You can use this method to localize text in your snap. + +#### Returns + +The user's locale setting as a [language code](https://github.com/MetaMask/metamask-extension/blob/develop/app/_locales/index.json). + +#### Example + +```javascript +import { panel, text } from '@metamask/snaps-ui'; + +const locale = await snap.request({ method: 'snap_getLocale' }); + +let greeting = 'Hello'; +if(locale === 'es') { + greeting = 'Hola'; +} + +await snap.request({ + method: 'snap_dialog', + params: { + type: 'Alert', + content: panel([ + text(greeting), + ]), + }, +}); +``` + +### snap_manageAccounts + +:::flaskOnly +::: + +Manages [Keyring Snap](../concepts/keyring-api.md) accounts. +This method is organized into multiple sub-methods which each take their own parameters: + +- [`createAccount`](#createaccount) +- [`updateAccount`](#updateaccount) +- [`deleteAccount`](#deleteaccount) +- [`listAccounts`](#listaccounts) +- [`submitResponse`](#submitresponse) + +This method is only callable by Snaps. + +#### `createAccount` + +Creates a new Snap account. + +:::note +The Snap is responsible for maintaining its own record of accounts. +This can be done using [`snap_manageState`](#snap_managestate). +::: + +##### Parameters + +`account` - A [`KeyringAccount`](./keyring-api/variables/KeyringAccountStruct.md) object. + +##### Returns + +`null` + +##### Example + +```typescript +import { Keyring, KeyringAccount } from '@metamask/keyring-api'; + +class MyKeyring implements Keyring { + // ... other methods + + async createAccount( + name: string, + options: Record | null = null, + ): Promise { + + const account: KeyringAccount = { + id: uuid(), + name, + options, + address, + supportedMethods: [ + 'eth_sendTransaction', + 'eth_sign', + 'eth_signTransaction', + 'eth_signTypedData_v1', + 'eth_signTypedData_v2', + 'eth_signTypedData_v3', + 'eth_signTypedData_v4', + 'eth_signTypedData', + 'personal_sign', + ], + type: 'eip155:eoa', + }; + + // Store the account in state + + await snap.request({ + method: 'snap_manageAccounts', + params: { + method: 'createAccount', + params: { account }, + }, + }); + + return account; + } +} +``` + +#### `updateAccount` + +Updates an existing Snap account. + +:::note +The Snap is responsible for maintaining its own record of accounts. +This can be done using [`snap_manageState`](#snap_managestate). +::: + +##### Parameters + +`account` - A [`KeyringAccount`](./keyring-api/variables/KeyringAccountStruct.md) object. + +##### Returns + +`null` + +##### Example + +```typescript +import { Keyring, KeyringAccount } from '@metamask/keyring-api'; + +class MyKeyring implements Keyring { + // ... other methods + + async updateAccount(account: KeyringAccount): Promise { + // Store the new account details in state + + await snap.request({ + method: 'snap_manageAccounts', + params: { + method: 'updateAccount', + params: { account }, + }, + }); + } +} +``` + +#### `deleteAccount` + +Deletes a Snap account. + +:::note +The Snap is responsible for maintaining its own record of accounts. +This can be done using [`snap_manageState`](#snap_managestate). +::: + +##### Parameters + +`id` - The ID of the account to be deleted. + +##### Returns + +`null` + +##### Example + +```typescript +import { Keyring } from '@metamask/keyring-api'; + +class MyKeyring implements Keyring { + // ... other methods + + async deleteAccount(id: string): Promise { + // Delete the account from state + + await snap.request({ + method: 'snap_manageAccounts', + params: { + method: 'deleteAccount', + params: { id }, + }, + }); + } +} +``` + +#### `listAccounts` + +Lists the calling Snap's accounts that are known to MetaMask. +This method does not call back to the Snap. +Instead, the Snap can use it to check whether there's a discrepancy between the Snap's internal +state of accounts and the state known to MetaMask. + +##### Returns + +An array of [keyring accounts](./keyring-api/variables/KeyringAccountStruct.md). + +##### Example + +```typescript +import { Keyring, KeyringAccount } from '@metamask/keyring-api'; + +class MyKeyring implements Keyring { + // ... other methods + + async checkIfAccountsInSync(): Promise { + + const knownAccounts: KeyringAccount[] = /* grab accounts from Snap state */; + + const listedAccounts: KeyringAccount[] = await snap.request({ + method: 'snap_manageAccounts', + params: { + method: 'listAccounts' + }, + }); + + // compare the arrays and return the response + } +} +``` + +#### `submitResponse` + +Finalizes a signing request. +This is usually called as part of the `approveRequest` method of the +[`Keyring`](keyring-api/type-aliases/Keyring.md) interface. + +##### Parameters + +- `id` - The ID of the request to finalize. +- `result` - The result that should be returned to the original JSON-RPC caller. + +##### Returns + +`null` + +##### Example + +```typescript +import { Keyring } from '@metamask/keyring-api'; +import { Json } from '@metamask/utils'; + +class MyKeyring implements Keyring { + // ... other methods + + async approveRequest(id: string, result?: Json): Promise { + // Do any Snap-side logic to finish approving the request + + await snap.request({ + method: 'snap_manageAccounts', + params: { + method: 'submitResponse', + params: { id, result} + }, + }); + } +} +``` + ### snap_manageState -Allows the snap to persist up to 100 MB of data to disk and retrieve it at will. -The data is automatically encrypted using a snap-specific key and automatically decrypted when retrieved. +Allows the Snap to persist up to 100 MB of data to disk and retrieve it at will. +The data is automatically encrypted using a Snap-specific key and automatically decrypted when retrieved. -This method is only callable by snaps. +This method is only callable by Snaps. #### Parameters @@ -603,7 +875,7 @@ await snap.request({ Displays a notification in MetaMask or natively in the browser. Snaps can trigger a short notification text for actionable or time sensitive information. -This method is only callable by snaps. +This method is only callable by Snaps. #### Parameters @@ -632,35 +904,35 @@ await snap.request({ A website must request the `wallet_snap` permission using [`wallet_requestPermissions`](/wallet/reference/rpc-api/#wallet_requestpermissions) to -interact with the specified snaps. +interact with the specified Snaps. -A website can also call this method to invoke the specified JSON-RPC method of the specified snap. +A website can also call this method to invoke the specified JSON-RPC method of the specified Snap. -This method is synonymous to [`wallet_invokeSnap`](#wallet_invokesnap), and is only callable by websites. +This method is synonymous to [`wallet_invokeSnap`](#wallet_invokesnap). :::note Most websites only make one call to `wallet_requestPermissions`. Consecutive calls to `wallet_requestPermissions` for the `wallet_snap` permission overwrites a -website's existing permissions to interact with snaps. -To deal with this, you must write custom logic to merge existing snap IDs with new ones you're requesting. -Use [`wallet_getSnaps`](#wallet_getsnaps) to get a list of a website's permitted snaps. +website's existing permissions to interact with Snaps. +To deal with this, you must write custom logic to merge existing Snap IDs with new ones you're requesting. +Use [`wallet_getSnaps`](#wallet_getsnaps) to get a list of a website's permitted Snaps. ::: #### Parameters When requesting this permission, specify a caveat of type `snapIds`. -Specify each snap to request permission to interact with as an entry in the `value` field of the caveat. -Each snap entry can include a `version` to install. +Specify each Snap to request permission to interact with as an entry in the `value` field of the caveat. +Each Snap entry can include a `version` to install. The default is the latest version. When calling this method, specify an object containing: -- `snapId` - The ID of the snap to invoke. -- `request` - The JSON-RPC request object to send to the invoked snap. +- `snapId` - The ID of the Snap to invoke. +- `request` - The JSON-RPC request object to send to the invoked Snap. #### Returns -Result of the snap method call. +Result of the Snap method call. #### Example @@ -712,25 +984,23 @@ console.log(result); // In this example, the result is a boolean. ### wallet_invokeSnap -Invokes the specified JSON-RPC method of the specified snap. -The snap must be installed and the caller must have the permission to communicate with the snap, or +Invokes the specified JSON-RPC method of the specified Snap. +The Snap must be installed and the caller must have the permission to communicate with the Snap, or the request is rejected. Snaps are fully responsible for implementing their JSON-RPC API. -Consult the snap's documentation for available methods, their parameters, and return values. - -This method is only callable by websites. +Consult the Snap's documentation for available methods, their parameters, and return values. #### Parameters An object containing: -- `snapId` - The ID of the snap to invoke. -- `request` - The JSON-RPC request object to send to the invoked snap. +- `snapId` - The ID of the Snap to invoke. +- `request` - The JSON-RPC request object to send to the invoked Snap. #### Returns -Result of the snap method call. +Result of the Snap method call. #### Example diff --git a/snaps/tutorials/custom-evm-accounts.md b/snaps/tutorials/custom-evm-accounts.md new file mode 100644 index 00000000000..7688d5ad31d --- /dev/null +++ b/snaps/tutorials/custom-evm-accounts.md @@ -0,0 +1,153 @@ +--- +description: Create a Keyring Snap to connect to custom EVM accounts in MetaMask. +sidebar_custom_props: + flask_only: true +--- + +# Create a Snap to connect to custom EVM accounts + +This tutorial walks you through creating a Snap that uses the [Keyring API](../concepts/keyring-api.md) +to integrate custom EVM accounts in MetaMask. + +:::flaskOnly +::: + +## Prerequisites + +- A Snap set up using the [Snaps quickstart](../get-started/quickstart.md) +- Business logic written for your custom EVM account type + +## Steps + +### 1. Add the snap_manageAccounts permission + +Request permission to call [`snap_manageAccounts`](../reference/rpc-api.md#snap_manageaccounts) by +editing the `snap.manifest.json` file in your Snap: + +```json title="snap.manifest.json" +{ + // ...other settings + "initialPermissions": { + // ...other permissions + "snap_manageAccounts": {} + } +} +``` + +### 2. Expose the Keyring interface as a JSON-RPC API + +Export the [`onRpcRequest`](../reference/exports.md#onrpcrequest) function from the Snap to expose +the [`Keyring`](../reference/keyring-api/type-aliases/Keyring.md) +interface as a JSON-RPC API. + +The Keyring API provides a helper called +[`handleKeyringRequest`](../reference/keyring-api/functions/handleKeyringRequest.md). +This helper takes an instance of your `Keyring` interface and a request object. +It responds to requests where the `method` is of type `keyring_*`, and throws a +[`MethodNotSupportedError`](../reference/keyring-api/classes/MethodNotSupportedError.md) +if it doesn't recognize the request method. + +Since your Snap most likely wants to answer other JSON-RPC requests in addition to the `keyring_*` ones, +another helper called [`buildHandlersChain`](../reference/keyring-api/functions/buildHandlersChain.md) +lets you chain multiple RPC handlers together. +As each handler in the chain throws a +[`MethodNotSupportedError`](../reference/keyring-api/classes/MethodNotSupportedError.md), +the next handler in the chain is called. +The return value of `buildHandlersChain` is a function that can be used as the `onRpcRequest` export. + +The following is an example of composing two handlers: the keyring handler and a custom handler. +This code goes in the `packages/snap/src/index.ts` file: + +```typescript title="index.ts" +import { + MethodNotSupportedError, + buildHandlersChain, + handleKeyringRequest, +} from '@metamask/keyring-api'; +import type { OnRpcRequestHandler } from '@metamask/snaps-types'; + +// This is your custom EVM account implementation +import { MyKeyring } from './keyring'; + +let keyring: MyKeyring; + +/** + * Handle keyring requests. + * + * @param args - Request arguments. + * @param args.request - Request to execute. + * @returns The execution result. + */ +const keyringHandler: OnRpcRequestHandler = async ({ request }) => { + if (!keyring) { + const state = await snap.request({ + method: 'snap_manageState', + params: { operation: 'get' }, + }); + if (!keyring) { + keyring = new MyKeyring(state); + } + } + return await handleKeyringRequest(keyring, request); +}; + +/** + * Execute a custom Snap request. + * + * @param args - Request arguments. + * @param args.request - Request to execute. + * @returns The execution result. + */ +const customHandler: OnRpcRequestHandler = async ({ + request, +}): Promise => { + switch (request.method) { + // internal methods + case 'mysnap_hello': { + return 'Hello World!'; + } + + default: { + throw new MethodNotSupportedError(request.method); + } + } +}; + +/** + * Compose both handlers + */ +export const onRpcRequest: OnRpcRequestHandler = buildHandlersChain( + keyringHandler, + customHandler, +); +``` + +### 3. Use the Keyring API from a dapp + +As you build a companion dapp to provide a user interface for your Keyring Snap, you'll need to +interact with your Snap's JSON-RPC API. +While you could do this by making regular RPC calls using +[`wallet_invokeSnap`](../reference/rpc-api.md#wallet_invokesnap), we recommend +[using the Keyring API from your dapp](../how-to/use-keyring-api.md): + +```typescript +import { KeyringSnapRpcClient } from '@metamask/keyring-api'; +import { defaultSnapOrigin as snapId } from '../config'; + +const keyringClient = new KeyringSnapRpcClient(snapId, window.ethereum); + +// Example usage, after the user fills the steps to create an account... +keyringClient.createAccount(name, options); + +// The above call is equivalent to +window.ethereum.request({ + method: 'wallet_invokeSnap', + params: { + snapId, + request: { + method: 'keyring_createAccount', + params: { name, options } + } + }, +}); +``` diff --git a/snaps/tutorials/gas-estimation.md b/snaps/tutorials/gas-estimation.md index 91f4da3cd1e..581fb65bcd9 100644 --- a/snaps/tutorials/gas-estimation.md +++ b/snaps/tutorials/gas-estimation.md @@ -1,17 +1,17 @@ --- -description: Create a snap that estimates gas fees. +description: Create a Snap that estimates gas fees. sidebar_position: 1 --- -# Create a gas estimation snap +# Create a Snap to estimate gas fees -This tutorial walks you through creating a snap that estimates gas fees. -The snap uses the `fetch` API to request information from the internet, and displays custom -information in a confirmation dialog. +This tutorial walks you through creating a Snap that estimates gas fees. +The Snap uses the `fetch` API to request information from the internet, and displays custom +information in an alert dialog. ## Prerequisites -- [Snaps installed](../get-started/install-snaps.md) +- [MetaMask Flask installed](../get-started/install-flask.md) - A text editor (for example, [VS Code](https://code.visualstudio.com/)) - [Yarn](https://yarnpkg.com/) version 3 @@ -19,7 +19,7 @@ information in a confirmation dialog. ### 1. Set up the project -Create a new snap project using the [`@metamask/create-snap` CLI](https://github.com/MetaMask/snaps/tree/main/packages/create-snap) by running: +Create a new Snap project using the [`@metamask/create-snap` CLI](https://github.com/MetaMask/snaps/tree/main/packages/create-snap) by running: ```bash yarn create @metamask/snap gas-estimation-snap @@ -31,7 +31,7 @@ or npm create @metamask/snap gas-estimation-snap ``` -Next, `cd` into the `gas-estimation-map` project directory and run: +Next, `cd` into the `gas-estimation-snap` project directory and run: ```bash yarn install @@ -42,7 +42,7 @@ This initializes your development environment with the required dependencies. ### 2. Set a custom icon Open `/packages/snap/snap.manifest.json` in a text editor. -This file contains the main configuration details for your snap. +This file contains the main configuration details for your Snap. Edit the `npm` object (within the `location` object) and change the value for the `iconPath` key by giving the path `"images/gas.svg"` to your new icon: ```json title="snap.manifest.json" @@ -62,7 +62,7 @@ This is a free icon, **Gas** by Mello from ### 3. Enable network access -To enable your snap to use the `fetch` API, make a request for the +To enable your Snap to use the `fetch` API, make a request for the [`endowment:network-access`](../reference/permissions.md#endowmentnetwork-access) permission by adding `"endowment:network-access": {}` to the `initialPermissions` object in `snap.manifest.json`: @@ -82,7 +82,7 @@ adding `"endowment:network-access": {}` to the `initialPermissions` object in `s ### 4. Fetch gas fee estimates Open `/packages/snap/src/index.ts`. -This is the main code file for your snap. +This is the main code file for your Snap. To get a gas fee estimate, use the public API endpoint provided by [Open Source Ethereum Explorer](https://beaconcha.in/). Add the following `getFees()` function to the top of the file: @@ -97,7 +97,7 @@ async function getFees() { } ``` -Next, modify the snap RPC message handler that displays the confirmation window. +Next, modify the Snap RPC message handler that displays the confirmation window. This handler uses a switch statement to handle various request methods, but in this case there is only one method, `hello`. For this method, the handler returns a call to MetaMask with the parameters to display a @@ -128,9 +128,9 @@ export const onRpcRequest: OnRpcRequestHandler = ({ origin, request }) => { }; ``` -### 5. Build and test the snap +### 5. Build and test the Snap -To build and test your snap: +To build and test your Snap: 1. Open `package.json` in the root directory of the project, and increase the `"version"` (if the `"version"` is `0.1.0`, increase it to `0.2.0`). @@ -147,14 +147,14 @@ To build and test your snap: 3. Open [`localhost:8000`](http://localhost:8000/) in your browser (with MetaMask Flask installed). A page like the following displays: - ![Test dapp with template snap](../assets/template-snap.png) + ![Test dapp with template Snap](../assets/template-snap.png) - This is a boilerplate test dapp for installing and testing your snap. + This is a boilerplate test dapp for installing and testing your Snap. 4. Select **Connect** to connect Flask to the dapp. - After connecting, you're prompted to install the snap with the following permissions: + After connecting, you're prompted to install the Snap with the following permissions: - - **Allow websites to communicate directly with this snap.** + - **Allow websites to communicate directly with this Snap.** - **Access the internet.** - **Display dialog windows in MetaMask.** @@ -178,16 +178,16 @@ Next, you can try: - Parsing the JSON response from the remote API. - Displaying the fees in a nicely formatted way. -You can also update the fields in `snap.manifest.json` to match your custom snap: +You can also update the fields in `snap.manifest.json` to match your custom Snap: -- `proposedName` - The name of your snap. -- `description` - The description of your snap. +- `proposedName` - The name of your Snap. +- `description` - The description of your Snap. - `repository` - The URL of your cloned GitHub repository. - `source` - The `shasum` is set automatically when you build from the command line. - If you decided to publish your snap to npm, update the `location` to its published location. + If you decided to publish your Snap to npm, update the `location` to its published location. Similarly, you should update the `name`, `version`, `description`, and `repository` sections of -`/packages/snap/package.json` even if you do not plan to publish your snap to [`npm`](https://www.npmjs.com/). +`/packages/snap/package.json` even if you do not plan to publish your Snap to [`npm`](https://www.npmjs.com/). :::tip The `version` field in `snap.manifest.json` inherits the `version` field from `package.json`. @@ -199,4 +199,4 @@ If you change the method name, make sure to change the method name in `/packages to match. After you have made all necessary changes, you can -[publish your snap to npm](../how-to/develop-a-snap.md#publish-your-snap). +[publish your Snap to npm](../how-to/develop-a-snap.md#publish-your-snap). diff --git a/snaps/tutorials/transaction-insights.md b/snaps/tutorials/transaction-insights.md index a43d593fd6c..8436f9a6a5f 100644 --- a/snaps/tutorials/transaction-insights.md +++ b/snaps/tutorials/transaction-insights.md @@ -1,17 +1,17 @@ --- -description: Create a snap that provides transaction insights. +description: Create a Snap that provides transaction insights. sidebar_position: 2 --- -# Create a transaction insights snap +# Create a Snap to calculate gas fee percentages -This tutorial walks you through creating a snap that calculates the percentage of gas fees that +This tutorial walks you through creating a Snap that calculates the percentage of gas fees that a user would pay when creating a transaction. -The snap provides transaction insights in the MetaMask transaction window. +The Snap provides transaction insights in the MetaMask transaction window. ## Prerequisites -- [Snaps installed](../get-started/install-snaps.md) +- [MetaMask Flask installed](../get-started/install-flask.md) - An account on your MetaMask Flask instance with testnet ETH @@ -27,7 +27,7 @@ The snap provides transaction insights in the MetaMask transaction window. ### 1. Set up the project -Create a new snap project using the [`@metamask/create-snap` CLI](https://github.com/MetaMask/snaps/tree/main/packages/create-snap) by running: +Create a new Snap project using the [`@metamask/create-snap` CLI](https://github.com/MetaMask/snaps/tree/main/packages/create-snap) by running: ```bash yarn create @metamask/snap transaction-insights-snap @@ -49,17 +49,17 @@ This initializes your development environment with the required dependencies. ### 2. Enable transaction insights and the Ethereum provider -The default template snap, such as the one in [Create a gas estimation snap](./gas-estimation.md#5-build-and-test-the-snap), is set up to expose a JSON-RPC API with a simple hello command, which brings up a +The default template Snap, such as the one in [Create a gas estimation Snap](./gas-estimation.md#5-build-and-test-the-snap), is set up to expose a JSON-RPC API with a simple hello command, which brings up a dialog box. -In contrast, the snap you're creating in this tutorial doesn't expose any API. +In contrast, the Snap you're creating in this tutorial doesn't expose any API. Instead, it provides transaction insights directly in the MetaMask transaction window. -In particular, the snap shows the user the percentage of gas fees they would pay for their transaction. +In particular, the Snap shows the user the percentage of gas fees they would pay for their transaction. It gets the current gas price by calling the [`eth_gasPrice`](/wallet/reference/eth_gasPrice) RPC -method using the global Ethereum provider made available to snaps. +method using the global Ethereum provider made available to Snaps. -To enable your snap to provide transaction insights and use the global Ethereum provider, open +To enable your Snap to provide transaction insights and use the global Ethereum provider, open `/packages/snap/snap.manifest.json` in a text editor. Request the [`endowment:transaction-insight`](../reference/permissions.md#endowmenttransaction-insight) and @@ -112,7 +112,7 @@ export const onTransaction: OnTransactionHandler = async ({ transaction }) => { // Display percentage of gas fees in the transaction insights UI. return { content: panel([ - heading('Transaction insights snap'), + heading('Transaction insights Snap'), text( `As set up, you are paying **${gasFeesPercentage.toFixed( 2, @@ -123,14 +123,14 @@ export const onTransaction: OnTransactionHandler = async ({ transaction }) => { }; ``` -### 4. Build and test the snap +### 4. Build and test the Snap -To build and test your snap: +To build and test your Snap: 1. From the command line, run `yarn start` in the root of your project. - This starts two development servers: one for watching and compiling the snap, and another for the + This starts two development servers: one for watching and compiling the Snap, and another for the React site. - The snap bundle is served from `localhost:8080`, and the site is served from `localhost:8000`. + The Snap bundle is served from `localhost:8080`, and the site is served from `localhost:8000`. You should get a message that includes: ```bash @@ -143,7 +143,7 @@ To build and test your snap: 3. Select **Connect**, and accept the permission request. -4. After connecting, you're prompted to install the snap with the **Fetch and display transaction +4. After connecting, you're prompted to install the Snap with the **Fetch and display transaction insights** and **Access the Ethereum provider** permissions. Select **Approve & install**. @@ -152,7 +152,7 @@ To build and test your snap: 6. On the confirmation window, switch to the tab named **TYPESCRIPT EXAMPLE SNAP**. Switching to the tab activates the [`onTransaction`](../reference/exports.md#ontransaction) - export of your snap and displays the percentage of gas fees in the transaction insights UI: + export of your Snap and displays the percentage of gas fees in the transaction insights UI:

@@ -162,7 +162,7 @@ To build and test your snap: ### 5. Display a different UI for contract interactions -The snap should only display a gas fee percentage if the user is doing a regular ETH transfer. +The Snap should only display a gas fee percentage if the user is doing a regular ETH transfer. For contract interactions, it should display a UI that conveys that message. Add the following code to the beginning of the `onTransaction` export: @@ -172,7 +172,7 @@ if (typeof transaction.data === 'string' && transaction.data !== '0x') { content: panel([ heading('Percent Snap'), text( - 'This snap only provides transaction insights for simple ETH transfers.', + 'This Snap only provides transaction insights for simple ETH transfers.', ), ]), }; @@ -182,17 +182,17 @@ if (typeof transaction.data === 'string' && transaction.data !== '0x') { ### 6. Next steps The initial project has generic names in multiple places. -You can update the fields in `snap.manifest.json` to match your custom snap: +You can update the fields in `snap.manifest.json` to match your custom Snap: -- `proposedName` - The name of your snap. +- `proposedName` - The name of your Snap. This replaces **TYPESCRIPT EXAMPLE SNAP** in the transaction insights UI. -- `description` - The description of your snap. +- `description` - The description of your Snap. - `repository` - The URL of your cloned GitHub repository. - `source` - The `shasum` is set automatically when you build from the command line. - If you decided to publish your snap to npm, update the `location` to its published location. + If you decided to publish your Snap to npm, update the `location` to its published location. Similarly, you should update the `name`, `version`, `description`, and `repository` sections of -`/packages/snap/package.json` even if you don't plan to publish your snap to npm. +`/packages/snap/package.json` even if you don't plan to publish your Snap to npm. :::note The `version` field in `snap.manifest.json` inherits the `version` field from `package.json`. @@ -202,4 +202,4 @@ Lastly, you can update the content of `/packages/site/src/pages/index.tsx`, such template **Send Hello** button. Once you've made all necessary changes, you can -[publish your snap to npm](../how-to/develop-a-snap.md#publish-your-snap). +[publish your Snap to npm](../how-to/develop-a-snap.md#publish-your-snap). diff --git a/src/components/CardList/CardListItem/index.tsx b/src/components/CardList/CardListItem/index.tsx index e1e41052e7e..4e381482232 100644 --- a/src/components/CardList/CardListItem/index.tsx +++ b/src/components/CardList/CardListItem/index.tsx @@ -8,6 +8,7 @@ export interface CardItem { description?: ReactNode; href?: string; icon?: string; + flaskOnly?: boolean; } interface CardListItemProps { @@ -33,7 +34,14 @@ export default function CardListItem({ item }: CardListItemProps): JSX.Element { ); - const rootClassName = clsx("card padding--lg", styles.cardContainer); + const rootClassName = clsx( + "card", + "padding--lg", + styles.cardContainer, + { + [styles.flaskOnly]: item.flaskOnly, + }, + ); if (item.href) { return ( diff --git a/src/components/CardList/CardListItem/styles.module.css b/src/components/CardList/CardListItem/styles.module.css index 0713191a4c4..27026e266c3 100644 --- a/src/components/CardList/CardListItem/styles.module.css +++ b/src/components/CardList/CardListItem/styles.module.css @@ -12,10 +12,23 @@ box-shadow: 0 1.5px 3px 0 rgb(0 0 0 / 15%); border: 1px solid var(--ifm-color-emphasis-200); + position: relative; transition: all var(--ifm-transition-fast) ease; transition-property: border, box-shadow; } +.flaskOnly::after { + content: "Flask"; + border-bottom-left-radius: var(--ifm-card-border-radius); + position: absolute; + top:0; + right:0; + padding: 0.1rem 0.75rem; + font-weight: 500; + background-color: var(--mm-flask-background-color); + color: var(--mm-flask-color); +} + .cardContainer:hover { border-color: var(--ifm-color-primary); box-shadow: 0 3px 6px 0 rgb(0 0 0 / 20%); diff --git a/src/components/SnapsSection.tsx b/src/components/SnapsSection.tsx index 09af717f692..5ffd165f1c1 100644 --- a/src/components/SnapsSection.tsx +++ b/src/components/SnapsSection.tsx @@ -6,7 +6,7 @@ const CardList: CardItem[] = [ title: "🏁 Get started with Snaps", link: "/snaps/get-started/quickstart", description: (<> - Get started quickly by creating and customizing a simple snap, using the Snaps template built + Get started quickly by creating and customizing a simple Snap, using the Snaps template built with React and TypeScript. ), }, @@ -14,15 +14,15 @@ const CardList: CardItem[] = [ title: "⚙️ Snaps tutorials", link: "/snaps/tutorials", description: (<> - Follow the step-by-step tutorials to create snaps that estimate gas fees and provide - transaction insights with custom UI. + Follow the step-by-step tutorials to create Snaps that estimate gas fees, provide + transaction insights with custom UI, and more. ), }, { title: "🌐 Snaps JSON-RPC API", link: "/snaps/reference/rpc-api", description: (<> - Use the Snaps JSON-RPC API to modify the functionality of MetaMask and communicate between dapps and snaps. + Use the Snaps JSON-RPC API to modify the functionality of MetaMask and communicate between dapps and Snaps. ), }, ]; @@ -32,8 +32,8 @@ export default function SnapsSection(): JSX.Element {

Extend the functionality of MetaMask using Snaps

- A snap is a JavaScript program run in an isolated environment that customizes the MetaMask - wallet experience. You can create a snap that adds new API methods, adds support for + A Snap is a JavaScript program run in an isolated environment that customizes the MetaMask + wallet experience. You can create a Snap that adds new API methods, adds support for different blockchain protocols, or modifies existing functionalities.

diff --git a/src/css/custom.css b/src/css/custom.css index e76e08381dd..b4b0a21d92f 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -16,6 +16,9 @@ --ifm-color-primary-lightest: var(--brand-colors-blue-blue200); --ifm-code-font-size: var(--font-size-3); --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); + --mm-flask-background-color: hsl(280, 45%, 85%); + --mm-flask-color: hsl(280, 45%, 30%); + --mm-flask-border-color: hsl(280, 45%, 45%); } /* For readability concerns, you should choose a lighter palette in dark mode. */ @@ -27,6 +30,9 @@ --ifm-color-primary-light: var(--brand-colors-blue-blue300); --ifm-color-primary-lightest: var(--brand-colors-blue-blue200); --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); + --mm-flask-background-color: hsl(280, 45%, 30%); + --mm-flask-color: hsl(280, 45%, 85%); + --mm-flask-border-color: hsl(280, 45%, 45%); } [data-theme='light'] .DocSearch { @@ -95,6 +101,7 @@ h4 { grid-auto-rows: auto; grid-gap: 2rem; padding: 1rem 0rem 3rem; + margin-bottom: -15px; } .card { @@ -136,4 +143,13 @@ svg { transition: color var(--ifm-transition-fast) var(--ifm-transition-timing-default); font: var(--ifm-font-size-base) / var(--ifm-line-height-base) var(--ifm-font-family-base); line-height: 2; -} \ No newline at end of file +} + +.getfeedback-container { + margin-top: 50px; + margin-bottom: -2rem; +} + +.getfeedback-hidden { + display: none !important; +} diff --git a/src/theme/Admonition/flask-icon.svg b/src/theme/Admonition/flask-icon.svg new file mode 100644 index 00000000000..76b87971fe9 --- /dev/null +++ b/src/theme/Admonition/flask-icon.svg @@ -0,0 +1,669 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/theme/Admonition/index.css b/src/theme/Admonition/index.css new file mode 100644 index 00000000000..0983ca4f0b1 --- /dev/null +++ b/src/theme/Admonition/index.css @@ -0,0 +1,6 @@ +.alert.theme-admonition-flaskOnly { + --ifm-alert-background-color: var(--mm-flask-background-color); + --ifm-alert-background-color-highlight: var(--mm-flask-color); + --ifm-alert-foreground-color: var(--mm-flask-color); + --ifm-alert-border-color: var(--mm-flask-border-color); +} diff --git a/src/theme/Admonition/index.tsx b/src/theme/Admonition/index.tsx new file mode 100644 index 00000000000..26da30e4cee --- /dev/null +++ b/src/theme/Admonition/index.tsx @@ -0,0 +1,34 @@ +import React from "react"; +import Admonition from "@theme-original/Admonition"; +import { Props as AdmonitionPropsRaw } from "@theme/Admonition"; +import type { WrapperProps } from "@docusaurus/types"; + +import FlaskIcon from "./flask-icon.svg"; +import "./index.css"; + +type AdmonitionProps = Omit & { + type: AdmonitionPropsRaw["type"] | "flaskOnly"; +} + +declare function AdmonitionComponent(props: AdmonitionProps): JSX.Element; + +type Props = WrapperProps; + +export default function AdmonitionWrapper(props: Props): JSX.Element { + if (props.type === "flaskOnly") { + return ( + } + title="Flask Only" + > + This feature is only available in MetaMask Flask, the canary distribution of MetaMask. + + ); + } + return ( + <> + + + ); +} diff --git a/src/theme/DocCard/index.tsx b/src/theme/DocCard/index.tsx new file mode 100644 index 00000000000..7296ee75750 --- /dev/null +++ b/src/theme/DocCard/index.tsx @@ -0,0 +1,133 @@ +import React, { type ReactNode } from "react"; +import clsx from "clsx"; +import Link from "@docusaurus/Link"; +import { + findFirstCategoryLink, + useDocById, +} from "@docusaurus/theme-common/internal"; +import isInternalUrl from "@docusaurus/isInternalUrl"; +import { translate } from "@docusaurus/Translate"; +import type { Props } from "@theme/DocCard"; + +import cardListItemStyles from "@site/src/components/CardList/CardListItem/styles.module.css"; + +import styles from "./styles.module.css"; + + +import type { + PropSidebarItemCategory, + PropSidebarItemLink, +} from "@docusaurus/plugin-content-docs"; + +function CardContainer({ + href, + children, + flaskOnly, +}: { + href: string; + children: ReactNode; + flaskOnly?: boolean; +}): JSX.Element { + return ( + + {children} + + ); +} + +function CardLayout({ + href, + icon, + title, + description, + flaskOnly, +}: { + href: string; + icon: ReactNode; + title: string; + description?: string; + flaskOnly?: boolean; +}): JSX.Element { + return ( + +

+ {icon} {title} +

+ {description && ( +

+ {description} +

+ )} +
+ ); +} + +function CardCategory({ + item, +}: { + item: PropSidebarItemCategory; +}): JSX.Element | null { + const href = findFirstCategoryLink(item); + + // Unexpected: categories that don't have a link have been filtered upfront + if (!href) { + return null; + } + + return ( + + ); +} + +function CardLink({ item }: {item: PropSidebarItemLink}): JSX.Element { + const icon = isInternalUrl(item.href) ? "📄️" : "🔗"; + const doc = useDocById(item.docId ?? undefined); + return ( + + ); +} + +export default function DocCard({ item }: Props): JSX.Element { + switch (item.type) { + case "link": + return ; + case "category": + return ; + default: + throw new Error(`unknown item type ${JSON.stringify(item)}`); + } +} diff --git a/src/theme/DocCard/styles.module.css b/src/theme/DocCard/styles.module.css new file mode 100644 index 00000000000..f1d2a403c55 --- /dev/null +++ b/src/theme/DocCard/styles.module.css @@ -0,0 +1,28 @@ +.cardContainer { + --ifm-link-color: var(--ifm-color-emphasis-800); + --ifm-link-hover-color: var(--ifm-color-emphasis-700); + --ifm-link-hover-decoration: none; + + box-shadow: 0 1.5px 3px 0 rgb(0 0 0 / 15%); + border: 1px solid var(--ifm-color-emphasis-200); + transition: all var(--ifm-transition-fast) ease; + transition-property: border, box-shadow; + position: relative; +} + +.cardContainer:hover { + border-color: var(--ifm-color-primary); + box-shadow: 0 3px 6px 0 rgb(0 0 0 / 20%); +} + +.cardContainer *:last-child { + margin-bottom: 0; +} + +.cardTitle { + font-size: 1.2rem; +} + +.cardDescription { + font-size: 0.8rem; +} diff --git a/src/theme/DocItem/Footer/GetFeedback.jsx b/src/theme/DocItem/Footer/GetFeedback.jsx new file mode 100644 index 00000000000..444ea4b2001 --- /dev/null +++ b/src/theme/DocItem/Footer/GetFeedback.jsx @@ -0,0 +1,38 @@ +// cSpell:words usabilla, getfeedback +/* eslint-disable react/no-unknown-property */ +import React, { useState, useEffect, useRef } from "react"; +import { useColorMode } from "@docusaurus/theme-common"; + +const GetFeedback = (props) => { + const feedbackContRef = useRef(); + const { colorMode } = useColorMode(); + const [theme, setTheme] = useState(); + + useEffect(() => { + setTheme(colorMode); + }, [colorMode]); + + useEffect(() => { + setTheme(window?.localStorage?.getItem("theme") || colorMode); + window.usabilla.load("w.usabilla.com", "8485bdb0fb3c"); + }, []); + + return ( +
+ {/*Light*/} +
+ {/*Dark*/} +
+
+ ); +}; + +export default GetFeedback; diff --git a/src/theme/DocItem/Footer/index.jsx b/src/theme/DocItem/Footer/index.jsx new file mode 100644 index 00000000000..e15e1a54886 --- /dev/null +++ b/src/theme/DocItem/Footer/index.jsx @@ -0,0 +1,12 @@ +import React from "react"; +import Footer from "@theme-original/DocItem/Footer"; +import GetFeedback from "./GetFeedback.jsx"; + +export default function FooterWrapper(props) { + return ( + <> + +
+ + ); +} diff --git a/src/theme/DocSidebarItem/index.module.css b/src/theme/DocSidebarItem/index.module.css new file mode 100644 index 00000000000..83f7bc1e7fc --- /dev/null +++ b/src/theme/DocSidebarItem/index.module.css @@ -0,0 +1,10 @@ +.flaskOnly > :global(a.menu__link::after), +.flaskOnly > :global(.menu__list-item-collapsible) > :global(a.menu__link::after) { + content: "Flask"; + margin-left: 0.5em; + background-color: var(--mm-flask-background-color); + color: var(--mm-flask-color); + border-radius: 4px; + padding: 2px 4px; + transform: none; +} diff --git a/src/theme/DocSidebarItem/index.tsx b/src/theme/DocSidebarItem/index.tsx new file mode 100644 index 00000000000..9dd1e52def2 --- /dev/null +++ b/src/theme/DocSidebarItem/index.tsx @@ -0,0 +1,37 @@ +import React from "react"; +import DocSidebarItem from "@theme-original/DocSidebarItem"; +import type DocSidebarItemType from "@theme/DocSidebarItem"; +import type { WrapperProps } from "@docusaurus/types"; +import clsx from "clsx"; + +import styles from "./index.module.css"; + +type Props = WrapperProps; + +export default function DocSidebarItemWrapper(props: Props): JSX.Element { + if (props.item.type === "category" || props.item.type === "link") { + const { className, ...itemProps } = props.item; + + return ( + <> + + + ); + } + return ( + <> + + + ); +} diff --git a/static/js/feedback-script.js b/static/js/feedback-script.js new file mode 100644 index 00000000000..695901ed7c4 --- /dev/null +++ b/static/js/feedback-script.js @@ -0,0 +1,3 @@ + +window.lightningjs||function(n){var e="lightningjs";function t(e,t){var r,i,a,o,d,c;return t&&(t+=(/\?/.test(t)?"&":"?")+"lv=1"),n[e]||(r=window,i=document,a=e,o=i.location.protocol,d="load",c=0,function(){n[a]=function(){var t=arguments,i=this,o=++c,d=i&&i!=r&&i.id||0;function s(){return s.id=o,n[a].apply(s,arguments)}return(e.s=e.s||[]).push([o,d,t]),s.then=function(n,t,r){var i=e.fh[o]=e.fh[o]||[],a=e.eh[o]=e.eh[o]||[],d=e.ph[o]=e.ph[o]||[];return n&&i.push(n),t&&a.push(t),r&&d.push(r),s},s};var e=n[a]._={};function s(){e.P(d),e.w=1,n[a]("_load")}e.fh={},e.eh={},e.ph={},e.l=t?t.replace(/^\/\//,("https:"==o?o:"http:")+"//"):t,e.p={0:+new Date},e.P=function(n){e.p[n]=new Date-e.p[0]},e.w&&s(),r.addEventListener?r.addEventListener(d,s,!1):r.attachEvent("onload",s);var l=function(){function n(){return["<",o,"><",t,"><",r,' src="',e.l,'">"].join("")}var t="body",r="script",o="html",d=i[t];if(!d)return setTimeout(l,100);e.P(1);var c,s=i.createElement("div"),h=s.appendChild(i.createElement("div")),u=i.createElement("iframe");s.style.display="none",d.insertBefore(s,d.firstChild).id="lightningjs-"+a,u.frameBorder="0",u.id="lightningjs-frame-"+a,/MSIE[ ]+6/.test(navigator.userAgent)&&(u.src="javascript:false"),u.allowTransparency="true",h.appendChild(u);try{u.contentWindow.document.open()}catch(n){e.domain=i.domain,c="javascript:var d=document.open();d.domain='"+i.domain+"';",u.src=c+"void(0);"}try{var p=u.contentWindow.document;p.write(n()),p.close()}catch(e){u.src=c+'d.write("'+n().replace(/"/g,String.fromCharCode(92)+'"')+'");d.close();'}e.P(2)};e.l&&l()}()),n[e].lv="1",n[e]}var r=window.lightningjs=t(e);r.require=t,r.modules=n}({});window.usabilla_live = lightningjs.require("usabilla_live", "//w.usabilla.com/f157d4305b77.js"); + \ No newline at end of file diff --git a/static/js/getfeedback.js b/static/js/getfeedback.js new file mode 100644 index 00000000000..5b0d6a9849b --- /dev/null +++ b/static/js/getfeedback.js @@ -0,0 +1,64 @@ +/* eslint-disable */ +window.usabilla || + (function () { + var a = window, + d = a.document, + c = {}, + f = d.createElement("div"), + h = !1, + a = (a.usabilla = function () { + (c.a = c.a || []).push(arguments); + }); + a._ = c; + c.ids = {}; + f.style.display = "none"; + (function () { + if (!d.body) return setTimeout(arguments.callee, 100); + d.body.insertBefore(f, d.body.firstChild).id = "usabilla"; + h = !0; + })(); + a.load = function (a, g, k) { + if (!c.ids[g]) { + var e = (c.ids = {}); + e.url = "//" + a + "/" + g + ".js?s1"; + e.config = k; + setTimeout(function () { + if (!h) return setTimeout(arguments.callee, 100); + var b = d.createElement("iframe"), + a; + b.id = "usabilla-" + g; + /MSIE[ ]+6/.test(navigator.userAgent) && (b.src = "javascript:false"); + f.appendChild(b); + try { + b.contentWindow.document.open(); + } catch (c) { + (e.domain = d.domain), + (a = + "javascript:var d=document.open();d.domain='" + + e.domain + + "';"), + (b.src = a + "void(0);"); + } + try { + var l = b.contentWindow.document; + l.write( + [ + "", + ].join(""), + ); + l.close(); + } catch (m) { + b.src = + a + + 'd.write("' + + loaderHtml().replace(/"/g, String.fromCharCode(92) + '"') + + '");d.close();'; + } + b.contentWindow.config = k; + b.contentWindow.SCRIPT_ID = g; + }, 0); + } + }; + })(); diff --git a/static/sdk-android.mp4 b/static/sdk-android.mp4 new file mode 100644 index 00000000000..4428a1353ad Binary files /dev/null and b/static/sdk-android.mp4 differ diff --git a/static/sdk-desktop.mp4 b/static/sdk-desktop.mp4 new file mode 100644 index 00000000000..6f972522c09 Binary files /dev/null and b/static/sdk-desktop.mp4 differ diff --git a/static/sdk-ios.mp4 b/static/sdk-ios.mp4 new file mode 100644 index 00000000000..fc855fb1b40 Binary files /dev/null and b/static/sdk-ios.mp4 differ diff --git a/static/sdk-mobile-browser.mp4 b/static/sdk-mobile-browser.mp4 new file mode 100644 index 00000000000..713638dae42 Binary files /dev/null and b/static/sdk-mobile-browser.mp4 differ diff --git a/static/sdk-nodejs.mp4 b/static/sdk-nodejs.mp4 new file mode 100644 index 00000000000..3f349ace081 Binary files /dev/null and b/static/sdk-nodejs.mp4 differ diff --git a/static/sdk-unity.mp4 b/static/sdk-unity.mp4 new file mode 100644 index 00000000000..4c6a9add57f Binary files /dev/null and b/static/sdk-unity.mp4 differ diff --git a/tsconfig.json b/tsconfig.json index 72c23e90b63..262563a3474 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,6 +9,7 @@ "./**/*" ], "exclude": [ - "node_modules" + "node_modules", + "external" ], } diff --git a/wallet/assets/add-network.png b/wallet/assets/add-network.png new file mode 100644 index 00000000000..8db142eee96 Binary files /dev/null and b/wallet/assets/add-network.png differ diff --git a/wallet/assets/contract-abi-converter-dialog.png b/wallet/assets/contract-abi-converter-dialog.png new file mode 100644 index 00000000000..521b9001072 Binary files /dev/null and b/wallet/assets/contract-abi-converter-dialog.png differ diff --git a/wallet/assets/custom-modal.gif b/wallet/assets/custom-modal.gif new file mode 100644 index 00000000000..8ebabc4b4e9 Binary files /dev/null and b/wallet/assets/custom-modal.gif differ diff --git a/wallet/assets/request-permissions-2.png b/wallet/assets/request-permissions-2.png new file mode 100644 index 00000000000..38b5c918027 Binary files /dev/null and b/wallet/assets/request-permissions-2.png differ diff --git a/wallet/assets/request-permissions.png b/wallet/assets/request-permissions.png new file mode 100644 index 00000000000..e8e43d6132c Binary files /dev/null and b/wallet/assets/request-permissions.png differ diff --git a/wallet/assets/sdk-android-architecture.png b/wallet/assets/sdk-android-architecture.png new file mode 100644 index 00000000000..ac3a0c86764 Binary files /dev/null and b/wallet/assets/sdk-android-architecture.png differ diff --git a/wallet/assets/sdk-android-communication.png b/wallet/assets/sdk-android-communication.png new file mode 100644 index 00000000000..4ee909859cb Binary files /dev/null and b/wallet/assets/sdk-android-communication.png differ diff --git a/wallet/assets/sdk-desktop-browser.gif b/wallet/assets/sdk-desktop-browser.gif deleted file mode 100644 index 39c2b58f9e1..00000000000 Binary files a/wallet/assets/sdk-desktop-browser.gif and /dev/null differ diff --git a/wallet/assets/sdk-mobile-browser.gif b/wallet/assets/sdk-mobile-browser.gif deleted file mode 100644 index d801aa2a800..00000000000 Binary files a/wallet/assets/sdk-mobile-browser.gif and /dev/null differ diff --git a/wallet/assets/sdk-nodejs.gif b/wallet/assets/sdk-nodejs.gif deleted file mode 100644 index 5059d52fa7c..00000000000 Binary files a/wallet/assets/sdk-nodejs.gif and /dev/null differ diff --git a/wallet/assets/sdk-react-native.gif b/wallet/assets/sdk-react-native.gif deleted file mode 100644 index 84495e42f2c..00000000000 Binary files a/wallet/assets/sdk-react-native.gif and /dev/null differ diff --git a/wallet/assets/switch-network.png b/wallet/assets/switch-network.png new file mode 100644 index 00000000000..6a6cd2bcbaa Binary files /dev/null and b/wallet/assets/switch-network.png differ diff --git a/wallet/assets/unity-empty-template.png b/wallet/assets/unity-empty-template.png new file mode 100644 index 00000000000..6ed04976126 Binary files /dev/null and b/wallet/assets/unity-empty-template.png differ diff --git a/wallet/assets/unity-example-template.png b/wallet/assets/unity-example-template.png new file mode 100644 index 00000000000..ef3da48013a Binary files /dev/null and b/wallet/assets/unity-example-template.png differ diff --git a/wallet/concepts/apis.md b/wallet/concepts/apis.md new file mode 100644 index 00000000000..d522be0658d --- /dev/null +++ b/wallet/concepts/apis.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 3 +description: Learn about the MetaMask Ethereum provider API. +--- + +# About the MetaMask APIs + +MetaMask supports an [Ethereum provider API](#ethereum-provider-api), which wraps a [JSON-RPC API](#json-rpc-api). + +:::tip API documentation +The API methods are documented in the following references: + +- [Ethereum provider API reference](../reference/provider-api.md) +- [JSON-RPC API playground](/wallet/reference/eth_subscribe) +::: + +## Ethereum provider API + +MetaMask injects a global JavaScript API into websites visited by its users using the +`window.ethereum` provider object. +This API is specified by [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193), and it allows dapps to +request users' Ethereum accounts, read data from blockchains the user is connected to, suggest +that the user sign messages and transactions, and more. + +The MetaMask Ethereum provider API contains the following: + +- [Properties](../reference/provider-api.md#properties) - The provider contains a property that + detects if a user has MetaMask installed. +- [Methods](../reference/provider-api.md#methods) - The provider contains methods that dapps can call. + The [`window.ethereum.request(args)`](../reference/provider-api.md#windowethereumrequestargs) + provider method wraps the [JSON-RPC API](#json-rpc-api); dapps can use this + provider method to call any RPC method. +- [Events](../reference/provider-api.md#events) - The provider emits events that dapps can listen to. + +View the [provider API reference](../reference/provider-api.md) for all the provider properties, +methods, and events. + +:::tip Use MetaMask SDK with the provider API +You can call the provider API from a dapp without [MetaMask SDK](sdk/index.md) installed, but we +recommend using the SDK to enable users to easily connect to the MetaMask browser extension and +MetaMask Mobile. +The SDK supports multiple dapp platforms including mobile and gaming dapps. + +Get started by [setting up the SDK](../how-to/connect/set-up-sdk/index.md). +::: + +## JSON-RPC API + +MetaMask uses the [`window.ethereum.request(args)`](../reference/provider-api.md#windowethereumrequestargs) +method of the [provider API](#ethereum-provider-api) to wrap a JSON-RPC API. +The JSON-RPC API contains standard Ethereum JSON-RPC API methods and MetaMask-specific methods. + +The RPC methods are documented in the interactive +[JSON-RPC API playground](/wallet/reference/eth_subscribe). +Methods in the API playground may have the following tags: + +- **MetaMask** - These methods behave in ways specific to MetaMask, and may or may not be supported + by other wallets. +- **Restricted** - These methods are [restricted](#restricted-methods), which require requesting + permission using [`wallet_requestPermissions`](/wallet/reference/wallet_requestpermissions). +- **Mobile** - These methods are only available on MetaMask Mobile. +- **Ethereum API** - These are standard Ethereum JSON-RPC API methods. + See the [Ethereum wiki](https://eth.wiki/json-rpc/API#json-rpc-methods) for more information on + these methods. + +:::note +All RPC method requests can return errors. +Make sure to handle errors for every call to +[`window.ethereum.request(args)`](../reference/provider-api.md#windowethereumrequestargs). +::: + +### Restricted methods + +MetaMask introduced wallet permissions in [EIP-2255](https://eips.ethereum.org/EIPS/eip-2255). +In this permissions system, each RPC method is restricted or unrestricted. +If a method is restricted, a dapp must request permission to call it using +[`wallet_requestPermissions`](/wallet/reference/wallet_requestpermissions). +Under the hood, permissions are plain, JSON-compatible objects, with fields that are mostly used +internally by MetaMask. + +Outside of [Snaps restricted methods](/snaps/reference/rpc-api/#restricted-methods), the only +restricted method is [`eth_accounts`](/wallet/reference/eth_accounts), which allows you to access +the user's Ethereum accounts. +More restricted methods will be added in the future. + +### Unrestricted methods + +Unrestricted methods do not require requesting permission to call them, but they might still rely on +permissions to succeed (for example, the signing methods require calling the restricted +[`eth_accounts`](/wallet/reference/eth_accounts) method), or they might require confirmation by the +user (for example, [`wallet_addEthereumChain`](/wallet/reference/wallet_addethereumchain)). diff --git a/wallet/concepts/architecture.md b/wallet/concepts/architecture.md index a3b1eb37c16..f1eda700e31 100644 --- a/wallet/concepts/architecture.md +++ b/wallet/concepts/architecture.md @@ -9,8 +9,8 @@ The following diagram outlines the high-level architecture of the MetaMask web3 ![Architecture diagram](../assets/web3-architecture.png) -Using [MetaMask SDK](sdk.md), dapps built on multiple platforms can connect to their users' Ethereum +Using [MetaMask SDK](sdk/index.md), dapps built on multiple platforms can connect to their users' Ethereum accounts through the MetaMask browser extension and MetaMask Mobile. -Dapps can send [JSON-RPC API](../reference/rpc-api.md) calls to the users' MetaMask wallet clients. +Dapps can send [JSON-RPC API](apis.md#json-rpc-api) calls to the users' MetaMask wallet clients. MetaMask then responds to these requests directly or uses [Infura](https://www.infura.io/) (or another user-configured node provider) when the call requires access to information on a blockchain network. diff --git a/wallet/concepts/convenience-libraries.md b/wallet/concepts/convenience-libraries.md index 0a83719b15c..b09a23068a6 100644 --- a/wallet/concepts/convenience-libraries.md +++ b/wallet/concepts/convenience-libraries.md @@ -1,6 +1,6 @@ --- description: Learn about convenience libraries. -sidebar_position: 5 +sidebar_position: 4 --- # Convenience libraries @@ -13,16 +13,18 @@ contracts, for a variety of API preferences (for example, promises, callbacks, a The [MetaMask Ethereum provider API](../reference/provider-api.md) is very simple, and wraps [Ethereum JSON-RPC](../reference/rpc-api.md) formatted messages, which is why some developers use a convenience library for interacting with the provider, such as -[Ethers](https://www.npmjs.com/package/ethers), [web3.js](https://www.npmjs.com/package/web3), -[Truffle](https://www.trufflesuite.com/), and [Embark](https://framework.embarklabs.io/). +[Ethers](https://www.npmjs.com/package/ethers), [web3.js](https://www.npmjs.com/package/web3), and +[Embark](https://framework.embarklabs.io/). You can refer to those tools' documentation to use them. :::tip Use MetaMask SDK -We recommend using [MetaMask SDK](sdk.md), which provides a reliable, secure, and seamless +We recommend using [MetaMask SDK](sdk/index.md), which provides a reliable, secure, and seamless connection from your dapp to the MetaMask wallet. It onboards users smoothly from multiple dapp platforms using the MetaMask browser extension or MetaMask Mobile, and your dapp can call any [provider API method](../reference/provider-api.md) with the SDK installed. - Get started by [setting up the SDK](../how-to/connect/set-up-sdk/index.md). ::: + +You can also [use Web3-Onboard with MetaMask SDK](../how-to/use-3rd-party-integrations/web3-onboard.md) +in your JavaScript dapp. diff --git a/wallet/concepts/provider-api.md b/wallet/concepts/provider-api.md deleted file mode 100644 index f8c0025cb43..00000000000 --- a/wallet/concepts/provider-api.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 3 -description: Learn about the MetaMask Ethereum provider API. ---- - -# Ethereum provider API - -MetaMask injects a global JavaScript API into websites visited by its users using the -`window.ethereum` provider object. -This API is specified by [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193), and it allows dapps to -request users' Ethereum accounts, read data from blockchains the user is connected to, suggest -that the user sign messages and transactions, and more. - -The MetaMask Ethereum provider API contains the following: - -- [Properties](../reference/provider-api.md#properties) - The provider contains a property that - detects if a user has MetaMask installed. -- [Methods](../reference/provider-api.md#methods) - The provider contains methods that dapps can call. - The [`window.ethereum.request(args)`](../reference/provider-api.md#windowethereumrequestargs) - provider method wraps the [MetaMask JSON-RPC API](rpc-api.md); dapps can use this - provider method to call any RPC method. -- [Events](../reference/provider-api.md#events) - The provider emits events that dapps can listen to. - -View the [provider API reference](../reference/provider-api.md) for all the provider properties, -methods, and events. - -:::tip Use MetaMask SDK with the provider API -You can call the provider API from a dapp with or without [MetaMask SDK](sdk.md) installed, but we -recommend using the SDK to enable users to easily connect to the MetaMask browser extension and -MetaMask Mobile. -The SDK supports multiple dapp platforms including mobile and gaming dapps. - -Get started by [setting up the SDK](../how-to/connect/set-up-sdk/index.md). -::: diff --git a/wallet/concepts/rpc-api.md b/wallet/concepts/rpc-api.md deleted file mode 100644 index 375b4041786..00000000000 --- a/wallet/concepts/rpc-api.md +++ /dev/null @@ -1,59 +0,0 @@ ---- -sidebar_position: 4 -description: Learn about the MetaMask JSON-RPC API. ---- - -# JSON-RPC API - -MetaMask uses the [`window.ethereum.request(args)`](../reference/provider-api.md#windowethereumrequestargs) -method of the [provider API](provider-api.md) to wrap a JSON-RPC API. -The JSON-RPC API contains standard Ethereum JSON-RPC API methods and MetaMask-specific methods. - -:::tip MetaMask API Playground -The RPC methods are documented in the interactive -[MetaMask JSON-RPC API Playground](/wallet/reference/eth_subscribe). -::: - -Methods in the API playground may have the following tags: - -- **MetaMask** - These methods behave in ways specific to MetaMask, and may or may not be supported - by other wallets. - Some of these methods are documented in more detail on the [JSON-RPC reference](../reference/rpc-api.md). -- **Restricted** - These methods are [restricted](#restricted-methods), which require requesting - permission using [`wallet_requestPermissions`](/wallet/reference/wallet_requestpermissions). -- **Mobile** - These methods are only available on MetaMask Mobile. -- **Ethereum API** - These are standard Ethereum JSON-RPC API methods. - See the [Ethereum wiki](https://eth.wiki/json-rpc/API#json-rpc-methods) for more information on - these methods. - -:::note -All RPC method requests can return errors. -Make sure to handle errors for every call to -[`window.ethereum.request(args)`](../reference/provider-api.md#windowethereumrequestargs). -::: - -## Restricted methods - -MetaMask introduced web3 wallet permissions in [EIP-2255](https://eips.ethereum.org/EIPS/eip-2255). -In this permissions system, each RPC method is restricted or unrestricted. -If a method is restricted, a dapp must request permission to call it using -[`wallet_requestPermissions`](/wallet/reference/wallet_requestpermissions). -Under the hood, permissions are plain, JSON-compatible objects, with fields that are mostly used -internally by MetaMask. - -Outside of [Snaps restricted methods](/snaps/reference/rpc-api/#restricted-methods), the only -restricted method is [`eth_accounts`](/wallet/reference/eth_accounts), which allows you to access -the user's Ethereum accounts. -More restricted methods will be added in the future. - -## Unrestricted methods - -Unrestricted methods do not require requesting permission to call them, but they might still rely on -permissions to succeed (for example, the signing methods require calling the restricted -[`eth_accounts`](/wallet/reference/eth_accounts) method), or they might require confirmation by the -user (for example, [`wallet_addEthereumChain`](/wallet/reference/wallet_addethereumchain)). - -See the [JSON-RPC API reference](../reference/rpc-api.md) for some MetaMask-specific unrestricted -methods and examples of how to implement them. -For the full list of MetaMask JSON-RPC API methods, see the -[API playground](/wallet/reference/eth_subscribe). diff --git a/wallet/concepts/sdk.md b/wallet/concepts/sdk.md deleted file mode 100644 index b910d38bd87..00000000000 --- a/wallet/concepts/sdk.md +++ /dev/null @@ -1,139 +0,0 @@ ---- -description: Learn about MetaMask SDK. -sidebar_position: 2 ---- - -# MetaMask SDK - -MetaMask SDK is a library that provides a reliable, secure, and seamless connection from your dapp -to the MetaMask browser extension and MetaMask Mobile. -You can install the SDK in existing dapps, and call any [provider API](provider-api.md) methods from -your dapp. - -This page demonstrates the [user experience](#user-experience) of using a dapp with the SDK -installed. -It also describes the secure [communication layer](#communication-layer) the SDK uses when -connecting to MetaMask Mobile, and the different [connection statuses](#connection-status). - -:::tip important -MetaMask SDK is the recommended method of integrating your dapp with the MetaMask wallet. -You can get started by [setting up the SDK](../how-to/connect/set-up-sdk/index.md). -::: - -## User experience - -The following are examples of how a user experiences a dapp with the SDK installed, on various platforms. - - - -# Desktop - -When a user accesses your web dapp on a desktop browser that doesn't have the MetaMask extension -installed, a popup appears that prompts the user to either install the MetaMask extension or connect -to MetaMask Mobile using a QR code. - -![SDK desktop browser example](../assets/sdk-desktop-browser.gif) - -You can download the -[React project example](https://github.com/MetaMask/examples/tree/main/metamask-with/metamask-sdk-create-react-app). -Install the example using `yarn` and run it using `yarn start`. - -# Mobile - -When a user accesses your mobile dapp, or web dapp on a mobile browser, the SDK automatically -deeplinks to MetaMask Mobile (or if the user doesn't already have it, prompts them to install it). -After the user accepts the connection, they're automatically redirected back to your dapp. -This happens for all actions that need user approval. - -

- -![SDK mobile browser example](../assets/sdk-mobile-browser.gif) - -

- -You can download the -[React project example](https://github.com/MetaMask/examples/tree/main/metamask-with/metamask-sdk-create-react-app). -Install the example using `yarn` and run it using `yarn start`. - -You can also download the -[React Native example](https://c0f4f41c-2f55-4863-921b-sdk-docs.github.io/downloads/reactNativeApp_v0.1.0.zip). -Install the example using `yarn setup` and run it using `yarn ios` or `yarn android`. - -# Node.js - -When a user accesses your Node.js dapp, the SDK renders a QR code on the console which users can -scan with their MetaMask Mobile app. - -

- -![SDK Node.js example](../assets/sdk-nodejs.gif) - -

- -You can download the -[Node.js example](https://c0f4f41c-2f55-4863-921b-sdk-docs.github.io/downloads/nodejs_v0.0.1_beta5.zip). -Install the example using `yarn` and run it using `node .`. - -# Unity - -When a user accesses your Unity game, the SDK renders a QR code in the game UI using a dedicated -prefab which players can scan with their MetaMask Mobile app. -It also supports deeplinking on mobile platforms. - - - -## Communication layer - -The SDK uses elliptic curve integrated encryption scheme (ECIES) to communicate with MetaMask Mobile. -ECIES is a hybrid encryption scheme that combines the benefits of both symmetric and asymmetric encryption. -It's a secure method of exchanging encrypted messages between two parties. - -In ECIES, the sender (your dapp) generates a shared secret using the recipient's (MetaMask Mobile's) -public key and their own private key. -The shared secret is used to encrypt the message using a symmetric cipher (the SDK uses `AES-256-GCM`). -The encrypted message is then combined with a message authentication code (MAC) and sent to the recipient. - -MetaMask Mobile uses its private key and the dapp's public key to recreate the shared secret and -decrypt the message. -The MAC is used to verify the authenticity of the message. - -One of the main benefits of ECIES is that it allows the sender and recipient to exchange messages -without having to exchange a shared secret beforehand. -It also provides security against eavesdropping and tampering, since the shared secret is derived -from the sender's and recipient's private keys, which are both kept secret. - -## Connection status - -### Paused connections - -Connections pause after MetaMask Mobile is in background (minimized) for 20 seconds. -This is to accommodate OS restrictions. - -When a connection pauses, all traffic to MetaMask Mobile pauses, and the SDK doesn't produce any -response until the user opens MetaMask Mobile again. -The SDK automatically deeplinks to MetaMask Mobile, so connections resume automatically. -If MetaMask Mobile is paused and the user completely closes MetaMask Mobile, the connection remains -paused and resumes when the user opens it again. - -Because of this, polling data from MetaMask Mobile may not work for long periods of time. - -:::info known issue -When MetaMask Mobile is running in the background, the connection may pause and fail to resume properly when the user reopens MetaMask. -The user must return to your dapp so the request is re-sent. -The SDK team is working on this issue, and is researching decentralized communication solutions that -hold state such as [Waku](https://waku.org/). -::: - -### Cleared connections - -Connections clear if the user closes or refreshes your dapp, since MetaMask doesn't persist -connections on the dapp side. -This is for simplicity and security purposes. - -If the user completely closes MetaMask Mobile without [pausing the connection](#paused-connections) -first, MetaMask infers that the user isn't using the wallet and closes the connection. - -#### Close connections manually - -To close connections manually from MetaMask Mobile, go to **Settings > Experimental**, and select -**Clear MetaMask SDK connections**. diff --git a/wallet/concepts/sdk/android.md b/wallet/concepts/sdk/android.md new file mode 100644 index 00000000000..b23d482cada --- /dev/null +++ b/wallet/concepts/sdk/android.md @@ -0,0 +1,56 @@ +--- +sidebar_position: 2 +--- + +# Android SDK architecture + +The Android version of [MetaMask SDK](index.md) enables your users to easily connect with their +MetaMask Mobile wallet. +The [architecture](#architecture) and [connection flow](#connection-flow) of +the Android SDK differs from the other SDK platforms. + +:::tip Get started +- Get started by [setting up the SDK in your Android dapp](../../how-to/connect/set-up-sdk/mobile/android.md). +- See the [example Android dapp](https://github.com/MetaMask/metamask-android-sdk/tree/main/app) in + the Android SDK GitHub repository for advanced use cases. +::: + +## Architecture + +The following diagram outlines the high-level architecture of the Android SDK: + +![Android SDK architecture diagram](../../assets/sdk-android-architecture.png) + +The MetaMask Android SDK consists of two components: + +- **The client SDK**, imported in the dapp +- **The server SDK**, an Android Native Module embedded in the MetaMask React Native wallet + +The client SDK communicates with the server SDK using +[Interprocess communication (IPC)](https://developer.android.com/guide/components/processes-and-threads#IPC). +The JSON-RPC calls are implemented using the +[Android Interface Definition Language (AIDL)](https://developer.android.com/guide/components/aidl). +Communication over IPC is encrypted using elliptic curve integrated encryption scheme (ECIES). + +Within MetaMask, the wallet (written in React Native) communicates with the Native Module (written +in Kotlin) using different mechanisms depending on the direction of communication: + +- **Native Module → React Native** - The Native Module broadcasts messages as events that the wallet + listens to and handles upon receipt. +- **React Native → Native Module** - The wallet calls the Native Module using the `NativeModules` API, + which enables React Native code to call native Kotlin primitives. + +## Connection flow + +The following diagram outlines the communication flow between the Android client SDK and server SDK: + +![Android SDK communication diagram](../../assets/sdk-android-communication.png) + +The flow is as follows: + +1. The dapp, with the SDK installed, initiates communication when a user connects to MetaMask. + The dapp deeplinks to MetaMask, and MetaMask sets up the Android Native Module to receive client requests. +2. The dapp generates an ECIES public/private key pair. + The dapp and MetaMask exchange public keys over IPC. +3. The dapp and MetaMask perform end-to-end encrypted JSON-RPC calls. + diff --git a/wallet/concepts/sdk/connections.md b/wallet/concepts/sdk/connections.md new file mode 100644 index 00000000000..35c4d585ffe --- /dev/null +++ b/wallet/concepts/sdk/connections.md @@ -0,0 +1,151 @@ +--- +sidebar_position: 1 +sidebar_label: SDK connections +--- + +# MetaMask SDK connections + +This page provides details on how a dapp with [MetaMask SDK](index.md) installed connects to a +user's MetaMask wallet. + +## Initial connection flow + +The following flowchart outlines the initial connection flow between a dapp and MetaMask: + +

+ +```mermaid +flowchart TD + A{{Dapp platform?}} + A -->|Desktop| C(Show modal) --> D{{Connect via?}} + D -->|Extension| E{{Extension installed?}} + E -->|No| F(Chrome store) --> G(Connect via extension) + E -->|Yes| G + D -->|MM Mobile| H{{MM Mobile installed?}} + H -->|Yes| J + H -->|No| I(App store) --> J(Connect via MM Mobile) + A -->|Mobile| K(Deeplink to MM Mobile) --> H +``` + +

+ +The path first depends on whether the dapp is on a desktop or mobile platform: + +- If the dapp is on a desktop platform (for example, a desktop web dapp), the dapp shows a modal + asking the user to select if they want to connect to MetaMask using the browser extension or + MetaMask Mobile. + + - If the user selects extension: + - If the extension is not installed, the user is taken to the Chrome extension store to + install it. + - If the extension is installed, the user connects to their MetaMask extension. + + - If the user selects MetaMask Mobile: + - If MetaMask Mobile is not installed, the user is taken to the app store to install it. + - If MetaMask Mobile is installed, [an encrypted connection from the dapp to MetaMask + Mobile](#metamask-mobile-connection) is established. + + :::note + The choice between the extension and MetaMask Mobile persists until the user or dapp disconnects. + At that point, the dapp displays the modal again. + ::: + +- If the dapp is on a mobile platform (for example, a mobile web dapp or mobile dapp), the dapp + deeplinks to MetaMask Mobile. + + - If MetaMask Mobile is not installed, the user is taken to the app store to install it. + - If MetaMask Mobile is installed, [an encrypted connection from the dapp to MetaMask + Mobile](#metamask-mobile-connection) is established. + +## MetaMask Mobile connection + +The SDK uses elliptic curve integrated encryption scheme (ECIES) to communicate with MetaMask Mobile. +The following sequence diagram outlines how a dapp establishes an encrypted connection with MetaMask Mobile: + +```mermaid +%%{ + init: { + 'sequence': { + 'actorMargin': 100, + 'width': 250, + 'noteMargin': 15 + } + } +}%% + +sequenceDiagram + autonumber + participant Dapp as Dapp (MetaMask SDK) + participant Socket as Socket.io server + participant MMM as MetaMask Mobile + + Dapp->>Dapp: Generate a Socket.io room ID and ECIES key pair + Dapp->>Socket: Connect using Socket.io room ID + Dapp->>MMM: Send deeplink containing Socket.io room ID and ECIES public key + MMM->>Socket: Connect using Socket.io room ID + MMM->>MMM: Generate an ECIES key pair + MMM->>Dapp: Send ECIES public key using the Socket.io channel + + note over Dapp, MMM: The dapp and MetaMask Mobile generate a shared secret using their own private key and the other party's public key. All further communication is encrypted and decrypted using the shared secret. + loop + Dapp->>MMM: Send encrypted message + MMM->>Dapp: Send encrypted message + end +``` + +The flow is as follows: + +1. The dapp generates a UUID v4 ([Socket.io](https://socket.io/) room ID) and ECIES key pair. +2. The dapp connects to the Socket.io server using the room ID. +3. The dapp sends a deeplink to MetaMask Mobile (either directly, if on mobile, or through a QR + code, if on desktop) containing its ECIES public key and the Socket.io room ID. +4. MetaMask Mobile opens the QR code or deeplink and connects to the Socket.io server using the room ID. +5. MetaMask Mobile generates an ECIES key pair. +6. MetaMask Mobile sends its ECIES public key to the dapp using the Socket.io channel, and the two + parties generate a shared secret. +7. The dapp and MetaMask Mobile establish an encrypted connection to send JSON-RPC API methods. + +:::note +For all platforms except Android, the SDK uses a Socket.io server to help establish the encrypted connection. +The [Android SDK](android.md) uses direct local communication. +::: + +## Connection status + +The connection between the SDK and MetaMask Mobile can [pause](#paused-connections) and +[clear](#cleared-connections). +You can also [close connections manually](#close-connections-manually). + +### Paused connections + +Connections pause after MetaMask Mobile is in background (minimized) for 20 seconds. +This is to accommodate OS restrictions. + +When a connection pauses, all traffic to MetaMask Mobile pauses, and the SDK doesn't produce any +response until the user opens MetaMask Mobile again. +The SDK automatically deeplinks to MetaMask Mobile, so connections resume automatically. +If MetaMask Mobile is paused and the user completely closes MetaMask Mobile, the connection remains +paused and resumes when the user opens it again. + +Because of this, polling data from MetaMask Mobile may not work for long periods of time. + +:::info known issue +When MetaMask Mobile is running in the background, the connection may pause and fail to resume properly when the user reopens MetaMask. +The user must return to your dapp so the request is re-sent. +The SDK team is working on this issue, and is researching decentralized communication solutions that +hold state such as [Waku](https://waku.org/). +::: + +### Cleared connections + +Connections clear if the user closes or refreshes your dapp, since MetaMask doesn't persist +connections on the dapp side. +This is for simplicity and security purposes. + +If the user completely closes MetaMask Mobile without [pausing the connection](#paused-connections) +first, MetaMask infers that the user isn't using the wallet and closes the connection. + +### Close connections manually + +To close connections manually from MetaMask Mobile, go to **Settings > Experimental**, and select +**Clear MetaMask SDK connections**. diff --git a/wallet/concepts/sdk/index.md b/wallet/concepts/sdk/index.md new file mode 100644 index 00000000000..41684236996 --- /dev/null +++ b/wallet/concepts/sdk/index.md @@ -0,0 +1,155 @@ +--- +description: Learn about MetaMask SDK. +sidebar_position: 2 +--- + +# About MetaMask SDK + +MetaMask SDK is a library that provides a reliable, secure, and seamless connection from your dapp +to the MetaMask browser extension and MetaMask Mobile. +You can install the SDK in existing dapps, and call any [provider API](../apis.md) methods from +your dapp. + +:::tip Get started +MetaMask SDK is the recommended method of integrating your dapp with MetaMask. +You can get started by [setting up the SDK](../../how-to/connect/set-up-sdk/index.md). +::: + +## Benefits of MetaMask SDK + +Before MetaMask SDK, there were three ways to connect a dapp to a user's MetaMask wallet: + +1. Connect from a web dapp in a desktop browser to the MetaMask browser extension +2. Connect from a web dapp in MetaMask Mobile's in-app browser to MetaMask Mobile +3. Use third-party libraries to connect a mobile dapp to MetaMask Mobile + +With MetaMask SDK, there are more ways to connect: + +1. Connect from a web dapp in a desktop browser to the MetaMask browser extension or to MetaMask Mobile +2. Connect from a web dapp in a mobile browser to MetaMask Mobile +3. Connect from desktop, mobile, and gaming dapps to MetaMask Mobile + +MetaMask SDK enables your dapp to provide a seamless user experience for MetaMask users, from +multiple dapp platforms, without relying on third-party libraries. +Moreover, the SDK uses the [Ethereum provider](../apis.md#ethereum-provider-api) that developers are +already used to, so existing dapps work out of the box with the SDK. + +## User experience + +The following are examples of how a user experiences a dapp with the SDK installed, on various platforms. + + + +# Desktop browser + +When a user accesses your web dapp on a desktop browser that doesn't have the MetaMask extension +installed, a popup appears that prompts the user to either install the MetaMask extension or connect +to MetaMask Mobile using a QR code. + +

+ +

+ +:::tip Get started +- Get started by [setting up the SDK in your web dapp](../../how-to/connect/set-up-sdk/javascript/index.md). +- See the [example JavaScript dapps](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) + in the JavaScript SDK GitHub repository for advanced use cases. +::: + +# Mobile browser + +When a user accesses your web dapp on a mobile browser, the SDK automatically deeplinks to MetaMask +Mobile (or if the user doesn't already have it, prompts them to install it). +After the user accepts the connection, they're automatically redirected back to your dapp. +This happens for all actions that need user approval. + +

+ +

+ +:::tip Get started +- Get started by [setting up the SDK in your web dapp](../../how-to/connect/set-up-sdk/javascript/index.md). +- See the [example JavaScript dapps](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) + in the JavaScript SDK GitHub repository for advanced use cases. +::: + +# iOS + +When a user accesses your iOS dapp, the SDK automatically deeplinks to MetaMask Mobile (or if the +user doesn't already have it, prompts them to install it). +After the user accepts the connection, they're automatically redirected back to your dapp. +This happens for all actions that need user approval. + +

+ +

+ +:::tip Get started +- Get started by [setting up the SDK in your iOS dapp](../../how-to/connect/set-up-sdk/mobile/ios.md). +- See the [example iOS dapp](https://github.com/MetaMask/metamask-ios-sdk) in the iOS SDK GitHub + repository for advanced use cases. +::: + +# Android + +When a user accesses your Android dapp, the SDK automatically deeplinks to MetaMask Mobile (or if +the user doesn't already have it, prompts them to install it). +After the user accepts the connection, they're automatically redirected back to your dapp. +This happens for all actions that need user approval. + +

+ +

+ +:::tip Get started +- Get started by [setting up the SDK in your Android dapp](../../how-to/connect/set-up-sdk/mobile/android.md). +- See the [example Android dapp](https://github.com/MetaMask/metamask-android-sdk/tree/main/app) in + the Android SDK GitHub repository and the [Android SDK architecture](android.md) for more information. +::: + +# Node.js + +When a user accesses your Node.js dapp, the SDK renders a QR code on the console which users can +scan with their MetaMask Mobile app. + +

+ +

+ +:::tip Get started +- Get started by [setting up the SDK in your Node.js dapp](../../how-to/connect/set-up-sdk/javascript/nodejs.md). +- See the [example Node.js dapp](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples/nodejs) + in the Node.js SDK GitHub repository for advanced use cases. +::: + +# Unity + +When a user accesses your Unity game, the SDK renders a QR code in the game UI using a dedicated +prefab which players can scan with their MetaMask Mobile app. +It also supports deeplinking on mobile platforms, as demonstrated in the following screen recording. + +

+ +

+ +:::tip Get started +- Get started by [setting up the SDK in your Unity game](../../how-to/connect/set-up-sdk/gaming/unity.md). +- See the [Unity demo game with the SDK installed](https://assetstore.unity.com/packages/decentralization/demo-game-dragon-crasher-with-metamask-sdk-infura-and-truffle-249789) + for advanced use cases. +::: + + + +You can read more about the [connection flow between the SDK and MetaMask](connections.md). diff --git a/wallet/concepts/signing-methods.md b/wallet/concepts/signing-methods.md index 406227803ad..b3c1cf05d89 100644 --- a/wallet/concepts/signing-methods.md +++ b/wallet/concepts/signing-methods.md @@ -1,6 +1,6 @@ --- description: Learn about the RPC methods for signing transactions in MetaMask. -sidebar_position: 6 +sidebar_position: 5 --- # Signing methods diff --git a/wallet/how-to/access-provider.md b/wallet/how-to/access-provider.md index 046007c20cb..23670d2da0c 100644 --- a/wallet/how-to/access-provider.md +++ b/wallet/how-to/access-provider.md @@ -8,7 +8,7 @@ sidebar_position: 8 Use the [`@metamask/providers`](https://github.com/MetaMask/providers) module to access a user's MetaMask provider from other sources, such as external extension providers and inpage providers. -The account provided by this provider is the user's MetaMask account. +The accounts provided by this provider are the user's MetaMask accounts. When sending signing requests to this provider, MetaMask prompts the user to sign with their accounts. This module works in Chrome and Firefox. diff --git a/wallet/how-to/add-network.md b/wallet/how-to/add-network.md new file mode 100644 index 00000000000..582a27aa0eb --- /dev/null +++ b/wallet/how-to/add-network.md @@ -0,0 +1,64 @@ +--- +description: Prompt a user to add or switch to an Ethereum network. +sidebar_position: 6 +--- + +# Add a network + +In some cases, such as when [interacting with smart contracts](interact-with-smart-contracts/index.md), +your dapp must connect a user to a new network in MetaMask. +Instead of the user [adding a new network manually](https://support.metamask.io/hc/en-us/articles/360043227612-How-to-add-a-custom-network-RPC#h_01G63GGJ83DGDRCS2ZWXM37CV5), +which requires them to configure RPC URLs and chain IDs, your dapp can use the +[`wallet_addEthereumChain`](/wallet/reference/wallet_addethereumchain) and +[`wallet_switchEthereumChain`](/wallet/reference/wallet_switchethereumchain) RPC methods to prompt +the user to add a specific, pre-configured network to their MetaMask wallet. + +These methods are specified by [EIP-3085](https://eips.ethereum.org/EIPS/eip-3085) and +[EIP-3326](https://eips.ethereum.org/EIPS/eip-3326), and we recommend using them together. + +1. `wallet_addEthereumChain` creates a confirmation asking the user to add the specified network to MetaMask. +2. `wallet_switchEthereumChain` creates a confirmation asking the user to switch to the specified network. + +The confirmations look like the following: + +
+
+ Add network confirmation +
+
+ Switch network confirmation +
+
+ +## Example + +The following is an example of using `wallet_addEthereumChain` and `wallet_switchEthereumChain` to +prompt a user to add and switch to a new network: + +```javascript +try { + await ethereum.request({ + method: 'wallet_switchEthereumChain', + params: [{ chainId: '0xf00' }], + }); +} catch (switchError) { + // This error code indicates that the chain has not been added to MetaMask. + if (switchError.code === 4902) { + try { + await ethereum.request({ + method: 'wallet_addEthereumChain', + params: [ + { + chainId: '0xf00', + chainName: '...', + rpcUrls: ['https://...'] /* ... */, + }, + ], + }); + } catch (addError) { + // handle "add" error + } + } + // handle other "switch" errors +} +``` \ No newline at end of file diff --git a/wallet/how-to/connect/access-accounts.md b/wallet/how-to/connect/access-accounts.md index 3738c4e4b5c..88e8d403f6b 100644 --- a/wallet/how-to/connect/access-accounts.md +++ b/wallet/how-to/connect/access-accounts.md @@ -9,7 +9,7 @@ User accounts are used in a variety of contexts in Ethereum, including as identi [signing transactions](../sign-data/index.md). To request a signature from a user or have a user approve a transaction, your dapp must access the user's accounts using the -[`eth_requestAccounts`](../../reference/rpc-api.md#eth_requestaccounts) RPC method. +[`eth_requestAccounts`](/wallet/reference/eth_requestaccounts) RPC method. When accessing a user's accounts: diff --git a/wallet/how-to/connect/detect-metamask.md b/wallet/how-to/connect/detect-metamask.md index 3d7fca3ea38..0476a117840 100644 --- a/wallet/how-to/connect/detect-metamask.md +++ b/wallet/how-to/connect/detect-metamask.md @@ -8,8 +8,8 @@ sidebar_position: 2 The presence of the MetaMask Ethereum provider object, `window.ethereum`, in a user's browser indicates an Ethereum user. -To demonstrate this, verify if your browser is running MetaMask by copying and pasting the following -code snippet in the developer console of your browser: +To demonstrate this, verify whether your browser is running MetaMask by copying and pasting the following +code snippet into your browser's developer console: ```javascript if (typeof window.ethereum !== 'undefined') { diff --git a/wallet/how-to/connect/detect-network.md b/wallet/how-to/connect/detect-network.md index d76494dbecc..2fc76e16176 100644 --- a/wallet/how-to/connect/detect-network.md +++ b/wallet/how-to/connect/detect-network.md @@ -31,10 +31,10 @@ function handleChainChanged(chainId) { These are the chain IDs of the Ethereum networks that MetaMask supports by default. Consult [chainid.network](https://chainid.network) for more. -| Hex | Decimal | Network | -|----------|----------|---------------------------------------------------------------------------| -| 0x1 | 1 | Ethereum main network (Mainnet) | -| 0x5 | 5 | Goerli test network | -| 0xaa36a7 | 11155111 | Sepolia test network | -| 0xe704 | 59140 | [Linea Goerli test network](https://docs.linea.build/) | -| 0x539 | 1337 | Localhost test networks (including [Ganache](../get-started-building/run-devnet.md)) | +| Hex | Decimal | Network | +|----------|----------|--------------------------------------------------------| +| 0x1 | 1 | Ethereum main network (Mainnet) | +| 0x5 | 5 | Goerli test network | +| 0xaa36a7 | 11155111 | Sepolia test network | +| 0xe704 | 59140 | [Linea Goerli test network](https://docs.linea.build/) | +| 0x539 | 1337 | Localhost test networks | diff --git a/wallet/how-to/connect/set-up-sdk/gaming/index.md b/wallet/how-to/connect/set-up-sdk/gaming/index.md index 9b383a7304f..dae85ea1a32 100644 --- a/wallet/how-to/connect/set-up-sdk/gaming/index.md +++ b/wallet/how-to/connect/set-up-sdk/gaming/index.md @@ -5,7 +5,7 @@ sidebar_position: 2 # Use MetaMask SDK with gaming dapps -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your gaming dapp to enable your users +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your gaming dapp to enable your users to easily connect with their MetaMask Mobile wallet. See the instructions for the following gaming platforms: diff --git a/wallet/how-to/connect/set-up-sdk/gaming/unity.md b/wallet/how-to/connect/set-up-sdk/gaming/unity.md index 17cb5e3c774..ac9e3cbd6ad 100644 --- a/wallet/how-to/connect/set-up-sdk/gaming/unity.md +++ b/wallet/how-to/connect/set-up-sdk/gaming/unity.md @@ -3,9 +3,11 @@ sidebar_label: Unity sidebar_position: 1 --- +import ReactPlayer from 'react-player/lazy' + # Use MetaMask SDK with Unity -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your [Unity](https://assetstore.unity.com/packages/decentralization/infrastructure/metamask-246786) game to enable users to easily connect to their MetaMask Mobile wallet. The MetaMask Unity SDK supports macOS, Windows, Linux, iOS, Android, and WebGL. @@ -15,7 +17,7 @@ The MetaMask Unity SDK supports macOS, Windows, Linux, iOS, Android, and WebGL. The following video demonstrates how to install and use the MetaMask Unity SDK.

- +

## Steps @@ -53,6 +55,26 @@ with it and its examples in the scene. You also need to install [TextMeshPro](https://docs.unity3d.com/Manual/com.unity.textmeshpro.html). If you don't have TextMeshPro installed, the Unity editor automatically prompts you to install it. +
+ +Unity SDK package structure +

+ +| File or directory | Contents | +| ------------------------ | ---------------------------------------------- | +| `Documentation` | Documentation and link to online documentation | +| `Editor` | Editor-only code such as Setup GUI windows, data persistence for SDK settings | +| `Plugins` | Plugins needed by the package (the ECIES Platform runtime libraries and core SDK Codebase) | +| `Runtime` | Main scripts for the SDK that are environment-agnostic, including the C# scripts that provide the base implementation of the SDK | +| `Samples` | Test application scene that can be used as a referral for your project, including modal popups and dynamic UI scaling | +| `LICENSE.md` | Package license | +| `Third Party Notices.md` | Third party notices | + + +

+ +
+ ### 3. Initialize MetaMask The main class you interface with is called `MetaMaskWallet`. @@ -128,7 +150,7 @@ void OnWalletAuthorized(object sender, EventArgs e) { } ``` -You can call any Ethereum request on the wallet using `wallet.Request(myRequest)`. +You can call any [JSON-RPC API method](/wallet/reference/eth_subscribe) using `wallet.Request(myRequest)`. The following is a sample transaction request: ```csharp @@ -148,6 +170,11 @@ var request = new MetaMaskEthereumRequest await wallet.Request(request); ``` +:::note +See the [Unity SDK API reference](../../../../reference/sdk-unity-api.md) for an overview of the +API methods from the most important classes. +::: + ### 6. Configure MetaMask You can customize the default configuration or create your own configuration. @@ -163,83 +190,6 @@ Create a new configuration by right-clicking on the project window and navigatin **MetaMask > Config**. Name the new configuration and use it when initializing the `MetaMaskUnity` instance. -## API - -The following is an overview of the APIs from the most important classes. - -### MetaMaskUnity - -This is a singleton class that you can use to access the `MetaMaskWallet` instance, which is -specific to Unity. - -#### `Instance` - -This is the singleton instance of the `MetaMaskUnity` class that is lazy-loaded when you access it -for the first time. - -#### `Initialize` - -This method initializes the `MetaMaskWallet` instance and makes it accessible via the `Wallet` property. -You can also pass extra options and parameters to it to customize the wallet instance: - -```csharp -// Initialize using default settings -MetaMaskUnity.Instance.Initialize(); - -// Initialize using custom transport and socket provider -var transport = new MyCustomTransport(); -var socketProvider = new MyCustomSocketProvider(); -MetaMaskUnity.Instance.Initialize(transport, socketProvider); - -// Initialize using custom config, transport and socket provider -var config = myMetaMaskConfig; -var transport = new MyCustomTransport(); -var socketProvider = new MyCustomSocketProvider(); -MetaMaskUnity.Instance.Initialize(config, transport, socketProvider); -``` - -#### `SaveSession` - -This method saves the current session to the persistent storage. -This is useful when you want to save the session and restore it later. -This is automatically called when the application quits, but you can also manually call it. - -#### `LoadSession` - -This method loads the session from the persistent storage. -This is useful when you want to restore the session after the application quits. -This is automatically called when the application starts, but you can also manually call it. - -### MetaMaskWallet - -#### `Connect` - -This method connects to the MetaMask app. -It renders a generated QR code in the user interface for your users to scan with MetaMask Mobile. -After the user scans this QR code, a connect screen appears in MetaMask Mobile where the user can -approve the connection with your game application. - -#### `Disconnect` - -This method disconnects the user that is connected from the MetaMask app session. - -#### `Request` - -This method sends a request to MetaMask. -You can use it to call any [provider API method](../../../../reference/provider-api.md). - -## Package structure - -| File or directory | Contents | -| ------------------------ | ---------------------------------------------- | -| `Documentation` | Documentation and link to online documentation | -| `Editor` | Editor-only code such as Setup GUI windows, data persistence for SDK settings | -| `Plugins` | Plugins needed by the package (the ECIES Platform runtime libraries and core SDK Codebase) | -| `Runtime` | Main scripts for the SDK that are environment-agnostic, including the C# scripts that provide the base implementation of the SDK | -| `Samples` | Test application scene that can be used as a referral for your project, including modal popups and dynamic UI scaling | -| `LICENSE.md` | Package license | -| `Third Party Notices.md` | Third party notices | - ## FAQS
@@ -287,3 +237,10 @@ take longer to build at compile time. The SDK is filled with precompiled libraries to save on runtime compilation.
+ +## Next steps + +Once you have the MetaMask Unity SDK set up, you can: + +- [Interact with smart contracts in Unity.](../../../interact-with-smart-contracts/unity/index.md) +- [Enable human-readable addresses in Unity using Decentraweb.](../../../use-3rd-party-integrations/unity-dweb.md) diff --git a/wallet/how-to/connect/set-up-sdk/gaming/unreal-engine.md b/wallet/how-to/connect/set-up-sdk/gaming/unreal-engine.md index c718f79ff9c..617f4529f98 100644 --- a/wallet/how-to/connect/set-up-sdk/gaming/unreal-engine.md +++ b/wallet/how-to/connect/set-up-sdk/gaming/unreal-engine.md @@ -5,6 +5,6 @@ sidebar_position: 2 # Use MetaMask SDK with Unreal Engine -[MetaMask SDK](../../../../concepts/sdk.md) support for Unreal Engine games is coming soon. +[MetaMask SDK](../../../../concepts/sdk/index.md) support for Unreal Engine games is coming soon. The SDK currently supports [Unity](unity.md) gaming dapps, [JavaScript-based](../javascript/index.md) dapps, and [mobile](../mobile/index.md) dapps. \ No newline at end of file diff --git a/wallet/how-to/connect/set-up-sdk/index.md b/wallet/how-to/connect/set-up-sdk/index.md index 92c9d533ec5..8d65e8998c5 100644 --- a/wallet/how-to/connect/set-up-sdk/index.md +++ b/wallet/how-to/connect/set-up-sdk/index.md @@ -4,7 +4,7 @@ sidebar_position: 1 # Set up MetaMask SDK -[MetaMask SDK](../../../concepts/sdk.md) is a library that provides a reliable, secure, and seamless +[MetaMask SDK](../../../concepts/sdk/index.md) is a library that provides a reliable, secure, and seamless connection from your dapp to the MetaMask browser extension and MetaMask Mobile. It supports the following dapp platforms: @@ -31,8 +31,8 @@ It supports the following dapp platforms:
@@ -48,8 +48,14 @@ It supports the following dapp platforms:
- -:::note -MetaMask SDK uses the [Ethereum provider](../../../reference/provider-api.md) that developers are -already used to, so existing dapps work out of the box with the SDK. -::: +
+ +
+ +
+
diff --git a/wallet/how-to/connect/set-up-sdk/javascript/electron.md b/wallet/how-to/connect/set-up-sdk/javascript/electron.md index a36deefa948..7fb59a06ec6 100644 --- a/wallet/how-to/connect/set-up-sdk/javascript/electron.md +++ b/wallet/how-to/connect/set-up-sdk/javascript/electron.md @@ -5,8 +5,13 @@ sidebar_position: 6 # Use MetaMask SDK with Electron -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your Electron dapp to enable your users +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your Electron dapp to enable your users to easily connect to the MetaMask browser extension and MetaMask Mobile. -On the frontend, see the instructions to [use the SDK with React](react.md). -On the backend, see the instructions to [use the SDK with Node.js](nodejs.md). \ No newline at end of file +On the frontend, see the instructions to [use the SDK with React](react/index.md). +On the backend, see the instructions to [use the SDK with Node.js](nodejs.md). + +:::tip example +See the [example Electron dapp](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples/electronjs) +in the JavaScript SDK GitHub repository for advanced use cases. +::: diff --git a/wallet/how-to/connect/set-up-sdk/javascript/index.md b/wallet/how-to/connect/set-up-sdk/javascript/index.md index 9f063a23009..f1d502e5137 100644 --- a/wallet/how-to/connect/set-up-sdk/javascript/index.md +++ b/wallet/how-to/connect/set-up-sdk/javascript/index.md @@ -5,18 +5,24 @@ sidebar_position: 1 # Use MetaMask SDK with JavaScript -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your JavaScript dapp to enable your +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your JavaScript dapp to enable your users to easily connect to the MetaMask browser extension and MetaMask Mobile. The following instructions work for web dapps based on standard JavaScript. You can also see instructions for the following JavaScript-based platforms: -- [React](react.md) +- [React](react/index.md) + - [React UI](react/react-ui.md) - [Pure JavaScript](pure-js.md) - [Other web frameworks](other-web-frameworks.md) - [React Native](react-native.md) - [Node.js](nodejs.md) - [Electron](electron.md) +:::tip Examples +See the [example JavaScript dapps](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) +in the JavaScript SDK GitHub repository for advanced use cases. +::: + ## Prerequisites - An existing or [new project](../../../get-started-building/set-up-dev-environment.md) set up @@ -58,6 +64,15 @@ const MMSDK = new MetaMaskSDK(options); const ethereum = MMSDK.getProvider(); // You can also access via window.ethereum ``` +:::note Important SDK options +- Use [`dappMetadata`](../../../../reference/sdk-js-options.md#dappmetadata) to display information + about your dapp in the MetaMask connection modal. +- Use [`modals`](../../../../reference/sdk-js-options.md#modals) to [customize the logic and UI of + the displayed modals](../../../display/custom-modals.md). +- Use [`infuraAPIKey`](../../../../reference/sdk-js-options.md#infuraapikey) to + [make read-only RPC requests](../../../use-3rd-party-integrations/js-infura-api.md) from your dapp. +::: + ### 4. Use the SDK Use the SDK by calling any [provider API methods](../../../../reference/provider-api.md). diff --git a/wallet/how-to/connect/set-up-sdk/javascript/nodejs.md b/wallet/how-to/connect/set-up-sdk/javascript/nodejs.md index c446038ea84..b7828ecaf11 100644 --- a/wallet/how-to/connect/set-up-sdk/javascript/nodejs.md +++ b/wallet/how-to/connect/set-up-sdk/javascript/nodejs.md @@ -5,10 +5,15 @@ sidebar_position: 5 # Use MetaMask SDK with Node.js -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your Node.js dapp to enable your users +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your Node.js dapp to enable your users to easily connect to the MetaMask browser extension and MetaMask Mobile. The SDK for Node.js has the [same prerequisites](index.md#prerequisites) as for standard JavaScript. +:::tip Example +See the [example Node.js dapp](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples/nodejs) +in the JavaScript SDK GitHub repository for advanced use cases. +::: + ## Steps ### 1. Install the SDK @@ -43,6 +48,15 @@ const MMSDK = new MetaMaskSDK(options); const ethereum = MMSDK.getProvider(); // You can also access via window.ethereum ``` +:::note Important SDK options +- Use [`dappMetadata`](../../../../reference/sdk-js-options.md#dappmetadata) to display information + about your dapp in the MetaMask connection modal. +- Use [`modals`](../../../../reference/sdk-js-options.md#modals) to [customize the logic and UI of + the displayed modals](../../../display/custom-modals.md). +- Use [`infuraAPIKey`](../../../../reference/sdk-js-options.md#infuraapikey) to + [make read-only RPC requests](../../../use-3rd-party-integrations/js-infura-api.md) from your dapp. +::: + ### 4. Use the SDK Use the SDK by calling any [provider API methods](../../../../reference/provider-api.md). diff --git a/wallet/how-to/connect/set-up-sdk/javascript/other-web-frameworks.md b/wallet/how-to/connect/set-up-sdk/javascript/other-web-frameworks.md index 8c943a260ad..c90a5aa71d1 100644 --- a/wallet/how-to/connect/set-up-sdk/javascript/other-web-frameworks.md +++ b/wallet/how-to/connect/set-up-sdk/javascript/other-web-frameworks.md @@ -5,11 +5,16 @@ sidebar_position: 3 # Use MetaMask SDK with other web frameworks -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your web dapp to enable your users to +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your web dapp to enable your users to easily connect to the MetaMask browser extension and MetaMask Mobile. The SDK for other web frameworks has the [same prerequisites](index.md#prerequisites) as for standard JavaScript. +:::tip Examples +See the [example JavaScript dapps](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) +in the JavaScript SDK GitHub repository for advanced use cases. +::: + ## Steps ### 1. Install the SDK @@ -44,6 +49,15 @@ const MMSDK = new MetaMaskSDK(options); const ethereum = MMSDK.getProvider(); // You can also access via window.ethereum ``` +:::note Important SDK options +- Use [`dappMetadata`](../../../../reference/sdk-js-options.md#dappmetadata) to display information + about your dapp in the MetaMask connection modal. +- Use [`modals`](../../../../reference/sdk-js-options.md#modals) to [customize the logic and UI of + the displayed modals](../../../display/custom-modals.md). +- Use [`infuraAPIKey`](../../../../reference/sdk-js-options.md#infuraapikey) to + [make read-only RPC requests](../../../use-3rd-party-integrations/js-infura-api.md) from your dapp. +::: + ### 4. Use the SDK Use the SDK by calling any [provider API methods](../../../../reference/provider-api.md). diff --git a/wallet/how-to/connect/set-up-sdk/javascript/pure-js.md b/wallet/how-to/connect/set-up-sdk/javascript/pure-js.md index 1be44ad03ca..ba0e73057f3 100644 --- a/wallet/how-to/connect/set-up-sdk/javascript/pure-js.md +++ b/wallet/how-to/connect/set-up-sdk/javascript/pure-js.md @@ -5,10 +5,15 @@ sidebar_position: 2 # Use MetaMask SDK with pure JavaScript -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your pure JavaScript dapp to enable +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your pure JavaScript dapp to enable your users to easily connect to the MetaMask browser extension and MetaMask Mobile. The SDK for pure JavaScript has the [same prerequisites](index.md#prerequisites) as for standard JavaScript. +:::tip Example +See the [example pure JavaScript dapp](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples/pure-javascript) +in the JavaScript SDK GitHub repository for advanced use cases. +::: + To import, instantiate, and use the SDK, you can insert a script in the head section of your website: ```javascript @@ -19,11 +24,13 @@ To import, instantiate, and use the SDK, you can insert a script in the head sec @@ -36,3 +43,12 @@ You can configure the SDK using any [options](../../../../reference/sdk-js-optio Always call [`eth_requestAccounts`](../../../../reference/rpc-api.md#eth_requestaccounts) using [`ethereum.request(args)`](../../../../reference/provider-api.md#windowethereumrequestargs) first, since it prompts the installation or connection popup to appear. + +:::note Important SDK options +- Use [`dappMetadata`](../../../../reference/sdk-js-options.md#dappmetadata) to display information + about your dapp in the MetaMask connection modal. +- Use [`modals`](../../../../reference/sdk-js-options.md#modals) to [customize the logic and UI of + the displayed modals](../../../display/custom-modals.md). +- Use [`infuraAPIKey`](../../../../reference/sdk-js-options.md#infuraapikey) to + [make read-only RPC requests](../../../use-3rd-party-integrations/js-infura-api.md) from your dapp. +::: diff --git a/wallet/how-to/connect/set-up-sdk/javascript/react-native.md b/wallet/how-to/connect/set-up-sdk/javascript/react-native.md index b4edbbe0fcf..9c3c7015304 100644 --- a/wallet/how-to/connect/set-up-sdk/javascript/react-native.md +++ b/wallet/how-to/connect/set-up-sdk/javascript/react-native.md @@ -5,9 +5,14 @@ sidebar_position: 4 # Use MetaMask SDK with React Native -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your React Native dapp to enable your +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your React Native dapp to enable your users to easily connect to the MetaMask browser extension and MetaMask Mobile. +:::tip Example +See the [example React Native dapp](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples/reactNativeDemo) +in the JavaScript SDK GitHub repository for advanced use cases. +::: + ## Prerequisites - A [React Native](https://reactnative.dev/docs/0.71/getting-started) project set up with React Native version 0.71 or above @@ -15,9 +20,11 @@ users to easily connect to the MetaMask browser extension and MetaMask Mobile. - [Yarn](https://yarnpkg.com/getting-started/install) or [npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) -## Install the SDK +## Steps + +### 1. Install the SDK -:::tip Coming soon +:::info Coming soon A `metamask-react-native-sdk` package that simplifies the installation of the SDK for React Native dapps is coming soon. ::: @@ -88,7 +95,7 @@ Finally, install the necessary pods that come with the libraries: cd ios && pod install && cd .. ``` -## Use the SDK +### 2. Use the SDK Import, instantiate, and use the SDK by adding something similar to the following to your project script: @@ -119,6 +126,15 @@ Always call [`eth_requestAccounts`](../../../../reference/rpc-api.md#eth_request [`ethereum.request(args)`](../../../../reference/provider-api.md#windowethereumrequestargs) first, since it prompts the installation or connection popup to appear. +:::note Important SDK options +- Use [`dappMetadata`](../../../../reference/sdk-js-options.md#dappmetadata) to display information + about your dapp in the MetaMask connection modal. +- Use [`modals`](../../../../reference/sdk-js-options.md#modals) to [customize the logic and UI of + the displayed modals](../../../display/custom-modals.md). +- Use [`infuraAPIKey`](../../../../reference/sdk-js-options.md#infuraapikey) to + [make read-only RPC requests](../../../use-3rd-party-integrations/js-infura-api.md) from your dapp. +::: + You can use [EthersJS](https://docs.ethers.io/v5/getting-started/) with your React Native app: ```javascript diff --git a/wallet/how-to/connect/set-up-sdk/javascript/react.md b/wallet/how-to/connect/set-up-sdk/javascript/react.md deleted file mode 100644 index 23927ee0c6a..00000000000 --- a/wallet/how-to/connect/set-up-sdk/javascript/react.md +++ /dev/null @@ -1,55 +0,0 @@ ---- -sidebar_label: React -sidebar_position: 1 ---- - -# Use MetaMask SDK with React - -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your React dapp to enable your users to -easily connect to the MetaMask browser extension and MetaMask Mobile. -The SDK for React has the [same prerequisites](index.md#prerequisites) as for standard JavaScript. - -## Steps - -### 1. Install the SDK - -In your project directory, install the SDK using Yarn or npm: - -```bash -yarn add @metamask/sdk -``` - -or - -```bash -npm i @metamask/sdk -``` - -### 2. Import the SDK - -In your project script, add the following to import the SDK: - -```javascript -import { MetaMaskSDK } from '@metamask/sdk'; -``` - -### 3. Instantiate the SDK - -Instantiate the SDK using any [options](../../../../reference/sdk-js-options.md): - -```javascript -const MMSDK = new MetaMaskSDK(options); - -const ethereum = MMSDK.getProvider(); // You can also access via window.ethereum -``` - -### 4. Use the SDK - -Use the SDK by calling any [provider API methods](../../../../reference/provider-api.md). -Always call [`eth_requestAccounts`](../../../../reference/rpc-api.md#eth_requestaccounts) using -[`ethereum.request()`](../../../../reference/provider-api.md#ethereumrequestargs) first, since it -prompts the installation or connection popup to appear. - -```javascript -ethereum.request({ method: 'eth_requestAccounts', params: [] }); -``` diff --git a/wallet/how-to/connect/set-up-sdk/javascript/react/index.md b/wallet/how-to/connect/set-up-sdk/javascript/react/index.md new file mode 100644 index 00000000000..486574ed589 --- /dev/null +++ b/wallet/how-to/connect/set-up-sdk/javascript/react/index.md @@ -0,0 +1,158 @@ +--- +sidebar_label: React +sidebar_position: 1 +--- + +# Use MetaMask SDK with React + +Import [MetaMask SDK](../../../../../concepts/sdk/index.md) into your React dapp to enable your users to +easily connect to the MetaMask browser extension and MetaMask Mobile. +The SDK for React has the [same prerequisites](../index.md#prerequisites) as for standard JavaScript. + +:::info React UI +This page provides instructions for using the standard `@metamask/sdk-react` package. +Alternatively, you can use the [`@metamask/sdk-react-ui`](react-ui.md) package to easily use +[wagmi](https://wagmi.sh/) hooks and a pre-styled UI button component for connecting to MetaMask. +::: + +:::tip Examples +See the [example JavaScript dapps](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) +in the JavaScript SDK GitHub repository for advanced use cases. +::: + +## Steps + +### 1. Install the SDK + +In your project directory, install the SDK using Yarn or npm: + +```bash +yarn add @metamask/sdk-react +``` + +or + +```bash +npm i @metamask/sdk-react +``` + +### 2. Import the SDK + +In your project script, add the following to import the SDK: + +```javascript +import { MetaMaskProvider } from '@metamask/sdk-react'; +``` + +### 3. Wrap your project with MetaMaskProvider + +Wrap your root component in a `MetaMaskProvider`. +For example: + +```js +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import { MetaMaskProvider } from '@metamask/sdk-react'; + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement +); + +root.render( + + + + + +); +``` + +When initializing `MetaMaskProvider`, set `debug` to `true` to activate debug mode. +For the full list of options you can set for `sdkOptions`, see the +[JavaScript SDK options reference](../../../../../reference/sdk-js-options.md). + +:::note Important SDK options +- Use [`dappMetadata`](../../../../../reference/sdk-js-options.md#dappmetadata) to display information + about your dapp in the MetaMask connection modal. +- Use [`modals`](../../../../../reference/sdk-js-options.md#modals) to [customize the logic and UI of + the displayed modals](../../../../display/custom-modals.md). +- Use [`infuraAPIKey`](../../../../../reference/sdk-js-options.md#infuraapikey) to + [make read-only RPC requests](../../../../use-3rd-party-integrations/js-infura-api.md) from your dapp. +::: + +### 4. Use the SDK + +Use the SDK by using the `useSDK` hook in your React components. +For example: + +```js +import { useSDK } from '@metamask/sdk-react'; +import React, { useState } from 'react'; + +export const App = () => { + const [account, setAccount] = useState(); + const { sdk, connected, connecting, provider, chainId } = useSDK(); + + const connect = async () => { + try { + const accounts = await sdk?.connect(); + setAccount(accounts?.[0]); + } catch(err) { + console.warn(`failed to connect..`, err); + } + }; + + return ( +
+ + {connected && ( +
+ <> + {chainId && `Connected chain: ${chainId}`} +

+ {account && `Connected account: ${account}`} + +
+ )} +
+ ); +}; +``` + +
+useSDK return values +

+ +- `sdk`: Main SDK object that facilitates connection and actions related to MetaMask. +- `connected`: Boolean value indicating if the dapp is connected to MetaMask. +- `connecting`: Boolean value indicating if a connection is in process. +- `provider`: The provider object which can be used for lower-level interactions with the Ethereum blockchain. +- `chainId`: Currently connected blockchain's chain ID. + +

+
+ +The `sdk.connect()` method initiates a connection to MetaMask and returns an array of connected accounts: + +```javascript +const connect = async () => { + try { + const accounts = await sdk?.connect(); + setAccount(accounts?.[0]); + } catch(err) { + console.warn(`failed to connect..`, err); + } +}; +``` + +Refer to the [MetaMask JavaScript SDK examples](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) +for advanced use cases. diff --git a/wallet/how-to/connect/set-up-sdk/javascript/react/react-ui.md b/wallet/how-to/connect/set-up-sdk/javascript/react/react-ui.md new file mode 100644 index 00000000000..5cbffb69bc4 --- /dev/null +++ b/wallet/how-to/connect/set-up-sdk/javascript/react/react-ui.md @@ -0,0 +1,124 @@ +--- +sidebar_label: React UI +sidebar_position: 1 +--- + +# Use MetaMask SDK with React UI + +Import [MetaMask SDK](../../../../../concepts/sdk/index.md) into your React dapp to enable your +users to easily connect to the MetaMask browser extension and MetaMask Mobile. +The `@metamask/sdk-react-ui` package not only exports hooks from [`@metamask/sdk-react`](index.md), +but also provides wrappers around [wagmi](https://wagmi.sh/) hooks and a basic UI button component +for connecting to MetaMask. + +By combining the functions of `@metamask/sdk-react` and `@metamask/sdk-react-ui`, you can use both +the core functionality and the pre-styled UI components to streamline the integration of MetaMask +into your React dapp. + +The SDK for React has the [same prerequisites](../index.md#prerequisites) as for standard JavaScript. + +:::tip Examples +See the [example JavaScript dapps](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) +in the JavaScript SDK GitHub repository for advanced use cases. +::: + +## Steps + +### 1. Install the SDK + +In your project directory, install the SDK using Yarn or npm: + +```bash +yarn add @metamask/sdk-react-ui +``` + +or + +```bash +npm i @metamask/sdk-react-ui +``` + +### 2. Import the SDK + +In your project script, add the following to import the SDK: + +```javascript +import { MetaMaskUIProvider } from '@metamask/sdk-react-ui'; +``` + +### 3. Wrap your project with MetaMaskUIProvider + +Wrap your root component in a `MetaMaskUIProvider`. +For example: + +```js +import React from 'react'; +import ReactDOM from 'react-dom/client'; +import App from './App'; +import { MetaMaskUIProvider } from '@metamask/sdk-react-ui'; + +const root = ReactDOM.createRoot( + document.getElementById('root') as HTMLElement +); + +root.render( + + + + + +); +``` + +For the full list of options you can set for `sdkOptions`, see the +[JavaScript SDK options reference](../../../../../reference/sdk-js-options.md). + +:::note Important SDK options +- Use [`dappMetadata`](../../../../../reference/sdk-js-options.md#dappmetadata) to display information + about your dapp in the MetaMask connection modal. +- Use [`modals`](../../../../../reference/sdk-js-options.md#modals) to [customize the logic and UI of + the displayed modals](../../../../display/custom-modals.md). +- Use [`infuraAPIKey`](../../../../../reference/sdk-js-options.md#infuraapikey) to + [make read-only RPC requests](../../../../use-3rd-party-integrations/js-infura-api.md) from your dapp. +::: + +### 4. Use the SDK + +Use the SDK by using the `useSDK` hook in your React components. +See the [instructions for `@metamask/sdk-react`](index.md#4-use-the-sdk). + +### 5. Use the MetaMaskButton component + +The `@metamask/sdk-react-ui` package provides a pre-styled button, `MetaMaskButton`, to initiate a +connection to MetaMask. +You can use it as follows: + +```js +import { MetaMaskButton } from "@metamask/sdk-react-ui"; +import React, { useState } from "react"; + +export const App = () => { + return ( +
+ +
+ ); +}; +``` + +
+MetaMaskButton properties +

+ +- `theme`: Set to `light` or `dark` to adapt to your dapp's theme. +- `color`: The color of the button. Accepts any valid CSS color string. + +

+
+ +Refer to the [MetaMask JavaScript SDK examples](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples) +for advanced use cases. diff --git a/wallet/how-to/connect/set-up-sdk/mobile/android.md b/wallet/how-to/connect/set-up-sdk/mobile/android.md index be56b29823c..a550b6ec694 100644 --- a/wallet/how-to/connect/set-up-sdk/mobile/android.md +++ b/wallet/how-to/connect/set-up-sdk/mobile/android.md @@ -1,11 +1,310 @@ --- -sidebar_label: Native Android (coming soon) +sidebar_label: Android sidebar_position: 2 +toc_max_heading_level: 4 --- # Use MetaMask SDK with Android -[MetaMask SDK](../../../../concepts/sdk.md) support for native Android dapps is coming soon. -The SDK currently supports [React Native](../javascript/react-native.md) and [native iOS](ios.md) -mobile dapps, [JavaScript-based](../javascript/index.md) dapps, and [Unity](../gaming/unity.md) -gaming dapps. +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your native Android dapp to enable +your users to easily connect with their MetaMask Mobile wallet. + +:::tip Learn more +- See the [example Android dapp](https://github.com/MetaMask/metamask-android-sdk/tree/main/app) in + the Android SDK GitHub repository for advanced use cases. +- See more information about the [Android SDK architecture](../../../../concepts/sdk/android.md). +::: + +## Prerequisites + +- MetaMask Mobile version 7.6.0 or later installed on your target device (that is, a physical + device or emulator). + You can install MetaMask Mobile from [Google Play](https://play.google.com/store/apps/details?id=io.metamask), + or clone and compile MetaMask Mobile from [source](https://github.com/MetaMask/metamask-mobile) + and build to your target device. + +- Android SDK version 23 or later. + +## Steps + +### 1. Install the SDK + +To add the SDK from Maven Central as a dependency to your project, in your `app/build.gradle` file, +add the following entry to the `dependencies` block: + +```gradle title="build.gradle" +dependencies { + implementation 'io.metamask.androidsdk:metamask-android-sdk:0.2.1' +} +``` + +Then, sync your project with the Gradle settings. +Once the syncing completes, you can set up the rest of your project. + +### 2. Import the SDK + +Import the SDK by adding the following line to the top of your project file: + +```kotlin +import io.metamask.androidsdk.Ethereum +``` + +### 3. Connect your dapp + +You can connect your dapp to MetaMask in one of two ways: + +1. [Use the `ethereum` provider object directly](#31-use-the-provider-object-directly). + We recommend using this method in a pure model layer. +2. [Use a ViewModel](#32-use-a-viewmodel) that injects the `ethereum` provider object. + We recommend using this method at the app level, because it provides a single instance that + survives configuration changes and can be shared across all views. + +:::note Logging +By default, MetaMask logs three SDK events: `connection_request`, `connected`, and `disconnected`. +This allows MetaMask to monitor any SDK connection issues. +To disable this, set `ethereum.enableDebug = false`. +::: + +#### 3.1. Use the provider object directly + +Use the `ethereum` provider object directly to connect your dapp to MetaMask by adding the following +code to your project file: + +```kotlin +@AndroidEntryPoint +class SomeModel(private val repository: ApplicationRepository) { + val ethereum = Ethereum(context) + + val dapp = Dapp("Droid Dapp", "https://droiddapp.com") + + // This is the same as calling eth_requestAccounts + ethereum.connect(dapp) { result -> + if (result is RequestError) { + Log.e(TAG, "Ethereum connection error: ${result.message}") + } else { + Log.d(TAG, "Ethereum connection result: $result") + } + } +} +``` + +#### 3.2. Use a ViewModel + +To connect your dapp to MetaMask using a ViewModel, create a ViewModel that injects the +`ethereum` provider object, then add wrapper functions for each Ethereum method you wish to call. + +You can use a dependency manager such as [Hilt](https://developer.android.com/training/dependency-injection/hilt-android) +to initialize the ViewModel and maintain its state across configuration changes. +If you use Hilt, your setup might look like the following: + +```kotlin title="EthereumViewModel.kt" +@HiltViewModel +class EthereumViewModel @Inject constructor( + private val ethereum: Ethereum +): ViewModel() { + + val ethereumState = MediatorLiveData().apply { + addSource(ethereum.ethereumState) { newEthereumState -> + value = newEthereumState + } + } + + // Wrapper function to connect the dapp + fun connect(dapp: Dapp, callback: ((Any?) -> Unit)?) { + ethereum.connect(dapp, callback) + } + + // Wrapper function call all RPC methods + fun sendRequest(request: EthereumRequest, callback: ((Any?) -> Unit)?) { + ethereum.sendRequest(request, callback) + } +} +``` + +To use the ViewModel, add the following code to your project file: + +```kotlin +val ethereumViewModel: EthereumViewModel by viewModels() + +val dapp = Dapp("Droid Dapp", "https://droiddapp.com") + +// This is the same as calling eth_requestAccounts +ethereum.connect(dapp) { result -> + if (result is RequestError) { + Log.e(TAG, "Ethereum connection error: ${result.message}") + } else { + Log.d(TAG, "Ethereum connection result: $result") + } +} +``` + +See the example dapp's +[`EthereumViewModel.kt`](https://github.com/MetaMask/metamask-android-sdk/blob/main/app/src/main/java/com/metamask/dapp/EthereumViewModel.kt) +file for more information. + +### 4. Call methods + +You can now call any [JSON-RPC API method](/wallet/reference/eth_subscribe) using +`ethereum.sendRequest()`. + +#### Example: Get account balance + +The following example gets the user's account balance by calling +[`eth_getBalance`](/wallet/reference/eth_getBalance). + +```kotlin +var balance: String? = null + +// Create parameters +val params: List = listOf( + ethereum.selectedAddress, + "latest" // "latest", "earliest" or "pending" (optional) + ) + +// Create request +val getBalanceRequest = EthereumRequest( + method = EthereumMethod.ETHGETBALANCE.value, + params = params +) + +// Make request +ethereum.sendRequest(getBalanceRequest) { result -> + if (result is RequestError) { + // handle error + } else { + balance = result + } +} +``` + +#### Example: Sign message + +The following example requests the user sign a message by calling +[`eth_signTypedData_v4`](/wallet/reference/eth_signTypedData_v4). + +```kotlin +val message = "{\"domain\":{\"chainId\":\"${ethereum.chainId}\",\"name\":\"Ether Mail\",\"verifyingContract\":\"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC\",\"version\":\"1\"},\"message\":{\"contents\":\"Hello, Busa!\",\"from\":{\"name\":\"Kinno\",\"wallets\":[\"0xCD2a3d9F938E13CD947Ec05AbC7FE734Df8DD826\",\"0xDeaDbeefdEAdbeefdEadbEEFdeadbeEFdEaDbeeF\"]},\"to\":[{\"name\":\"Busa\",\"wallets\":[\"0xbBbBBBBbbBBBbbbBbbBbbbbBBbBbbbbBbBbbBBbB\",\"0xB0BdaBea57B0BDABeA57b0bdABEA57b0BDabEa57\",\"0xB0B0b0b0b0b0B000000000000000000000000000\"]}]},\"primaryType\":\"Mail\",\"types\":{\"EIP712Domain\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"version\",\"type\":\"string\"},{\"name\":\"chainId\",\"type\":\"uint256\"},{\"name\":\"verifyingContract\",\"type\":\"address\"}],\"Group\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"members\",\"type\":\"Person[]\"}],\"Mail\":[{\"name\":\"from\",\"type\":\"Person\"},{\"name\":\"to\",\"type\":\"Person[]\"},{\"name\":\"contents\",\"type\":\"string\"}],\"Person\":[{\"name\":\"name\",\"type\":\"string\"},{\"name\":\"wallets\",\"type\":\"address[]\"}]}}" + +val from = ethereum.selectedAddress +val params: List = listOf(from, message) + +val signRequest = EthereumRequest( + method = EthereumMethod.ETH_SIGN_TYPED_DATA_V4.value, + params = params +) + +ethereum.sendRequest(signRequest) { result -> + if (result is RequestError) { + Log.e(TAG, "Ethereum sign error: ${result.message}") + } else { + Log.d(TAG, "Ethereum sign result: $result") + } +} +``` + +#### Example: Send transaction + +The following example sends a transaction by calling +[`eth_sendTransaction`](/wallet/reference/eth_sendTransaction). + +```kotlin +// Create parameters +val from = ethereum.selectedAddress +val to = "0x0000000000000000000000000000000000000000" +val amount = "0x01" +val params: Map = mapOf( + "from" to from, + "to" to to, + "amount" to amount +) + +// Create request +val transactionRequest = EthereumRequest( + method = EthereumMethod.ETH_SEND_TRANSACTION.value, + params = listOf(params) +) + +// Make a transaction request +ethereum.sendRequest(transactionRequest) { result -> + if (result is RequestError) { + // handle error + } else { + Log.d(TAG, "Ethereum transaction result: $result") + } +} +``` + +#### Example: Switch chain + +The following example switches to a new Ethereum chain by calling +[`wallet_switchEthereumChain`](/wallet/reference/wallet_switchethereumchain) and +[`wallet_addEthereumChain`](/wallet/reference/wallet_addethereumchain). + +```kotlin +fun switchChain( + chainId: String, + onSuccess: (message: String) -> Unit, + onError: (message: String, action: (() -> Unit)?) -> Unit +) { + val switchChainParams: Map = mapOf("chainId" to chainId) + val switchChainRequest = EthereumRequest( + method = EthereumMethod.SWITCH_ETHEREUM_CHAIN.value, + params = listOf(switchChainParams) + ) + + ethereum.sendRequest(switchChainRequest) { result -> + if (result is RequestError) { + if (result.code == ErrorType.UNRECOGNIZED_CHAIN_ID.code || result.code == ErrorType.SERVER_ERROR.code) { + val message = "${Network.chainNameFor(chainId)} ($chainId) has not been added to your MetaMask wallet. Add chain?" + + val action: () -> Unit = { + addEthereumChain( + chainId, + onSuccess = { result -> + onSuccess(result) + }, + onError = { error -> + onError(error, null) + } + ) + } + onError(message, action) + } else { + onError("Switch chain error: ${result.message}", null) + } + } else { + onSuccess("Successfully switched to ${Network.chainNameFor(chainId)} ($chainId)") + } + } +} + +private fun addEthereumChain( + chainId: String, + onSuccess: (message: String) -> Unit, + onError: (message: String) -> Unit +) { + Logger.log("Adding chainId: $chainId") + + val addChainParams: Map = mapOf( + "chainId" to chainId, + "chainName" to Network.chainNameFor(chainId), + "rpcUrls" to Network.rpcUrls(Network.fromChainId(chainId)) + ) + val addChainRequest = EthereumRequest( + method = EthereumMethod.ADD_ETHEREUM_CHAIN.value, + params = listOf(addChainParams) + ) + + ethereum.sendRequest(addChainRequest) { result -> + if (result is RequestError) { + onError("Add chain error: ${result.message}") + } else { + if (chainId == ethereum.chainId) { + onSuccess("Successfully switched to ${Network.chainNameFor(chainId)} ($chainId)") + } else { + onSuccess("Successfully added ${Network.chainNameFor(chainId)} ($chainId)") + } + } + } +} +``` diff --git a/wallet/how-to/connect/set-up-sdk/mobile/index.md b/wallet/how-to/connect/set-up-sdk/mobile/index.md index d7f9d30c5f7..ab2b384cd3a 100644 --- a/wallet/how-to/connect/set-up-sdk/mobile/index.md +++ b/wallet/how-to/connect/set-up-sdk/mobile/index.md @@ -5,10 +5,10 @@ sidebar_position: 3 # Use MetaMask SDK with mobile dapps -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your mobile dapp to enable your users +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your mobile dapp to enable your users to easily connect with their MetaMask Mobile wallet. See the instructions for the following mobile platforms: - [React Native](../javascript/react-native.md) -- [Native iOS](ios.md) -- [Native Android](android.md) (coming soon) +- [iOS](ios.md) +- [Android](android.md) diff --git a/wallet/how-to/connect/set-up-sdk/mobile/ios.md b/wallet/how-to/connect/set-up-sdk/mobile/ios.md index 2b2b4d0238e..d7159476ea9 100644 --- a/wallet/how-to/connect/set-up-sdk/mobile/ios.md +++ b/wallet/how-to/connect/set-up-sdk/mobile/ios.md @@ -1,21 +1,51 @@ --- -sidebar_label: Native iOS +sidebar_label: iOS sidebar_position: 1 +toc_max_heading_level: 4 --- # Use MetaMask SDK with iOS -You can import [MetaMask SDK](../../../../concepts/sdk.md) into your native iOS dapp to enable your +Import [MetaMask SDK](../../../../concepts/sdk/index.md) into your native iOS dapp to enable your users to easily connect with their MetaMask Mobile wallet. +:::tip Example +See the [example iOS dapp](https://github.com/MetaMask/metamask-ios-sdk/tree/main/Example) in the +iOS SDK GitHub repository for advanced use cases. +::: + ## Prerequisites -An iOS project set up with iOS version 14+. +- MetaMask Mobile version 7.6.0 or later installed on your target device (that is, a physical device + or emulator). + You can install MetaMask Mobile from the [App Store](https://apps.apple.com/us/app/metamask-blockchain-wallet/id1438144202) + or clone and compile MetaMask Mobile from [source](https://github.com/MetaMask/metamask-mobile) + and build to your target device. + +- iOS version 14 or later. + The SDK supports `ios-arm64` (iOS devices) and `ios-arm64-simulator` (M1 chip simulators). + It currently doesn't support `ios-ax86_64-simulator` (Intel chip simulators). ## Steps ### 1. Install the SDK +#### CocoaPods + +To add the SDK as a CocoaPods dependency to your project, add the following entry to our Podfile: + +```text +pod 'metamask-ios-sdk' +``` + +Run the following command: + +```bash +pod install +``` + +#### Swift Package Manager + To add the SDK as a Swift Package Manager (SPM) package to your project, in Xcode, select **File > Swift Packages > Add Package Dependency**. Enter the URL of the MetaMask iOS SDK repository: `https://github.com/MetaMask/metamask-ios-sdk`. @@ -26,27 +56,22 @@ Alternatively, you can add the URL directly in your project's package file: dependencies: [ .package( url: "https://github.com/MetaMask/metamask-ios-sdk", - from: "0.1.0" + from: "0.2.2" ) ] ``` -:::note -The SDK supports `ios-arm64` (iOS devices) and `ios-arm64-simulator` (M1 chip simulators). -It currently doesn't support `ios-ax86_64-simulator` (Intel chip simulators). -::: - ### 2. Import the SDK Import the SDK by adding the following line to the top of your project file: -``` +```swift import metamask_ios_sdk ``` ### 3. Connect your dapp -Connect your dapp by adding the following code to your project file: +Connect your dapp to MetaMask by adding the following code to your project file: ```swift @ObservedObject var ethereum = MetaMaskSDK.shared.ethereum @@ -61,9 +86,9 @@ By default, MetaMask logs three SDK events: `connectionRequest`, `connected`, an This allows MetaMask to monitor any SDK connection issues. To disable this, set `MetaMaskSDK.shared.enableDebug = false` or `ethereum.enableDebug = false`. -### 4. Call provider methods +### 4. Call methods -You can now call any [provider API method](../../../../reference/provider-api.md). +You can now call any [JSON-RPC API method](/wallet/reference/eth_subscribe) using `ethereum.request()`. The SDK uses [Combine](https://developer.apple.com/documentation/combine) to publish Ethereum events, so you need to define an `AnyCancellable` storage by adding the following line to your @@ -73,10 +98,6 @@ project file: @State private var cancellables: Set = [] ``` -The following examples use the -[`window.ethereum.request(args)`](../../../../reference/provider-api.md#windowethereumrequestargs) -provider API method to call various [RPC API](../../../../reference/rpc-api.md) methods. - #### Example: Get chain ID The following example gets the user's chain ID by calling @@ -133,7 +154,7 @@ ethereum.request(getBalanceRequest)?.sink(receiveCompletion: { completion in #### Example: Send transaction -The following examples send a transaction by calling +The following example sends a transaction by calling [`eth_sendTransaction`](/wallet/reference/eth_sendTransaction). diff --git a/wallet/how-to/display/custom-modals.md b/wallet/how-to/display/custom-modals.md new file mode 100644 index 00000000000..a4e384fa2b6 --- /dev/null +++ b/wallet/how-to/display/custom-modals.md @@ -0,0 +1,107 @@ +--- +description: Display custom modals using the JavaScript SDK. +sidebar_position: 4 +--- + +# Display custom modals + +Use [MetaMask SDK](../../concepts/sdk/index.md) to display custom MetaMask modals in your JavaScript dapp. + +When integrating a web dapp with MetaMask, you can enhance the user experience by customizing the +logic and user interface of the displayed modals, which initiate user interactions such as prompting +the user to install MetaMask. +This page describes how to create a custom modal in React, but you can adapt the implementation to +other web frameworks such as Vue.js or pure HTML/JavaScript. + +## Prerequisites + +MetaMask SDK set up in your JavaScript dapp. +This example uses the [MetaMask React SDK](../connect/set-up-sdk/javascript/react/index.md). + +## Steps + +### 1. Create a custom modal component + +Create a custom modal component that aligns with your dapp's design and functionality requirements. + +```javascript +import React from 'react'; + +const CustomModal = ({ onClose }) => ( +
+ +
+); + +export default CustomModal; +``` + +### 2. Implement custom modal logic + +When initializing [`MetaMaskProvider`](../connect/set-up-sdk/javascript/react/index.md#3-wrap-your-project-with-metamaskprovider), +use the [`modals`](../../reference/sdk-js-options.md#modals) SDK option to set up custom behavior +for scenarios such as when MetaMask isn't installed. +For example: + +```javascript +import { MetaMaskProvider } from '@metamask/sdk-react'; +import CustomModal from './CustomModal'; +import ReactDOM from 'react-dom'; + +const App = () => ( + { + let modalContainer = null; + + return { + mount: () => { + modalContainer = document.createElement('div'); + document.body.appendChild(modalContainer); + + ReactDOM.render( + { + ReactDOM.unmountComponentAtNode(modalContainer); + modalContainer.remove(); + }} + />, + modalContainer, + ); + }, + unmount: () => { + if (modalContainer) { + ReactDOM.unmountComponentAtNode(modalContainer); + modalContainer.remove(); + } + }, + }; + }, + }, + }} + > + {/* Other components */} + +); + +export default App; +``` + +### 3. Test your custom modal + +Test your dapp to ensure the custom modal operates as intended, especially in scenarios such as when +MetaMask isn't installed. + +

+ +![Custom modal gif](../../assets/custom-modal.gif) + +

+ +## Example + +See the [example React dapp with a custom modal +implementation](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples/react-with-custom-modal). +This example can serve as a starting point for understanding the approach, which you can then adapt +to other web frameworks as needed. diff --git a/wallet/how-to/display/tokens.md b/wallet/how-to/display/tokens.md index 226d511d85e..b16e10f54ac 100644 --- a/wallet/how-to/display/tokens.md +++ b/wallet/how-to/display/tokens.md @@ -111,7 +111,7 @@ try { const wasAdded = await ethereum.request({ method: 'wallet_watchAsset', params: { - type: 'ERC721`, // or 'ERC1155' + type: 'ERC721', // or 'ERC1155' options: { address: '0x742d35Cc6634C0532925a3b844Bc454e4438f44e', // The address of the token. tokenId: '1', // ERC-721 or ERC-1155 token ID. diff --git a/wallet/how-to/get-started-building/run-devnet.md b/wallet/how-to/get-started-building/run-devnet.md index 10c1ac3931f..d75b086c19f 100644 --- a/wallet/how-to/get-started-building/run-devnet.md +++ b/wallet/how-to/get-started-building/run-devnet.md @@ -5,46 +5,88 @@ sidebar_position: 2 # Run a development network -You can run a personal Ethereum development network using [Ganache](https://www.trufflesuite.com/ganache), +You can run a personal Ethereum development network using [Hardhat](https://hardhat.org/hardhat-network/docs/overview#hardhat-network), which allows you to develop a dapp in a secure test environment. :::note -When using a local development blockchain such as Ganache or +When using a local development blockchain such as Hardhat Network or [anvil](https://book.getfoundry.sh/anvil/#overview-of-anvil), your node must calculate gas to make transactions on MetaMask. ::: -## Connect to Ganache - -Follow the [Ganache quickstart](https://trufflesuite.com/docs/ganache/quickstart/) to set -up a development network. - -When you create a Ganache workspace, enter your MetaMask seed phrase into -the **Account & Keys** setting. -Ganache automatically gives each of your first 10 accounts 100 test ether (you can configure -these numbers in **Accounts & Keys**), which makes it easy to start development. - -:::caution important -Your seed phrase controls all your accounts, so we recommend keeping at least one seed phrase for -development, separate from any used to store real value. -You can manage multiple seed phrases by using multiple browser profiles, each with its own -MetaMask installation. -::: - -In the **Server** setting of your workspace, find the hostname and port of your Ganache -network, which comprises the RPC URL of your network: - -```text -http://: -``` - -In the MetaMask extension, connect to your Ganache network: - -1. Select the network you're currently connected to. -1. Select **Add network**. -1. Select **Add a network manually**. -1. Enter the RPC URL of your network. -1. Enter MetaMask's default [chain ID](../connect/detect-network.md#chain-ids) for Ganache, `1337`. +## Connect to Hardhat Network + +Follow these steps to connect MetaMask to Hardhat Network. + +1. [Set up a Hardhat project.](https://hardhat.org/hardhat-runner/docs/guides/project-setup) + +2. Create a new + [MetaMask seed phrase](https://support.metamask.io/hc/en-us/articles/360060826432-What-is-a-Secret-Recovery-Phrase-and-how-to-keep-your-crypto-wallet-secure#:~:text=Your%20Secret%20Recovery%20Phrase%20(SRP,are%20connected%20to%20that%20phrase.)) + specifically for development. + + :::caution important + Your seed phrase controls all your accounts, so we recommend keeping at least one seed phrase for + development, separate from any used to store real value. + You can manage multiple seed phrases by using multiple browser profiles, each with its own + MetaMask installation. + ::: + +3. In your `hardhat.config.js` file, specify a + [`networks` configuration](https://hardhat.org/hardhat-runner/docs/config#networks-configuration) + with a `hardhat` network. + In this `networks.hardhat` configuration: + + - Specify your MetaMask seed phrase in the + [`accounts.mnemonic`](https://hardhat.org/hardhat-network/docs/reference#accounts) field. + + :::tip + Alternatively, to prevent committing your seed phrase, we recommend adding your seed phrase to a + [`.env` file](https://docs.infura.io/tutorials/developer-tools/javascript-dotenv) and using the + `process.env` global variable in `hardhat.config.js`. + ::: + + - Specify the [chain ID `1337`](https://hardhat.org/hardhat-network/docs/metamask-issue) in the + [`chainId`](https://hardhat.org/hardhat-network/docs/reference#chainid) field. + + For example: + + ```js title="hardhat.config.js" + module.exports = { + networks: { + hardhat: { + accounts: { + mnemonic: process.env.SEED_PHRASE, + }, + chainId: 1337 + }, + }, + }; + ``` + + Hardhat automatically gives each of your first 20 accounts 10000 test ether (you can modify + these numbers in the [`accounts`](https://hardhat.org/hardhat-network/docs/reference#accounts) + configuration), which makes it easy to start development. + +4. Run `npx hardhat node` to run Hardhat Network and expose a JSON-RPC interface. + +5. You can now connect MetaMask to your Hardhat Network RPC URL, `http://127.0.0.1:8545/`. + In the MetaMask extension: + + 1. In the upper left corner, select the network you're currently connected to. + + 2. Select **Add network**. + + 3. Select **Add a network manually**. + + 4. Enter your Hardhat Network RPC URL, `http://127.0.0.1:8545/` (or `http://localhost:8545`). + + 5. Enter your Hardhat Network chain ID, `1337` (or `0x539` in hexadecimal format). + + :::tip + Alternatively, you can add Hardhat Network to MetaMask using + [`wallet_addEthereumChain`](/wallet/reference/wallet_addethereumchain/?AddEthereumChainParameter[rpcUrls][0]=http://127.0.0.1:8545&AddEthereumChainParameter[chainId]=0x539&AddEthereumChainParameter[chainName]=Hardhat&AddEthereumChainParameter[nativeCurrency][name]=testEth&AddEthereumChainParameter[nativeCurrency][symbol]=testEth&AddEthereumChainParameter[nativeCurrency][decimals]=18) + in the interactive API playground. + ::: ## Reset your local nonce calculation @@ -58,8 +100,8 @@ and select **Reset account**. ## Next steps Once you have your development environment set up and development network running, you can -[connect to MetaMask](/wallet/how-to/connect) by setting up MetaMask SDK, detecting MetaMask, detecting a user's -network, and accessing a user's accounts. +[connect your dapp to MetaMask](/wallet/how-to/connect) by setting up MetaMask SDK, detecting +MetaMask, detecting a user's network, and accessing a user's accounts. For an end-to-end example, you can also follow the [Create a simple React dapp](../../tutorials/react-dapp-local-state.md) tutorial. diff --git a/wallet/how-to/integrate-with-mobile.md b/wallet/how-to/integrate-with-mobile.md deleted file mode 100644 index 32a7757bd1d..00000000000 --- a/wallet/how-to/integrate-with-mobile.md +++ /dev/null @@ -1,143 +0,0 @@ ---- -sidebar_label: Integrate with MetaMask Mobile -description: Integrate your dapp with MetaMask Mobile. -sidebar_position: 10 ---- - -# Integrate your dapp with MetaMask Mobile - -:::caution Use MetaMask SDK -We recommend [using MetaMask SDK](connect/set-up-sdk/index.md) to easily enable a reliable, secure, -and seamless connection from your dapp to both the MetaMask extension and MetaMask Mobile. -::: - -With MetaMask Mobile, you can onboard your users in seconds, whether they're new or existing -MetaMask users. -Your users can sign with their MetaMask wallet, whether they use your dapp on MetaMask browser, -other primary browsers, mobile, or desktop. - -To integrate your dapp with MetaMask Mobile: - -- Ensure your dapp is compatible with the [MetaMask Ethereum provider API](../reference/provider-api.md). -- Include MetaMask Mobile as a listed wallet in your dapp, and link to open the MetaMask Mobile app - (if installed) or to go to the app store (if not yet installed). - We recommend adding a **Connect with MetaMask** button and [using deeplinks](#use-deeplinks). -- Direct your users to either the relevant app store listing or to the - [MetaMask homepage](https://metamask.io/download.html) to download MetaMask Mobile. - -## Detect the provider - -The [provider API](../reference/provider-api.md) is the same for MetaMask Mobile and the desktop extension. -However, the providers become available (injected into the page) at different points in the page lifecycle. - -If you -[use the `@metamask/detect-provider` module](connect/detect-metamask.md#use-metamaskdetect-provider), -it reliably detects both the mobile and extension provider. -If you don't use `@metamask/detect-provider`, you must detect the mobile provider manually. -For example, you can manually detect the mobile and extension provider with the following code: - -```javascript -if (window.ethereum) { - handleEthereum(); -} else { - window.addEventListener('ethereum#initialized', handleEthereum, { - once: true, - }); - - // If the event is not dispatched by the end of the timeout, - // the user probably doesn't have MetaMask installed. - setTimeout(handleEthereum, 3000); // 3 seconds -} - -function handleEthereum() { - const { ethereum } = window; - if (ethereum && ethereum.isMetaMask) { - console.log('Ethereum successfully detected!'); - // Access the decentralized web! - } else { - console.log('Please install MetaMask!'); - } -} -``` - -The extension provider is always available when your code executes. -Because of platform limitations, the mobile provider may not be injected until later in the page -lifecycle, so the MetaMask provider dispatches the event `ethereum#initialized` on `window` when -it's fully initialized. - -## Use WalletConnect - -With WalletConnect, your users can use MetaMask Mobile as a signer while using other web, desktop, -or mobile apps. -Read the [WalletConnect mobile linking documentation](https://docs.walletconnect.org/mobile-linking) -for more information. - -## Use deeplinks - -Deeplinks enable instant invocation of the user's preferred wallet app with correctly parameterized -transactions. -Only the user can confirm the transaction, and the wallet can be a web, desktop, or mobile app. - -URLs embedded in QR codes, and hyperlinks in web pages, emails, or chat messages enable robust -signaling between otherwise loosely coupled apps. - -With deeplinks, you can enable your users to: - -- Open your dapp directly in MetaMask Mobile to interact with your dapp with their Ethereum account. -- Make payments to another account in one click (with pre-filled parameters such as recipient - address, amount, and network). -- Make gasless and instant transactions with Connext payment channel requests. - This requires that the user opt in for the InstaPay experimental feature. - -Use the [MetaMask deeplink generator](https://metamask.github.io/metamask-deeplinks/) to create deeplinks. - -## Test your dapp - -To test your dapp's integration with MetaMask Mobile: - -1. Configure your development server to run on your host machine's local IP address `192.168.x.x`, - or `0.0.0.0`. -1. Ensure your testing device uses the same WiFi connection as the machine hosting the server. -1. In the MetaMask Mobile web browser, navigate to your website at `http://YOUR_LOCAL_IP:PORT`. - -:::note -If you use an Android device, you must use `sslip` in your URL. -For example, `http://192.168.x.x.sslip.io:8000`. -::: - -## Debug your dapp - -:::caution -For security purposes, web browser debugging on both iOS and Android doesn't work if you downloaded -MetaMask Mobile through the Apple App Store or Google Play Store. -You must build MetaMask Mobile locally from the [GitHub repository](https://github.com/MetaMask/metamask-mobile) -and run it on a simulator or physical device. -::: - -### iOS - -To debug your dapp on iOS: - -1. Open **Safari Preferences > Advanced** and check **Show Develop menu in the menu bar**. -1. Open MetaMask Mobile in an iOS simulator or iOS device. -1. In the Safari menu bar, select **Develop > [device name] > [dapp name] > [url - title]**. - -:::note -When debugging on a physical device, you must enable Web Inspector in your device's settings by -selecting **Settings > Safari > Advanced > Web Inspector**. -::: - -### Android - -To debug your dapp on Android: - -1. Open MetaMask Mobile in an Android emulator or Android device. -1. Open Google Chrome's **DevTools > menu (`...`) > More tools > Remote devices**. - You can also navigate to `chrome://inspect` from Chrome to display the list of available devices - for debugging. -1. Select your device on the left and select **Inspect** on the browser contents you'd like to inspect. - -:::note -When debugging on a physical device you must enable USB debugging in your device's settings by -selecting **Settings > System > About Phone > Developer options > Enable USB debugging**. -::: diff --git a/wallet/how-to/interact-with-smart-contracts.md b/wallet/how-to/interact-with-smart-contracts/index.md similarity index 89% rename from wallet/how-to/interact-with-smart-contracts.md rename to wallet/how-to/interact-with-smart-contracts/index.md index 102f02d6126..e096ed54c0f 100644 --- a/wallet/how-to/interact-with-smart-contracts.md +++ b/wallet/how-to/interact-with-smart-contracts/index.md @@ -5,6 +5,10 @@ sidebar_position: 5 # Interact with smart contracts +This is a high-level overview of how to interact with smart contracts. +You can also see how to +[interact with smart contracts from your Unity game](unity/index.md). + To interact with a smart contract, your dapp needs the following information: - [Contract network](#contract-network) @@ -20,8 +24,8 @@ Many dapp developers deploy their contract to a testnet first, in order to avoid disastrous fees if something goes wrong during development and testing on Mainnet. Regardless of which network you deploy your final dapp on, your users must be able to access it. -Use the [`wallet_switchEthereumChain`](../reference/rpc-api.md#wallet_switchethereumchain) and -[`wallet_addEthereumChain`](../reference/rpc-api.md#wallet_addethereumchain) RPC methods to prompt +Use the [`wallet_switchEthereumChain`](/wallet/reference/wallet_switchethereumchain) and +[`wallet_addEthereumChain`](/wallet/reference/wallet_addethereumchain) RPC methods to prompt the user to add a chain that you suggest, and switch to it using a confirmation dialogue. ## Contract address diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-factory.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-factory.md new file mode 100644 index 00000000000..e95ad193596 --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-factory.md @@ -0,0 +1,91 @@ +--- +sidebar_position: 2 +--- + +# Contract factory + +When [interacting with smart contracts in Unity](index.md), the contract factory is responsible for +creating the [contract proxy class](contract-proxy-class.md) with the given +[contract interface](contract-interface.md) type `T`. + +## Contract factory types + +### Impromptu contract factory + +The impromptu contract factory uses the `Impromptu` library to return a new instance of `Contract` +that behaves likes the given interface type `T`. +Since the contract is a dynamic object, all method invocations to the returned object of type `T` +are automatically routed to the `Contract` class. + +:::note +The impromptu contract factory is only supported on Mono or in a runtime that has the CLR. +The IL2CPP runtime does not support this factory. +Use the backed type contract factory if you need a more concrete type. +::: + +### Backed type contract factory + +The backed type contract factory uses a concrete `class` type that inherits the `Contract` class and +the given interface type `T`. +To use this factory, the given interface must declare the class attribute `BackedType` +that specifies which concrete `class` type must be used when creating a new `Contract` instance. +The declared `class` must inherit from the given interface type `T`. + +```csharp +[BackedType(typeof(ERC20Backing))] +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); + + // TODO Define other interface methods +} +``` + +Inside the backed `class`, you must override all interface methods and either invoke custom logic or +use the `Contract` class to automatically perform the correct logic based on the method data. +You can use `var method = System.Reflection.MethodBase.GetCurrentMethod();` to get the current +method being invoked, and then you can use `base.InvokeMethod(MethodInfo method, object[] args)` to +invoke the correct logic for the given `method` and `args`. + +```csharp +public class ERC20Backing : Contract, ERC20 +{ + public string Address + { + get => base.Address; + } + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + public Task Decimals() + { + var method = System.Reflection.MethodBase.GetCurrentMethod(); + return (Task) InvokeMethod(method, new object[] { }); + } + + // TODO Define other interface methods +} +``` + +The [contract code generator](index.md#generate-contract-code) automatically generates a backing +`class` for each contract interface generated. + +This contract factory is useful for when you need more concrete definitions of the contract +interface type `T`. +This can be useful in runtimes where `dynamic` or `DynamicObject` are not available (IL2CPP). + +## Set the contract factory + +To set the current contract factory, you can use `Contract.ContractFactory`: + +```csharp +Contract.ContractFactory = new BackedTypeContractFactory(); +``` + +You don't need to do this, unless you create a custom contract factory. +We recommend just using the default contract factories for each runtime: + +- Mono runtime - [Impromptu contract factory](#impromptu-contract-factory) +- IL2CPP runtime - [Backed typed contract factory](#backed-type-contract-factory) diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md new file mode 100644 index 00000000000..1938dee56bc --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-interface.md @@ -0,0 +1,150 @@ +--- +sidebar_position: 1 +--- + +# Contract interface + +When [interacting with smart contracts in Unity](index.md), the `IContract` interface defines an +interface of a given contract. +This interface includes all the functions of the contract, and an optional constructor function and +`Bytecode` field. + +You can use the [contract code generator](index.md#generate-contract-code) to generate a contract +interface given a contract ABI or Hardhat artifact JSON file. + +To manually create a new contract interface, define a new interface that inherits from `IContract`. +Optionally, declare the [`BackedType` attribute](contract-factory.md#backed-type-contract-factory). + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + // TODO Declare functions +} +``` + +## Declare contract functions + +To declare a `view` or `pure` function of the contract, first set the return type, the function name +(may differ from the actual name), and all parameters the function takes in a Task: + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + Task BalanceOf(EvmAddress account); +} +``` + +Once you have the function written, simply add the `EvmMethodInfo` at the top of the function to +declare the metadata about the contract function. +This includes the `Name` and whether it's a `View` function: + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); +} +``` + +To define the EVM type for a parameter, you can use the `EvmParameterInfo` attribute. +However, this usually isn't needed, because the `Contract` class automatically infers most common +types, such as `EvmAddress` to be `address` and `string` to be `string`. + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf([EvmParameterInfo(Type = "address")] string account); +} +``` + +To define the EVM return type for the function, you can use `EvmParamterInfo` on the return type: + +```csharp +#if UNITY_EDITOR || !ENABLE_MONO +[BackedType(typeof(ERC20Backing))] +#endif +public interface ERC20 : IContract +{ + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); +} +``` + +### Use the Task return type + +We recommend always using `Task` as the return type when declaring contract functions, even if +the given [provider](contract-provider.md) does not use `Task`. +When you don't use `Task`, the `Contract` class is blocked until a response from the given +`Provider` is received. +This means if the `Provider` returns a Task of the request, the `Contract` class is blocked until +that Task completes, which may lead to a deadlock. + +### Define a contract constructor + +To define a constructor function, use the `EvmConstructorMethod` attribute at the top of the +function declaring the constructor. +The return type of the function must be the type of the interface, since a new instance of the +interface is returned by the `Contract` class. + +Also, do one of the following: + +- Declare a `static readonly string Bytecode` in the interface that has the bytecode. + + ```csharp + #if UNITY_EDITOR || !ENABLE_MONO + [BackedType(typeof(ERC20Backing))] + #endif + public interface ERC20 : IContract + { + public static readonly string Bytecode = "0x6080604052348015620000115760008...."; + + [EvmConstructorMethod] + Task DeployNew(String name_, String symbol_); + + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); + } + ``` + +- Set the `Bytecode` field in the `EvmConstructorMethod` attribute. + + ```csharp + #if UNITY_EDITOR || !ENABLE_MONO + [BackedType(typeof(ERC20Backing))] + #endif + public interface ERC20 : IContract + { + [EvmConstructorMethod(Bytecode = "0x608060405238....")] + Task DeployNew(String name_, String symbol_); + + [EvmMethodInfo(Name = "balanceOf", View = true)] + Task BalanceOf(EvmAddress account); + + [EvmMethodInfo(Name = "decimals", View = true)] + [return: EvmParameterInfo(Type = "uint8")] + Task Decimals(); + } + ``` + +By default, the [contract code generator](index.md#generate-contract-code) uses the second option. diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-provider.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-provider.md new file mode 100644 index 00000000000..8e162c08f3e --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-provider.md @@ -0,0 +1,78 @@ +--- +sidebar_position: 4 +--- + +# Contract provider + +When [interacting with smart contracts in Unity](index.md), the provider is similar to a JavaScript +provider. +The provider is responsible for sending the request formed inside the +[contract proxy class](contract-proxy-class.md) to the blockchain RPC node and optionally decoding +the response. +If the provider doesn't decode the response, then it's considered an [`ILegacyProvider`](#ilegacyprovider). + +## IProvider + +The `IProvider` interface defines the following function: + +```csharp +Task Request(string method, object[] parameters = null); +``` + +This function must send a JSON-RPC request with the given method and parameters. +It must decode the JSON-RPC result response into the type `TR`. + +The `IProvider` must also define two additional properties: + +```csharp +long ChainId { get; } // The current chain ID the provider is connected to + +string ConnectedAddress { get; } // The current address connected to the provider +``` + +For backwards compatibility, the `ILegacyProvider` function is also defined: + +```csharp +object Request(string method, object[] parameters = null); +``` + +To easily support this function, use `Request`: + +```csharp +public object Request(string method, object[] parameters = null) +{ + return this.Request(method, parameters); +} +``` + +## ILegacyProvider + +The `ILegacyProvider` is an interface that declares an interface that does not support response decoding. +The `ILegacyProvider` interface defines the following function: + +```csharp +object Request(string method, object[] parameters = null); +``` + +This function must send a JSON-RPC request with the given method and parameters. +It should decode the response, but it's not required. +It may return any of the following: + +- The response as a JSON string +- The response as a JSON string, wrapped in a Task +- The response decoded into some object +- The response decoded into some object, wrapped in a Task + +If the function returns a JSON string, then the `Contract` class attempts to deserialize the JSON +string into the desired type. +If it returns any other object type, the `Contract` class attempts to convert to the desired type by +first serializing the object into JSON, then deserializing the JSON back into the desired type. +The desired type is defined in the [contract interface](contract-interface.md) used. + +The `ILegacyProvider` must also define two additional properties: + +```csharp +long ChainId { get; } // The current chain ID the provider is connected to + +string ConnectedAddress { get; } // The current address connected to the provider +``` diff --git a/wallet/how-to/interact-with-smart-contracts/unity/contract-proxy-class.md b/wallet/how-to/interact-with-smart-contracts/unity/contract-proxy-class.md new file mode 100644 index 00000000000..7f9a52e1b15 --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/contract-proxy-class.md @@ -0,0 +1,30 @@ +--- +sidebar_position: 3 +--- + +# Contract proxy class + +When [interacting with smart contracts in Unity](index.md), the contract proxy class is responsible +for performing: + +- Transaction serialization +- Transaction execution +- Transaction result deserialization + +The contract proxy class is also responsible for invoking the [provider](contract-provider.md) and attempts +to support both asynchronous and synchronous provider objects. + +Since the proxy class is responsible for a lot, some parts of the class may be decoupled into their +own components. +For example, transaction serialization and deserialization is not very customizable and will likely +be moved into its own component to allow more extendability. + +:::caution important +The contract proxy class should be considered an internal and unstable API. +You should never need to inherit the `Contract` class, unless you're using the +[backed type contract factory](contract-factory.md#backed-type-contract-factory). +However, the [contract code generator](index.md#generate-contract-code) already generates these +classes for you. + +You only need to use `Contract.Attach(string address, IProvider provider)`. +::: diff --git a/wallet/how-to/interact-with-smart-contracts/unity/index.md b/wallet/how-to/interact-with-smart-contracts/unity/index.md new file mode 100644 index 00000000000..0ffee7bd81c --- /dev/null +++ b/wallet/how-to/interact-with-smart-contracts/unity/index.md @@ -0,0 +1,126 @@ +--- +sidebar_position: 1 +--- + +# Interact with smart contracts in Unity + +You can interact with smart contracts from your Unity game with MetaMask SDK installed. + +## Prerequisites + +- [MetaMask SDK set up](../../connect/set-up-sdk/gaming/unity.md) in your Unity game +- A [contract ABI](../index.md#contract-abi) JSON file or + [Hardhat artifact](https://hardhat.org/hardhat-runner/docs/advanced/artifacts#compilation-artifacts) + JSON file + +## Generate contract code + +You can use the MetaMask Unity contract code generator to generate +[contract interface](contract-interface.md) files. +The code generator automatically generates backed types for all contract interfaces to be used by +the [contract factory](contract-factory.md#backed-type-contract-factory). + +In your Unity editor, go to **Tools > MetaMask > Contract ABI Converter**. +A new dialog box opens: + +

+ +![dialog](../../../assets/contract-abi-converter-dialog.png) + +

+ +Paste your contract ABI JSON file or Hardhat artifact JSON file. +If you plan to deploy your contract, you must provide a Hardhat artifact, since this +has the required [contract bytecode](../index.md#contract-bytecode) needed for deployment. + +You can also specify the `Root Namespace` for the generated contract code. +The default value is `Contracts`, so make sure to add `using Contracts;` at the top of your scripts +before using the generated code. + +Select **Convert**, which opens a save dialog box. +Select a folder to save the generated code files to, somewhere inside the `Assets` folder. + +## Use the contract + +After generating the contract code, you can use the contract using the +`Contract.Attach(...)` function. + +This function takes a type `T` which must be the interface type of the contract to use. +This function returns that type `T`. + +You must provide the `address` string the contract should be loaded from, and the +[provider](contract-provider.md) to use to interact with the contract. +Usually, the provider is `MetaMaskUnity.Instance.Wallet`. + +The following is an example of using a contract: + +```csharp +public async void Start() +{ + var metaMask = MetaMaskUnity.Instance.Wallet; + var address = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"; + + ERC20 usdc = Contract.Attach(address, metaMask); +} +``` + +Once you have an instance of your contract interface of type `T` (in this example, `ERC20`), you may +invoke any function inside the interface type. +For example: + +```csharp +public async void Start() +{ + // ... setup ... + + var balance = await usdc.BalanceOf(metaMask.SelectedAddress); + Debug.Log(balance); +} +``` + +### Use contract templates + +The MetaMask Unity SDK offers several contract templates that you can create and manage inside the +Unity editor. +These templates are scriptable objects, so you can configure them once inside the editor and use +them throughout your scripts. +These templates automatically perform the `Contract.Attach` function for you and automatically +switch contract addresses when the network changes. + +You can create a new template by going to **Assets > Create > MetaMask > Contract Templates** and +selecting one of the following: + +- **ERC20** +- **ERC721** +- **ERC1155** + +Before using the contract template, configure the contract address to use for each chain: + +

+ +![empty template](../../../assets/unity-empty-template.png) + +

+ +Select **+** to add a new address/chain pair. +When adding a new address, if you don't see your desired blockchain listed, you can modify the +`ScriptableContract.ChainId` enum to include your chain and chain ID. + +

+ +![full template](../../../assets/unity-example-template.png) + +

+ +Once configured, you can use this scriptable object as a variable inside your scripts. +The contract template has the same interface and usage as if you used `Contract.Attach`, but the +setup and network switching is done for you. + +## Advanced topics + +To learn more about and customize your contract interactions using the Unity SDK, see the following topics: + +- [Contract interface](contract-interface.md) +- [Contract factory](contract-factory.md) +- [Contract proxy class](contract-proxy-class.md) +- [Contract provider](contract-provider.md) diff --git a/wallet/how-to/migrate-api.md b/wallet/how-to/migrate-api.md deleted file mode 100644 index 48f959b040b..00000000000 --- a/wallet/how-to/migrate-api.md +++ /dev/null @@ -1,258 +0,0 @@ ---- -title: Migrate the provider API -description: Migrate to the current provider API. -sidebar_position: 12 ---- - -# Migrate to the current provider API - -In January 2021, MetaMask made a number of breaking changes to the -[provider API](../reference/provider-api.md), and removed the injected `window.web3`. -These changes are live on all platforms as of version: - -- `9.0.2` of the MetaMask browser extension. -- `1.0.9` of MetaMask Mobile. - -This guide describes how to migrate to the new provider API, and how to replace `window.web3`. -To understand why MetaMask made these changes, please see -[this blog post](https://medium.com/metamask/breaking-changes-to-the-metamask-provider-are-here-7b11c9388be9). - -:::note -If you're a MetaMask user attempting to use a legacy Ethereum website that hasn't migrated to the -new API, please see the [MetaMask legacy Web3 extension](#use-the-metamask-legacy-web3-extension). - -Except for such legacy websites, no action is required for MetaMask users. -::: - -## Summary of breaking changes - -### window.web3 removal - -As part of the breaking changes, MetaMask stopped injecting `web3.js` version `0.20.7` as `window.web3` -into web pages. -MetaMask still injects a dummy object at `window.web3`, in order to issue warnings when websites -attempt to access `window.web3`. - -### window.ethereum API changes - -MetaMask made the following breaking changes to the `window.ethereum` API: - -- Ensure that chain IDs returned by `eth_chainId` are **not** 0-padded. - - For example, instead of `0x01`, we always return `0x1`, wherever the chain ID is returned or accessible. -- Stop emitting `chainIdChanged`, and instead emit `chainChanged`. -- Remove the following experimental methods: - - `ethereum._metamask.isEnabled` - - `ethereum._metamask.isApproved` -- Remove the `ethereum.publicConfigStore` object. - - This object was, despite its name, never intended for public consumption. - Its removal _may_ affect those who do not use it directly, for example, if another library you - use relies on the object. -- Remove the `ethereum.autoRefreshOnNetworkChange` property. - - Consumers can still set this property on the provider, it just won't do anything. -- Deprecate the `web3.currentProvider` method. - - Use [@metamask/detect-provider](https://github.com/MetaMask/detect-provider) to detect the - current provider. - -## Replace window.web3 - -:::caution Pages no longer reload on chain changes -Since we removed `window.web3`, MetaMask no longer automatically reloads the page on chain/network changes. - -Please see [Handling the removal of `ethereum.autoRefreshOnNetworkChange`](#handle-the-removal-of-ethereumautorefreshonnetworkchange) -for details. -::: - -For historical reasons, MetaMask injected [`web3@0.20.7`](https://github.com/ethereum/web3.js/tree/0.20.7) into all web pages. -That version of `web3` is deprecated, [has known security issues](https://github.com/ethereum/web3.js/issues/3065), and is no longer maintained by the [web3.js](https://github.com/ethereum/web3.js/) team. -Therefore, we decided to remove this library. - -If your website relied on our `window.web3` object, you have to migrate. -Please continue reading to understand your options. -Some are as simple as a one-line change. - -:::tip -Regardless of how you choose to migrate, you may want to read the `web3@0.20.7` documentation, which -you can find [here](https://github.com/ethereum/web3.js/blob/0.20.7/DOCUMENTATION.md). -::: - -### Use window.ethereum directly - -For many web3 sites, the API provided by `window.ethereum` is sufficient. -Much of the `web3` API simply maps to RPC methods, all of which can be requested using -[`ethereum.request()`](../reference/provider-api.md#windowethereumrequestargs). -For example, here are a couple of actions performed using first `window.web3`, and then their -equivalents using `window.ethereum`. - -```javascript -/** - * Getting Accounts - */ - -// window.web3 -const accounts = web3.eth.accounts; - -// window.ethereum -const accounts = await ethereum.request({ method: 'eth_accounts' }); - -/** - * Sending a Transaction - */ - -// window.web3 -web3.eth.sendTransaction( - { - to: '0x...', - 'from': '0x...', - value: '0x...', - // And so on... - }, - (error, result) => { - if (error) { - return console.error(error); - } - // Handle the result - console.log(result); - } -); - -// window.ethereum -try { - const transactionHash = await ethereum.request({ - method: 'eth_sendTransaction', - params: [ - { - to: '0x...', - 'from': '0x...', - value: '0x...', - // And so on... - }, - ], - }); - // Handle the result - console.log(transactionHash); -} catch (error) { - console.error(error); -} -``` - -### Use an updated convenience library - -If you decide that you need a convenience library, you have to convert your usage of `window.web3` -to an updated convenience library. -We recommend [`ethers`](https://npmjs.com/package/ethers) ([documentation](https://docs.ethers.io/)). - -### Use @metamask/legacy-web3 - -:::caution -We strongly recommend that you consider one of the other two migration paths before resorting to this one. -It is not future-proof, and we will not add new features to it. -::: - -Finally, if you just want your web3 site to continue to work, we created -[`@metamask/legacy-web3`](https://npmjs.com/package/@metamask/legacy-web3). -This package is a drop-in replacement for our `window.web3` that you can add to your website even -before remove `window.web3` on all platforms. - -`@metamask/legacy-web3` should work exactly like our injected `window.web3`, including by refreshing -the page on chain/network changes, but _we cannot guarantee that it works perfectly_. -We will not fix any future incompatibilities between `web3@0.20.7` and MetaMask itself, nor will we -fix any bugs in `web3@0.20.7` itself. - -For installation and usage instructions, please see the -[npm listing](https://npmjs.com/package/@metamask/legacy-web3). - -### Use the MetaMask legacy Web3 extension - -We created the [**MetaMask Legacy Web3 Extension**](https://github.com/MetaMask/legacy-web3-extension) -for any users of websites that still expect `window.web3` to be injected. -If you install this extension alongside the regular MetaMask wallet extension, websites that rely on -our old window.web3 API should start working again. - -As with the regular extension, it’s critical that you only install from the official browser -extension stores. -Please follow the relevant link below to install the Legacy Web3 extension in your browser: - -- [Edge](https://microsoftedge.microsoft.com/addons/detail/metamask-legacy-web3/obkfjbjkiofoponpkmphnpaaadebfloh?hl=en-US) -- [Firefox](https://addons.mozilla.org/en-US/firefox/addon/metamask-legacy-web3/) - -## Migrate to the new provider API - -### Handle eth_chainId return values - -The `eth_chainId` RPC method now returns correctly formatted values, e.g. `0x1` and `0x2`, instead -of _incorrectly_ formatted values, e.g. `0x01` and `0x02`. -MetaMask's implementation of `eth_chainId` used to return 0-padded values for the -[default Ethereum chains](connect/detect-network.md#chain-ids) _except_ Kovan. -If you expect 0-padded chain ID values from `eth_chainId`, make sure to update your code to expect -the correct format instead. - -For more details on chain IDs and how to handle them, see the -[`chainChanged` event](../reference/provider-api.md#chainchanged). - -### Handle the removal of chainIdChanged - -`chainIdChanged` is a typo of `chainChanged`. -To migrate, simply listen for `chainChanged` instead: - -```javascript -// Instead of this: -ethereum.on('chainIdChanged', (chainId) => { - /* handle the chainId */ -}); - -// Do this: -ethereum.on('chainChanged', (chainId) => { - /* handle the chainId */ -}); -``` - -### Handle the removal of isEnabled() and isApproved() - -Before the new provider API shipped, we added the `_metamask.isEnabled` and `_metamask.isApproved` -methods to enable web3 sites to check if they have -[access to the user's accounts](../reference/rpc-api.md#eth_requestaccounts). -`isEnabled` and `isApproved` functioned identically, except that `isApproved` was `async`. -These methods were arguably never that useful, and they became completely redundant with the -introduction of MetaMask's [permission system](../reference/rpc-api.md#restricted-methods). - -We recommend that you check for account access in the following ways: - -1. You can call the [`wallet_getPermissions`](../reference/rpc-api.md#wallet_getpermissions) RPC method - and check for the `eth_accounts` permission. -1. You can call the `eth_accounts` RPC method and the - [`ethereum._metamask.isUnlocked()`](../reference/provider-api.md#windowethereum_metamaskisunlocked) method. - - MetaMask has to be unlocked before you can access the user's accounts. - If the array returned by `eth_accounts` is empty, check if MetaMask is locked using `isUnlocked()`. - - If MetaMask is unlocked and you still aren't receiving any accounts, it's time to request - accounts using the [`eth_requestAccounts` RPC method](../reference/rpc-api.md#eth_requestaccounts). - -### Handle the removal of ethereum.publicConfigStore - -How to handle this change depends on if and how you relied on the `publicConfigStore`. -We have seen examples of listening for provider state changes the `publicConfigStore` `data` event, -and accessing the `publicConfigStore` internal state directly. - -We recommend that you search your code and its dependencies for references to `publicConfigStore`. -If you find any references, you should understand what it's being used for, and migrate to -[one of the recommended provider APIs](../reference/provider-api.md) instead. -If you don't find any references, you should not be affected by this change. - -Although it is possible that your dependencies use the `publicConfigStore`, we have confirmed that -the latest versions (as of January 2021) of the following common libraries were not affected by this -change: - -- `ethers` -- `web3` (web3.js) - -### Handle the removal of ethereum.autoRefreshOnNetworkChange - -The `ethereum.autoRefreshOnNetworkChange` was a mutable boolean property used to control whether -MetaMask reloaded the page on chain/network changes. -However, it only caused the page to be reloaded if the script access a property on `window.web3`. -Therefore, this property was removed along with `window.web3`. - -Despite this, we still recommend reloading the page on chain changes. -Some convenience libraries, such as [ethers](https://www.npmjs.com/package/ethers), will continue to -reload the page by default. -If you don't use such a convenience library, you'll have to reload the page manually. -Please see the [`chainChanged` event](../reference/provider-api.md#chainchanged) for details. diff --git a/wallet/how-to/onboard-users.md b/wallet/how-to/onboard-users.md index 8183e987bb2..7795b660ed0 100644 --- a/wallet/how-to/onboard-users.md +++ b/wallet/how-to/onboard-users.md @@ -1,7 +1,7 @@ --- sidebar_label: Onboard users description: Simplify the MetaMask onboarding experience for your users. -sidebar_position: 11 +sidebar_position: 12 --- # Use the MetaMask onboarding library diff --git a/wallet/how-to/request-permissions.md b/wallet/how-to/request-permissions.md new file mode 100644 index 00000000000..ae2002034cb --- /dev/null +++ b/wallet/how-to/request-permissions.md @@ -0,0 +1,58 @@ +--- +description: Request permissions to call restricted methods. +sidebar_position: 7 +--- + +# Request permissions + +To call a restricted RPC method, your dapp must request permission from the user to call it using +the [`wallet_requestPermissions`](/wallet/reference/wallet_requestPermissions) RPC method. +This method is specified by [EIP-2255](https://eips.ethereum.org/EIPS/eip-2255). + +`wallet_requestPermissions` creates a confirmation asking the user to connect to an account and +allow the dapp to call the requested method. +The confirmation screen describes the functions and data the requested method can access. +For example, something like the following confirmation displays when you request permission to call +the [`eth_accounts`](/wallet/reference/eth_accounts) restricted method: + +
+
+ Request permissions confirmation 1 +
+
+ Request permissions confirmation 2 +
+
+ +## Example + +The following is an example of using `wallet_requestPermissions` to request permission from the user +to call `eth_accounts`. + +```javascript +document.getElementById('requestPermissionsButton', requestPermissions); + +function requestPermissions() { + ethereum + .request({ + method: 'wallet_requestPermissions', + params: [{ eth_accounts: {} }], + }) + .then((permissions) => { + const accountsPermission = permissions.find( + (permission) => permission.parentCapability === 'eth_accounts' + ); + if (accountsPermission) { + console.log('eth_accounts permission successfully requested!'); + } + }) + .catch((error) => { + if (error.code === 4001) { + // EIP-1193 userRejectedRequest error + console.log('Permissions needed to continue.'); + } else { + console.error(error); + } + }); +} +``` \ No newline at end of file diff --git a/wallet/how-to/use-3rd-party-integrations/_category_.json b/wallet/how-to/use-3rd-party-integrations/_category_.json new file mode 100644 index 00000000000..f8212ba301a --- /dev/null +++ b/wallet/how-to/use-3rd-party-integrations/_category_.json @@ -0,0 +1,9 @@ +{ + "label": "Use third party integrations", + "position": 10, + "link": { + "type": "generated-index", + "slug": "how-to/use-3rd-party-integrations", + "description": "You can use the following third party integrations with MetaMask SDK." + } +} diff --git a/wallet/how-to/use-3rd-party-integrations/js-infura-api.md b/wallet/how-to/use-3rd-party-integrations/js-infura-api.md new file mode 100644 index 00000000000..16c5acda8e6 --- /dev/null +++ b/wallet/how-to/use-3rd-party-integrations/js-infura-api.md @@ -0,0 +1,111 @@ +--- +sidebar_position: 2 +description: Use Infura and custom nodes to make direct, read-only requests. +--- + +# Make read-only requests in JavaScript + +You can use the [Infura API](https://docs.infura.io/) from your JavaScript dapp with +[MetaMask SDK](../connect/set-up-sdk/javascript/index.md) installed to make direct, read-only +JSON-RPC requests. + +Direct, read-only JSON-RPC requests are blockchain requests that do not require user wallet interaction. +Your dapp can directly call most [JSON-RPC API methods](/wallet/reference/eth_subscribe), bypassing +user wallet authentication for read-only operations. + +:::note +Your dapp CANNOT directly call the following RPC methods, which require user wallet interaction: + +- `eth_requestAccounts` +- `eth_sendTransaction` +- `eth_signTransaction` +- `eth_sign` +- `eth_accounts` +- `personal_sign` +- `eth_signTypedData_v4` +- `wallet_watchAsset` +- `wallet_addEthereumChain` +- `wallet_switchEthereumChain` +::: + +Configure your dapp to make read-only requests using the [Infura API](#use-the-infura-api), +[custom nodes](#use-custom-nodes), or [both](#use-the-infura-api-and-custom-nodes). + +## Prerequisites + +- An Infura API key. + Create one by following the first two steps in the + [Infura getting started guide](https://docs.infura.io/getting-started). +- [MetaMask SDK set up](../connect/set-up-sdk/javascript/index.md) in your JavaScript dapp. + +## Use the Infura API + +To use the Infura API to make read-only requests, specify your Infura API key using the +[`infuraAPIKey`](../../reference/sdk-js-options.md#infuraapikey) option when instantiating the SDK +in your dapp. + +```javascript +infuraAPIKey: 'YOUR-API-KEY' +``` + +## Use custom nodes + +To use your own node (for example, with [Hardhat](https://hardhat.org/)) to make read-only requests, +specify your node's chain ID and RPC URL using the +[`readonlyRPCMap`](../../reference/sdk-js-options.md#readonlyrpcmap) option when instantiating the +SDK in your dapp. + +```javascript +readonlyRPCMap: { + '0x539': 'http://localhost:8545', +} +``` + +In this example, chain ID `0x539` maps to the custom node's RPC URL. + +## Use the Infura API and custom nodes + +You can use both the Infura API and custom nodes to make read-only requests by specifying both the +[`infuraAPIKey`](../../reference/sdk-js-options.md#infuraapikey) and +[`readonlyRPCMap`](../../reference/sdk-js-options.md#readonlyrpcmap) options when instantiating the +SDK in your dapp. + +```javascript +sdkOptions={{ + infuraAPIKey: 'YOUR-API-KEY', + readonlyRPCMap: { + '0x539': 'http://localhost:8545', + }, + // Other options +} +``` + +`infuraAPIKey` provides access to various networks supported by Infura, and `readonlyRPCMap` +provides access to custom nodes. +The `readonlyRPCMap` values override Infura networks in case of a conflict. + +Refer to the SDK's +[default RPC URLs map](https://github.com/MetaMask/metamask-sdk/blob/dd9a3aaa1b5afa208cdb0d0768916d15b8638b25/packages/sdk/src/services/MetaMaskSDK/InitializerManager/setupInfuraProvider.ts#L12) +to see how Infura networks are configured by default. +By defining your own `readonlyRPCMap`, you can override these defaults or add support for other networks. + +## Example + +The following is an example of using both the Infura API and custom nodes with the SDK: + +```javascript +sdkOptions={{ + infuraAPIKey: 'YOUR-API-KEY', + readonlyRPCMap: { + '0x539': 'http://localhost:8545', // Custom node + '0x1': 'https://mainnet.infura.io/v3/YOUR-API-KEY', // Override Infura Mainnet + }, + defaultReadOnlyChainId: '0x1', + // Other options +} +``` + +In this example, read-only requests to Mainnet (chain ID `0x1`) use the Infura API, while read-only +requests to the local testnet (chain ID `0x539`) use the custom node. +[`defaultReadOnlyChainId`](../../reference/sdk-js-options.md#defaultreadonlychainid) enables making +read-only requests before the user connects to MetaMask, and specifies to make those requests to Mainnet. diff --git a/wallet/how-to/use-3rd-party-integrations/unity-dweb.md b/wallet/how-to/use-3rd-party-integrations/unity-dweb.md new file mode 100644 index 00000000000..78300e2f3ee --- /dev/null +++ b/wallet/how-to/use-3rd-party-integrations/unity-dweb.md @@ -0,0 +1,130 @@ +--- +sidebar_position: 3 +description: Integrate Decentraweb into your Unity game to enable human-readable addresses. +--- + +# Enable human-readable addresses in Unity + +You can integrate the [Decentraweb](https://decentraweb.org/) name resolver into your Unity game +with [MetaMask SDK](../connect/set-up-sdk/gaming/unity.md) installed. +Decentraweb maps human-readable names to machine-readable identifiers, such as Ethereum addresses. +Integrating Decentraweb into your game allows users to interact with addresses in a more user-friendly way. + +## Prerequisites + +[MetaMask SDK set up](../connect/set-up-sdk/gaming/unity.md) in your Unity game. + +## Initialize the integration wrapper + +Use the `newDWebAPIWrapper()` method to configure and initialize a C# integration wrapper, which +acts as a bridge between the MetaMask Unity SDK and the Decentraweb name resolver API. +This method initializes the wrapper with necessary configuration parameters, including +authentication details required to interact with the Decentraweb name resolver API. + +```csharp +// Initialize the wrapper +var apiWrapper = newDWebAPIWrapper(); +``` + +## Convert a name to an Ethereum address + +Use the `ResolveNameAsync(name)` method to convert a human-readable name to the corresponding +Ethereum address. + +The C# integration wrapper translates the request into a format that the Decentraweb name resolver +API can understand, and sends the translated request to the name resolver using a standard HTTP POST request. + +The name resolver processes the request and responds with the Ethereum address. + + + +# Method + +```csharp +// Initialize the wrapper +var apiWrapper = newDWebAPIWrapper(); + +// Get the user's human-readable name +var name = "user.dweb"; + +// Resolve the name to an Ethereum address +var address = await apiWrapper.ResolveNameAsync(name); +``` + +# JSON response + +```json +{ + "success": true, + "result": "0xcB3E45F337Dd3Beeba98F5F9F9A16e9cD152cC86" +} +``` + + + +## Convert an Ethereum address to a name + +Use the `GetNameAsync(address)` method to convert an Ethereum address to the corresponding +human-readable name. + +The C# integration wrapper translates the request into a format the Unity SDK can understand, and +sends the translated request to the SDK. + +The SDK processes the request and responds with the human-readable name. + + + +# Method + +```csharp +// Initialize the wrapper +var apiWrapper = newDWebAPIWrapper(); + +// Get the user's address +var address = "0xcB3E45F337Dd3Beeba98F5F9F9A16e9cD152cC86" + +// Resolve the address to a human-readable name +var name = await apiWrapper.GetNameAsync(address) +``` + +# JSON response + +```json +{ + "success": true, + "result": { + "name": "lordsats", + "confirmed": true + } +} +``` + + + +## Example + +The following is an example of using the Unity SDK Decentraweb integration to create a transaction: + +```csharp +public async Task FormTransactionAsync() +{ + // Initialize the wrapper + var apiWrapper = new DWebAPIWrapper(); + + // Get the user's human-readable name + var name = "user.dweb"; + + // Resolve the name to an Ethereum address + var address = await apiWrapper.ResolveNameAsync(name); + + // Form the transaction + var transaction = new Transaction + { + To = address, + Value = 1.0m, + Gas = 21000 + }; + + // The rest of the transaction formation code... +} +``` diff --git a/wallet/how-to/use-3rd-party-integrations/web3-onboard.md b/wallet/how-to/use-3rd-party-integrations/web3-onboard.md new file mode 100644 index 00000000000..fd3337471af --- /dev/null +++ b/wallet/how-to/use-3rd-party-integrations/web3-onboard.md @@ -0,0 +1,76 @@ +--- +description: Integrate the MetaMask JavaScript SDK with Web3-Onboard. +sidebar_position: 1 +--- + +# Use Web3-Onboard with MetaMask SDK + +[Web3-Onboard](https://onboard.blocknative.com/) is a JavaScript library that simplifies the process +of onboarding users into dapps. +It provides a smooth user interface, a variety of wallet integrations, and is highly customizable to +meet the needs of your dapp. + +You can integrate [MetaMask SDK](../../concepts/sdk/index.md) into your dapp alongside Web3-Onboard, +using the Web3-Onboard MetaMask module, to enable your users to easily connect to the MetaMask +browser extension and MetaMask Mobile. + +## Prerequisites + +A project set up with [Web3-Onboard](https://onboard.blocknative.com/docs/getting-started/installation). + +## Steps + +### 1. Install the module + +Install the Web3-Onboard MetaMask module into your dapp: + +```bash +npm i @web3-onboard/metamask +``` + +### 2. Import the module + +In your project script, add the following to import the module: + +```javascript +import metamaskSDK from '@web3-onboard/metamask' +``` + +### 3. Instantiate the module + +Instantiate the module using any [JavaScript SDK options](../../reference/sdk-js-options.md), for +example, [`dappMetadata`](../../reference/sdk-js-options.md#dappmetadata): + +```javascript +const metamaskSDKWallet = metamaskSDK({options: { + extensionOnly: false, + dappMetadata: { + name: 'Demo Web3Onboard' + } +}}) +``` + +### 4. Use the module + +Use the module as follows: + +```javascript +const onboard = Onboard({ + // Other Onboard options + wallets: [ + metamaskSDKWallet + // Other wallets + ] +}) + +const connectedWallets = await onboard.connectWallet() +console.log(connectedWallets) +``` + +## Example + +For an example of using Web3-Onboard with MetaMask SDK, see the +[example dapp](https://github.com/MetaMask/metamask-sdk/tree/main/packages/examples/with-web3onboard) +in the JavaScript SDK GitHub repository. +See the [`App.tsx`](https://github.com/MetaMask/metamask-sdk/blob/main/packages/examples/with-web3onboard/src/App.tsx) +file for more details on implementing the integration in a React dapp. diff --git a/wallet/index.md b/wallet/index.md index ae16187653b..5334e373f4a 100644 --- a/wallet/index.md +++ b/wallet/index.md @@ -7,16 +7,17 @@ title: Introduction Integrate your dapp with MetaMask to interact with your dapp users' Ethereum accounts. You can enable users to connect to their MetaMask wallets from the following dapp platforms: -- Web dapps on desktop and mobile browsers -- Desktop and mobile dapps -- Games built on platforms such as Unity +- [Web dapps](how-to/connect/set-up-sdk/javascript/index.md) on desktop and mobile browsers +- [Desktop](how-to/connect/set-up-sdk/javascript/index.md) and + [mobile](how-to/connect/set-up-sdk/mobile/index.md) dapps +- Games built on platforms such as [Unity](how-to/connect/set-up-sdk/gaming/unity.md) :::tip Integrate using MetaMask SDK [Set up MetaMask SDK](how-to/connect/set-up-sdk/index.md) to start integrating your dapp with MetaMask. -[MetaMask SDK](concepts/sdk.md) is a library that provides a reliable, secure, and seamless +[MetaMask SDK](concepts/sdk/index.md) is a library that provides a reliable, secure, and seamless connection from your dapp to the MetaMask browser extension and MetaMask Mobile. -With the SDK installed, your dapp can use the [MetaMask Ethereum provider API](concepts/provider-api.md) +With the SDK installed, your dapp can use the [MetaMask Ethereum provider API](concepts/apis.md) to request users' Ethereum accounts, read data from blockchains the user is connected to, suggest that the user sign messages and transactions, and more. ::: @@ -46,7 +47,7 @@ functions, including: - [Sign data](how-to/sign-data) - [Display tokens, contract methods, and icons in MetaMask](how-to/display) -- [Interact with smart contracts](how-to/interact-with-smart-contracts.md) +- [Interact with smart contracts](how-to/interact-with-smart-contracts/index.md) - [Access a user's MetaMask provider](how-to/access-provider.md) ## Questions? diff --git a/wallet/reference/provider-api.md b/wallet/reference/provider-api.md index d1b52ea22ea..1f38027b6c5 100644 --- a/wallet/reference/provider-api.md +++ b/wallet/reference/provider-api.md @@ -1,12 +1,12 @@ --- description: MetaMask Ethereum provider API reference -sidebar_position: 2 +sidebar_position: 3 --- # Ethereum provider API -MetaMask injects the [provider API](../concepts/provider-api.md) into websites visited by its users -using the `window.ethereum` provider object. +MetaMask injects the [provider API](../concepts/apis.md#ethereum-provider-api) into websites visited +by its users using the `window.ethereum` provider object. You can use the provider [properties](#properties), [methods](#methods), and [events](#events) in your dapp. diff --git a/wallet/reference/rpc-api.md b/wallet/reference/rpc-api.md index 61672bc45be..a84360d4aee 100644 --- a/wallet/reference/rpc-api.md +++ b/wallet/reference/rpc-api.md @@ -1,13 +1,13 @@ --- description: MetaMask Ethereum JSON-RPC API reference -sidebar_position: 3 +sidebar_position: 4 toc_max_heading_level: 2 --- # JSON-RPC API MetaMask uses the [`window.ethereum.request(args)`](provider-api.md#windowethereumrequestargs) -provider method to wrap a [JSON-RPC API](../concepts/rpc-api.md). +provider method to wrap a [JSON-RPC API](../concepts/apis.md#json-rpc-api). The API contains standard Ethereum JSON-RPC API methods and MetaMask-specific methods. :::tip MetaMask API playground @@ -18,7 +18,7 @@ The RPC methods are documented in the interactive For more information on the standard Ethereum RPC methods, see the [Ethereum wiki](https://eth.wiki/json-rpc/API#json-rpc-methods). -The following are some MetaMask-specific [unrestricted methods](../concepts/rpc-api.md#unrestricted-methods). +The following are some MetaMask-specific [unrestricted methods](../concepts/apis.md#unrestricted-methods). For the full list of MetaMask JSON-RPC API methods, see the [API playground](/wallet/reference/eth_subscribe). diff --git a/wallet/reference/sdk-js-options.md b/wallet/reference/sdk-js-options.md index 1f5d23b7dab..3c3ea86d5d2 100644 --- a/wallet/reference/sdk-js-options.md +++ b/wallet/reference/sdk-js-options.md @@ -5,41 +5,450 @@ sidebar_position: 1 # JavaScript SDK options -The JavaScript version of [MetaMask SDK](../concepts/sdk.md) takes several options. -For example, you can specify options as follows: - -```javascript -const options = { - injectProvider: false, - communicationLayerPreference: 'webrtc', -}; - -const MMSDK = new MetaMaskSDK(options); -``` - -The following table shows the full list of options: - -| Option name | Type | Default value | Description | -|--------------------------------|:----------------------------------------------:|:-------------:|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `dappMetadata` | `{name: "My Dapp", url: "https://mydapp.com"}` | `undefined` | Only required for non-web dapps (for example, React Native and Unity). | -| `injectProvider` | `boolean` | `true` | Doesn't inject in Node.js or React Native since the window object is unavailable. | -| `forceInjectProvider` | `boolean` | `false` | Forces injection even if another provider is already present on the window object. | -| `forceDeleteProvider` | `boolean` | `false` | Forces deletion of a provider that exists on a window. | -| `checkInstallationImmediately` | `boolean` | `false` | The SDK checks if MetaMask is installed when a call to `eth_requestAccounts` is made. When `true`, it checks before any call is made. | -| `checkInstallationOnAllCalls` | `boolean` | `false` | Normally checked when a call to `eth_requestAccounts` is made. When `true`, it checks on all calls. | -| `shouldShimWeb3` | `boolean` | `true` | Set as `true` if `window.web3` should be shimmed for [legacy compatibility purposes](../how-to/migrate-api.md#replace-windowweb3). | -| `preferDesktop` | `boolean` | `false` | For a web dapp running on a desktop browser without a MetaMask extension, the SDK gives the option to connect with a MetaMask Mobile wallet via a QR code. When `true`, the SDK guides the user to install the MetaMask extension instead. | -| `openDeeplink` | `(deeplinkUrl: string) => void` | `undefined` | Platforms open deeplinks differently. For example, web: `window.open` versus React Native: `Linking.open`. This function retrieves the deeplink URL and allows developers to customize how it opens. | -| `getUniversalLink` | `() => string` | `undefined` | Get the universal link that is presented on the QR Code (web) and deeplinks (mobile). This makes it easier to enable users to connect with backend code. | -| `communicationLayerPreference` | `"socket" or "webrtc"` | `socket` | Defines the communication library that the dapp and MetaMask wallet use to communicate with each other. Waku or another similar decentralized communication layer solution coming soon. | -| `webRTCLib` | `WebRTC Lib` | `undefined` | Not installed on the SDK by default. | -| `WalletConnectInstance` | `WalletConnect Lib` | `undefined` | Connect a dapp to MetaMask using [WalletConnect](https://docs.walletconnect.com/). Not installed by default. | -| `forceRestartWalletConnect` | `boolean` | `false` | Set `forceRestartWalletConnect` to `true` to kill the previous WalletConnect session and start another one. | -| `transports` | `['websocket', 'polling']` | `undefined` | Used to set the preference on [socket.io](https://socket.io/docs/v4/) transports to `use`. | -| `timer` | `BackgroundTimer` | `undefined` | Used by React Native dapps to keep the dapp alive while using `react-native-background-timer` in the background | -| `enableDebug` | `boolean` | `true` | Enables/disables the sending of debugging information to the socket.io server. The default is `true` for the beta version of the SDK. The default is `false` in production versions. | +The [JavaScript version of MetaMask SDK](../how-to/connect/set-up-sdk/javascript/index.md) takes the +following options. + +### checkInstallationImmediately + + + +# Syntax + +```javascript +checkInstallationImmediately: +``` + +# Example + +```javascript +checkInstallationImmediately: true +``` + + + +Enables or disables immediately checking if MetaMask is installed on the user's browser. +If `true`, the SDK checks for installation upon page load and sends a connection request, prompting +the user to install MetaMask if it's not already installed. +If `false`, the SDK waits for the connect method to be called to check for installation. + +The default is `false`. + +### checkInstallationOnAllCalls + + + +# Syntax + +```javascript +checkInstallationOnAllCalls: +``` + +# Example + +```javascript +checkInstallationOnAllCalls: true +``` + + + +Enables or disables checking if MetaMask is installed on the user's browser before each RPC request. +The default is `false`. + +### communicationLayerPreference + + + +# Syntax + +```javascript +communicationLayerPreference: +``` + +# Example + +```javascript +communicationLayerPreference: SOCKET +``` + + + +The preferred communication layer to use. +The default and only option is `SOCKET` for [Socket.IO](https://socket.io/docs/v4/). + +### communicationServerUrl + + + +# Syntax + +```javascript +communicationServerUrl: +``` + +# Example + +```javascript +communicationServerUrl: 'https://metamask-sdk-socket.metafi.codefi.network/' +``` + + + +The URL of the communication server to use. +This option is mainly used for debugging and testing the SDK. + +### dappMetadata + + + +# Syntax + +```javascript +dappMetadata: { + name: , + url: , + base64Icon: , +} +``` + +# Example + +```javascript +dappMetadata: { + name: 'My Dapp', + url: 'https://mydapp.com', + base64Icon: 'data:image/png;base64,...', +} +``` + + + +Metadata about the dapp using the SDK. +The metadata options are: + +- `name` - Name of the dapp +- `url` - URL of the dapp +- `base64Icon` - A base64-encoded icon + +:::tip important +Setting `dappMetaData` creates a clear and trustworthy user experience when connecting your dapp to +MetaMask Mobile. +MetaMask Mobile displays this metadata in the connection modal to help users identify and verify the +connection request. +::: + +### defaultReadOnlyChainId + + + +# Syntax + +```javascript +defaultReadOnlyChainId: +``` + +# Example + +```javascript +defaultReadOnlyChainId: '0x1' +``` + + + +Enables sending [read-only RPC requests](../how-to/use-3rd-party-integrations/js-infura-api.md) to +this chain ID before the user connects to MetaMask. +The value is automatically updated to the chain ID used in MetaMask once connected. + +### enableDebug + + + +# Syntax + +```javascript +enableDebug: +``` + +# Example + +```javascript +enableDebug: false +``` + + + +Enables or disables sending anonymous analytics to MetaMask to help improve the SDK. +The default is `true`. + +### extensionOnly + + + +# Syntax + +```javascript +extensionOnly: +``` + +# Example + +```javascript +extensionOnly: true +``` + + + +Enables or disables automatically using the MetaMask browser extension if it's detected. +The default is `false`. + +### infuraAPIKey + + + +# Syntax + +```javascript +infuraAPIKey: +``` + +# Example + +```javascript +infuraAPIKey: process.env.INFURA_API_KEY +``` + + + +The [Infura API key](https://docs.infura.io/networks/ethereum/how-to/secure-a-project/project-id) to +use for RPC requests. +Configure this option to [make read-only RPC requests from your dapp](../how-to/use-3rd-party-integrations/js-infura-api.md). :::tip -If your project is a web dapp and `injectProvider` is `true`, then the `ethereum` object should be -available in `window.ethereum`. +To prevent committing your Infura API key, we recommend adding your key to a +[`.env` file](https://docs.infura.io/tutorials/developer-tools/javascript-dotenv) and using the +`process.env` global variable when specifying this option. ::: + +### modals + + + +# Syntax + +```javascript +modals: +``` + +# Example + +```javascript +modals: { + onPendingModalDisconnect: () => { + // Custom logic for pending modal disconnect + }, + install: (params) => { + // Custom install modal logic + const { link, debug, installer, terminate, connectWithExtension } = params; + return { + mount: (link) => { /* custom mount logic */ }, + unmount: (shouldTerminate) => { /* custom unmount logic */ }, + }; + }, + otp: ({ debug, onDisconnect }) => { + // Custom OTP modal logic + return { + mount: () => { /* custom mount logic */ }, + updateOTPValue: (otpValue) => { /* custom OTP value update logic */ }, + unmount: () => { /* custom unmount logic */ }, + }; + }, +} +``` + + + +An object that allows you to [customize the logic and UI of the displayed modals](../how-to/display/custom-modals.md). +This is useful if your dapp requires a custom way to handle connection and reconnection scenarios. + +### openDeeplink + + + +# Syntax + +```javascript +openDeeplink: +``` + +# Example + +```javascript +openDeeplink: (link: string) => { + if (canOpenLink) { + Linking.openURL(link); + } +} +``` + + + +A function that is called to open a deeplink to the MetaMask Mobile app. + +### preferDesktop + + + +# Syntax + +```javascript +preferDesktop: +``` + +# Example + +```javascript +preferDesktop: true +``` + + + +Enables or disables preferring the MetaMask browser extension over MetaMask Mobile. +The default is `false`. + +### readonlyRPCMap + + + +# Syntax + +```javascript +readonlyRPCMap: +``` + +# Example + +```javascript +readonlyRPCMap: { + '0x539': 'http://localhost:8545', +} +``` + + + +A map of RPC URLs to use for [read-only RPC requests](../how-to/use-3rd-party-integrations/js-infura-api.md). + +### shouldShimWeb3 + + + +# Syntax + +```javascript +shouldShimWeb3: +``` + +# Example + +```javascript +shouldShimWeb3: false +``` + + + +Enables or disables shimming the `window.web3` object with the Ethereum provider returned by the SDK +(useful for compatibility with older browsers). +The default is `true`. + +### timer + + + +# Example + +```javascript +timer: BackgroundTimer +``` + + + +Used by React Native dapps to keep the dapp alive while using +[`react-native-background-timer`](https://github.com/ocetnik/react-native-background-timer). + +### transports + + + +# Syntax + +```javascript +transports: +``` + +# Example + +```javascript +transports: ['websocket', 'polling'] +``` + + + +Sets the preference on [Socket.IO](https://socket.io/docs/v4/) transports. + +### ui + + + +# Syntax + +```javascript +ui: { + installer: , + confirm: , +} +``` + + + +Options for customizing the SDK UI. + +### useDeeplink + + + +# Syntax + +```javascript +useDeeplink: +``` + +# Example + +```javascript +useDeeplink: true +``` + + + +Enables or disables using deeplinks to connect with MetaMask Mobile. +If `false`, the SDK uses universal links instead. +The default is `false`. + +### wakeLockType + + + +# Syntax + +```javascript +wakeLockType: +``` + +# Example + +```javascript +wakeLockType: Temporary +``` + + + +The type of wake lock to use when the SDK is running in the background. +Options are `Disabled`, `Temporary`, and `UntilResponse`. diff --git a/wallet/reference/sdk-unity-api.md b/wallet/reference/sdk-unity-api.md new file mode 100644 index 00000000000..8b4aadd7cec --- /dev/null +++ b/wallet/reference/sdk-unity-api.md @@ -0,0 +1,71 @@ +--- +description: Unity SDK API reference +sidebar_position: 2 +--- + +# Unity SDK API + +The following is an overview of the API methods used in the [Unity SDK](../how-to/connect/set-up-sdk/gaming/unity.md). + +## MetaMaskUnity + +This is a singleton class that you can use to access the `MetaMaskWallet` instance, which is +specific to Unity. + +### Instance + +This is the singleton instance of the `MetaMaskUnity` class that is lazy-loaded when you access it +for the first time. + +### Initialize + +This method initializes the `MetaMaskWallet` instance and makes it accessible via the `Wallet` property. +You can also pass extra options and parameters to it to customize the wallet instance: + +```csharp +// Initialize using default settings +MetaMaskUnity.Instance.Initialize(); + +// Initialize using custom transport and socket provider +var transport = new MyCustomTransport(); +var socketProvider = new MyCustomSocketProvider(); +MetaMaskUnity.Instance.Initialize(transport, socketProvider); + +// Initialize using custom config, transport and socket provider +var config = myMetaMaskConfig; +var transport = new MyCustomTransport(); +var socketProvider = new MyCustomSocketProvider(); +MetaMaskUnity.Instance.Initialize(config, transport, socketProvider); +``` + +### SaveSession + +This method saves the current session to persistent storage. +It is useful when you want to save the session and restore it later. +When the application starts, it automatically calls this method. +You can also manually call this method. + +### LoadSession + +This method loads the session from persistent storage. +It is useful when you want to restore the session after the application quits. +When the application starts, it automatically calls this method. +You can also manually call this method. + +## MetaMaskWallet + +### Connect + +This method connects to MetaMask. +It renders a generated QR code in the user interface for your users to scan with MetaMask Mobile. +After the user scans this QR code, a connection screen appears in MetaMask Mobile where the user can +approve the connection with your Unity game. + +### Disconnect + +This method disconnects the user from the MetaMask session. + +### Request + +This method sends a request to MetaMask. +You can use it to call any [provider API method](provider-api.md). diff --git a/wallet/tutorials/react-dapp-local-state.md b/wallet/tutorials/react-dapp-local-state.md index b35f9c1b32d..2f32beade59 100644 --- a/wallet/tutorials/react-dapp-local-state.md +++ b/wallet/tutorials/react-dapp-local-state.md @@ -158,8 +158,7 @@ You'll also see the `ethereum` provider printed to the console. ![Injected Provider DOES Exist](../assets/tutorials/react-dapp/pt1-03.png) -You can toggle back and forth between these two states by enabling and disabling the MetaMask -extension from your browser's **Manage Extensions** menu. +You can switch between these two states by enabling or disabling the MetaMask extension through your browser's **Manage Extensions** menu. #### Use @metamask/detect-provider @@ -719,4 +718,4 @@ As a next step, you can [create a React dapp with global state](react-dapp-globa This follow-up tutorial walks you through adding more than one component and working with global state. You'll use [React's Context API](https://react.dev/reference/react/useContext) to manage the state globally and ensure that any component in your dapp can be aware and conditionally render or display -information about your MetaMask wallet. \ No newline at end of file +information about your MetaMask wallet. diff --git a/yarn.lock b/yarn.lock index d96ba5220f6..825946f7070 100644 --- a/yarn.lock +++ b/yarn.lock @@ -55,83 +55,83 @@ __metadata: languageName: node linkType: hard -"@algolia/cache-browser-local-storage@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/cache-browser-local-storage@npm:4.18.0" +"@algolia/cache-browser-local-storage@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/cache-browser-local-storage@npm:4.20.0" dependencies: - "@algolia/cache-common": 4.18.0 - checksum: 2500b033212fe83d85026bce928176961f8f4ead365697c7810d130768b3de5759e7a7f8b4c98d0010c83398d474c17b6b7512980b836fe53decda6165b3cda5 + "@algolia/cache-common": 4.20.0 + checksum: b9ca7e190ab77ddf4d30d22223345f69fc89899aa6887ee716e4ffcef14c8c9d28b782cb7cc96a0f04eed95a989878a6feca5b9aa6add0cd1846222c3308bb65 languageName: node linkType: hard -"@algolia/cache-common@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/cache-common@npm:4.18.0" - checksum: 96ec793daca0b02669e01ee5cc4b92a027b31e158376ca56e5c2beee44706f5f876ff6f8167317e8211cb586127e7e6da29149941228febcff5256fa512485b4 +"@algolia/cache-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/cache-common@npm:4.20.0" + checksum: a46377de8a309feea109aae1283fc9157c73766a4c51e3085870a1fc49f6e33698814379f3bbdf475713fa0663dace86fc90f0466e64469b1b885a0538abace4 languageName: node linkType: hard -"@algolia/cache-in-memory@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/cache-in-memory@npm:4.18.0" +"@algolia/cache-in-memory@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/cache-in-memory@npm:4.20.0" dependencies: - "@algolia/cache-common": 4.18.0 - checksum: eb319dee07108372d32caed3103866108b5fbc63400c30f4bf0349448c26895857d7dfb2a91cf64e284fe50fad45ce90cced05c84dd0fc0566abf593f7ba9fa2 + "@algolia/cache-common": 4.20.0 + checksum: 3d67dcfae431605c8b9b1502f14865722f13b97b2822e1e3ed53bbf7bf66a120a825ccf5ed03476ebdf4aa15482dad5bfc6c2c93d81f07f862c373c689f49317 languageName: node linkType: hard -"@algolia/client-account@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/client-account@npm:4.18.0" +"@algolia/client-account@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-account@npm:4.20.0" dependencies: - "@algolia/client-common": 4.18.0 - "@algolia/client-search": 4.18.0 - "@algolia/transporter": 4.18.0 - checksum: 259abe156420b4e2f53080da34271b311f0859b1414250a5c4f1167274b13e1e44a3176b0355d831fc16bd969acd7bd25b1fa2425a473f8f43c5da5f5a1aaef5 + "@algolia/client-common": 4.20.0 + "@algolia/client-search": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: b59e9c7a324bbfba4abdab3f41d333522eb1abce7dab74e69d297acd9ee2a3c60e82e5e9db42e6a46b5ea26a35728533e6e4ff846c631b588ceb73d14dcbc5fb languageName: node linkType: hard -"@algolia/client-analytics@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/client-analytics@npm:4.18.0" +"@algolia/client-analytics@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-analytics@npm:4.20.0" dependencies: - "@algolia/client-common": 4.18.0 - "@algolia/client-search": 4.18.0 - "@algolia/requester-common": 4.18.0 - "@algolia/transporter": 4.18.0 - checksum: cf86ec02e647cd07ab3dac6764453749074ee15cd0cde0298da11f583e9af428fbd08f818414f8b43749968be730ba8829f1e6a32e5c0128a7728dcbfbc607ed + "@algolia/client-common": 4.20.0 + "@algolia/client-search": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: 0be4120ab72162e0640e49eedddff81bfc2c590e9a9322d1788b8c01e06fdabcaaaa9cd75b5b516e502deb888d3ba2285ac5e1c3bb91fc9eb552a24a716dc6e3 languageName: node linkType: hard -"@algolia/client-common@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/client-common@npm:4.18.0" +"@algolia/client-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-common@npm:4.20.0" dependencies: - "@algolia/requester-common": 4.18.0 - "@algolia/transporter": 4.18.0 - checksum: 993b23636ef669859475388c473b69c4bfe40dbfecdcf2c75aac03c23512b3284408f31112eba40a130392311dc006625296614496d622d9e4b3f5f52a70953a + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: 88a27b5f8bba38349e1dbe47634e2ee159a413ff1a3baf6a65fbf244835f8d368e9f0a5ccce8bfe94ec405b38608be5bed45bcb140517f3aba6fe3b7045db373 languageName: node linkType: hard -"@algolia/client-personalization@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/client-personalization@npm:4.18.0" +"@algolia/client-personalization@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-personalization@npm:4.20.0" dependencies: - "@algolia/client-common": 4.18.0 - "@algolia/requester-common": 4.18.0 - "@algolia/transporter": 4.18.0 - checksum: 5b52031733bceb0b9b23a2f09920c1d320126afcce2511c594395681c2156902618eb1193136012a728431d87a72808de1dcaf44af32efc40237388f283aec6f + "@algolia/client-common": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: ddb92ebe135564e03db6ac75da7fdc1c7500a0deffb7e41d5a02a413216a06daea008f8062dab606ba8af4c3c34e550354f48e6ea7b048882c385d915643799a languageName: node linkType: hard -"@algolia/client-search@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/client-search@npm:4.18.0" +"@algolia/client-search@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/client-search@npm:4.20.0" dependencies: - "@algolia/client-common": 4.18.0 - "@algolia/requester-common": 4.18.0 - "@algolia/transporter": 4.18.0 - checksum: 86bfce7c2e5f290b4fb225e20a708f4000ac945e7c1d2ec5f9285fe2b3eff0881fd98af2d898213d928c19af5c7c045dc169bf5c1c221178cd31a921494039c1 + "@algolia/client-common": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: 9fb6624dab6753f336f3207ee2af3558baeec4772ef739b6f6ed6a754c366e2e8d62cbf1cf8b28d5f763bec276a0a5fc36db2bf6f53a707890a411afcf550e92 languageName: node linkType: hard @@ -142,55 +142,55 @@ __metadata: languageName: node linkType: hard -"@algolia/logger-common@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/logger-common@npm:4.18.0" - checksum: 562e85124bd81a6214717ff60329253e73723895441f086034d0c2411ffc26b3136c827d5823c8d7cc89fd7bb423be107735a04fc26fec9b7ff34fb49152c9fd +"@algolia/logger-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/logger-common@npm:4.20.0" + checksum: 06ed28f76b630c8e7597534b15138ab6f71c10dfc6e13f1fb1b76965b39c88fd1d9cb3fe6bb9d046de6533ebcbe5ad92e751bc36fabe98ceda39d1d5f47bb637 languageName: node linkType: hard -"@algolia/logger-console@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/logger-console@npm:4.18.0" +"@algolia/logger-console@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/logger-console@npm:4.20.0" dependencies: - "@algolia/logger-common": 4.18.0 - checksum: 84594bf7547d2e946ff1ebc41d44c3c2a220341872c7b492a29df4c4d9bf9fe058bd693d0c773ea504eb727ce0259a76892488a44edd328ff7dd0e60342d0f14 + "@algolia/logger-common": 4.20.0 + checksum: 721dffe37563e2998d4c361f09a05736b4baa141bfb7da25d50f890ba8257ac99845dd94b43d0d6db38e2fdab96508a726e184a00e5b1e83ef18a16da6fc716c languageName: node linkType: hard -"@algolia/requester-browser-xhr@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/requester-browser-xhr@npm:4.18.0" +"@algolia/requester-browser-xhr@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/requester-browser-xhr@npm:4.20.0" dependencies: - "@algolia/requester-common": 4.18.0 - checksum: 8a8410d96c30e09f9928cfd0ebe8f1fcbf0f7f0422304f102874706e056307c76bba93d51b04c8332457e5189dbaa21f207edbd26651fec6528364adf10d73b4 + "@algolia/requester-common": 4.20.0 + checksum: 669790c7dfd491318976b9d61d98d9785880d7385ba33669f3f8b9c66ea88320bcded82d34f58b5df74b2cb8beb62ef48a28d39117f7997be84348c9fa7f6132 languageName: node linkType: hard -"@algolia/requester-common@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/requester-common@npm:4.18.0" - checksum: b7bbbba0dd84f802589079170558fbb7a8d969cd544cdc04ad844b224c4a8abbfbbe97632803639c0a6e67162c06ccf5df40fb52d18fe0304e96abab915230e6 +"@algolia/requester-common@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/requester-common@npm:4.20.0" + checksum: 8580ffd2be146bbdb5d4a57668bba4a5014f406cb2e5c65f596db6babab46c48d30c6e4732034ee1f987970aa27dcdab567959d654fa5fa74c4bcaf98312a724 languageName: node linkType: hard -"@algolia/requester-node-http@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/requester-node-http@npm:4.18.0" +"@algolia/requester-node-http@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/requester-node-http@npm:4.20.0" dependencies: - "@algolia/requester-common": 4.18.0 - checksum: 64508ba6dc7688bc4d1eff3f6040f584812c6e5a957c2e38cb2bb17e73215cf6e4e2cee35b9345a4e0868ecbc13e1dacd002536fe132e3c197e8f80c2fd2355b + "@algolia/requester-common": 4.20.0 + checksum: 7857114b59c67e0d22e8a7ff3f755d11534a1602a4fc80802d3b35802777880a4980420914ea4a6e3e21198f5bacb95906289ce1bb9372458bf6a60a723bee59 languageName: node linkType: hard -"@algolia/transporter@npm:4.18.0": - version: 4.18.0 - resolution: "@algolia/transporter@npm:4.18.0" +"@algolia/transporter@npm:4.20.0": + version: 4.20.0 + resolution: "@algolia/transporter@npm:4.20.0" dependencies: - "@algolia/cache-common": 4.18.0 - "@algolia/logger-common": 4.18.0 - "@algolia/requester-common": 4.18.0 - checksum: 252b0cafe16d9ce1a97a5ad616e259161ecf040eb851c9673ed218b4100fb37fab3bdff6ae16e6a136e37ab8959386f1acc147f23a7cca802fdd5790e31d5339 + "@algolia/cache-common": 4.20.0 + "@algolia/logger-common": 4.20.0 + "@algolia/requester-common": 4.20.0 + checksum: f834d5c8fcb7dfa9b7044cb81e9fab44a32f9dd0c3868a0f85fe0de4f4d27ad11fdc9c3c78541bc944c2593f4be56517a8ce593309d062b8a46ca0d6fcb5dcbc languageName: node linkType: hard @@ -204,19 +204,20 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.22.5, @babel/code-frame@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/code-frame@npm:7.22.5" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.10.4, @babel/code-frame@npm:^7.16.0, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.8.3": + version: 7.22.13 + resolution: "@babel/code-frame@npm:7.22.13" dependencies: - "@babel/highlight": ^7.22.5 - checksum: cfe804f518f53faaf9a1d3e0f9f74127ab9a004912c3a16fda07fb6a633393ecb9918a053cb71804204c1b7ec3d49e1699604715e2cfb0c9f7bc4933d324ebb6 + "@babel/highlight": ^7.22.13 + chalk: ^2.4.2 + checksum: 22e342c8077c8b77eeb11f554ecca2ba14153f707b85294fcf6070b6f6150aae88a7b7436dd88d8c9289970585f3fe5b9b941c5aa3aa26a6d5a8ef3f292da058 languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.5, @babel/compat-data@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/compat-data@npm:7.22.6" - checksum: b88631143a2ebdb75e5bac47984e950983294f1739c2133f32569c6f2fcee85f83634bb6cf4378afb44fa8eb7877d11e48811d1e6a52afa161f82276ffdc3fb4 +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/compat-data@npm:7.23.2" + checksum: d8dc27437d40907b271161d4c88ffe72ccecb034c730deb1960a417b59a14d7c5ebca8cd80dd458a01cd396a7a329eb48cddcc3791b5a84da33d7f278f7bec6a languageName: node linkType: hard @@ -245,37 +246,37 @@ __metadata: linkType: hard "@babel/core@npm:^7.18.6, @babel/core@npm:^7.19.6": - version: 7.22.8 - resolution: "@babel/core@npm:7.22.8" + version: 7.23.2 + resolution: "@babel/core@npm:7.23.2" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.7 - "@babel/helper-compilation-targets": ^7.22.6 - "@babel/helper-module-transforms": ^7.22.5 - "@babel/helpers": ^7.22.6 - "@babel/parser": ^7.22.7 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.8 - "@babel/types": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 - convert-source-map: ^1.7.0 + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.23.0 + "@babel/helper-compilation-targets": ^7.22.15 + "@babel/helper-module-transforms": ^7.23.0 + "@babel/helpers": ^7.23.2 + "@babel/parser": ^7.23.0 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.2 + "@babel/types": ^7.23.0 + convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 - json5: ^2.2.2 - checksum: 75ed701c14ad17070382ae1dd166f7534b31f2c71e00995a5f261ee2398ee96335b0736573b8ff24ab6e3e6f5814ee2a48fa11ab90fabcd3dfc70ea87c5f30a6 + json5: ^2.2.3 + semver: ^6.3.1 + checksum: 003897718ded16f3b75632d63cd49486bf67ff206cc7ebd1a10d49e2456f8d45740910d5ec7e42e3faf0deec7a2e96b1a02e766d19a67a8309053f0d4e57c0fe languageName: node linkType: hard -"@babel/generator@npm:^7.12.5, @babel/generator@npm:^7.18.7, @babel/generator@npm:^7.22.7": - version: 7.22.7 - resolution: "@babel/generator@npm:7.22.7" +"@babel/generator@npm:^7.12.5, @babel/generator@npm:^7.18.7, @babel/generator@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/generator@npm:7.23.0" dependencies: - "@babel/types": ^7.22.5 + "@babel/types": ^7.23.0 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: cee15558888bdf5564e19cfaf95101b2910fa425f30cc1a25ac9b8621bd62b63544eb1b36ad89c80b5e41915699219f78712cab128d1f7e3da6a21fbf4143927 + checksum: 8efe24adad34300f1f8ea2add420b28171a646edc70f2a1b3e1683842f23b8b7ffa7e35ef0119294e1901f45bfea5b3dc70abe1f10a1917ccdfb41bed69be5f1 languageName: node linkType: hard @@ -289,64 +290,62 @@ __metadata: linkType: hard "@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.5" + version: 7.22.15 + resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.22.15" dependencies: - "@babel/types": ^7.22.5 - checksum: d753acac62399fc6dd354cf1b9441bde0c331c2fe792a4c14904c5e5eafc3cac79478f6aa038e8a51c1148b0af6710a2e619855e4b5d54497ac972eaffed5884 + "@babel/types": ^7.22.15 + checksum: 639c697a1c729f9fafa2dd4c9af2e18568190299b5907bd4c2d0bc818fcbd1e83ffeecc2af24327a7faa7ac4c34edd9d7940510a5e66296c19bad17001cf5c7a languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helper-compilation-targets@npm:7.22.6" +"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.5, @babel/helper-compilation-targets@npm:^7.22.6": + version: 7.22.15 + resolution: "@babel/helper-compilation-targets@npm:7.22.15" dependencies: - "@babel/compat-data": ^7.22.6 - "@babel/helper-validator-option": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 + "@babel/compat-data": ^7.22.9 + "@babel/helper-validator-option": ^7.22.15 browserslist: ^4.21.9 lru-cache: ^5.1.1 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: c7788c48099c4f0edf2adeb367a941a930d39ed7453140ceb10d7114c4091922adf56d3cdd832050fd4501f25e872886390629042ddd365d3bce2ecad69ed394 + semver: ^6.3.1 + checksum: ce85196769e091ae54dd39e4a80c2a9df1793da8588e335c383d536d54f06baf648d0a08fc873044f226398c4ded15c4ae9120ee18e7dfd7c639a68e3cdc9980 languageName: node linkType: hard -"@babel/helper-create-class-features-plugin@npm:^7.22.5": - version: 7.22.6 - resolution: "@babel/helper-create-class-features-plugin@npm:7.22.6" +"@babel/helper-create-class-features-plugin@npm:^7.22.11, @babel/helper-create-class-features-plugin@npm:^7.22.15, @babel/helper-create-class-features-plugin@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-create-class-features-plugin@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-function-name": ^7.22.5 - "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-member-expression-to-functions": ^7.22.15 "@babel/helper-optimise-call-expression": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.9 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@nicolo-ribaudo/semver-v6": ^6.3.3 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: 10412e8a509a607cde6137288d3f12b1f91acd374e29e6dd6a277b67217e9f4c932a0acd89eeda837c8432916df775a8af6321aeb8d8b131ccdbf7688208dda1 + checksum: 52c500d8d164abb3a360b1b7c4b8fff77bc4a5920d3a2b41ae6e1d30617b0dc0b972c1f5db35b1752007e04a748908b4a99bc872b73549ae837e87dcdde005a3 languageName: node linkType: hard "@babel/helper-create-regexp-features-plugin@npm:^7.18.6, @babel/helper-create-regexp-features-plugin@npm:^7.22.5": - version: 7.22.6 - resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.6" + version: 7.22.15 + resolution: "@babel/helper-create-regexp-features-plugin@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 regexpu-core: ^5.3.1 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0 - checksum: a26df33a08bc603177cc4a59d067740bd7156c05d6b519bf28cdd2f07f653be2a7f37d8dd93b85e620f20ad90da1b8dbe4d7c6cf5262e67f713904e811b7ffd2 + checksum: 0243b8d4854f1dc8861b1029a46d3f6393ad72f366a5a08e36a4648aa682044f06da4c6e87a456260e1e1b33c999f898ba591a0760842c1387bcc93fbf2151a6 languageName: node linkType: hard -"@babel/helper-define-polyfill-provider@npm:^0.4.1": - version: 0.4.1 - resolution: "@babel/helper-define-polyfill-provider@npm:0.4.1" +"@babel/helper-define-polyfill-provider@npm:^0.4.3": + version: 0.4.3 + resolution: "@babel/helper-define-polyfill-provider@npm:0.4.3" dependencies: "@babel/helper-compilation-targets": ^7.22.6 "@babel/helper-plugin-utils": ^7.22.5 @@ -354,25 +353,25 @@ __metadata: lodash.debounce: ^4.0.8 resolve: ^1.14.2 peerDependencies: - "@babel/core": ^7.4.0-0 - checksum: 712b440cdd343ac7c4617225f91b0a9db5a7b1c96356b720e011af64ad6c4da9c66889f8d2962a0a2ae2e4ccb6a9b4a210c4a3c8c8ff103846b3d93b61bc6634 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 5d21e3f47b320e4b5b644195ec405e7ebc3739e48e65899efc808c5fa9c3bf5b06ce0d8ff5246ca99d1411e368f4557bc66730196c5781a5c4e986ee703bee79 languageName: node linkType: hard -"@babel/helper-environment-visitor@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-environment-visitor@npm:7.22.5" - checksum: 248532077d732a34cd0844eb7b078ff917c3a8ec81a7f133593f71a860a582f05b60f818dc5049c2212e5baa12289c27889a4b81d56ef409b4863db49646c4b1 +"@babel/helper-environment-visitor@npm:^7.22.20, @babel/helper-environment-visitor@npm:^7.22.5": + version: 7.22.20 + resolution: "@babel/helper-environment-visitor@npm:7.22.20" + checksum: d80ee98ff66f41e233f36ca1921774c37e88a803b2f7dca3db7c057a5fea0473804db9fb6729e5dbfd07f4bed722d60f7852035c2c739382e84c335661590b69 languageName: node linkType: hard -"@babel/helper-function-name@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-function-name@npm:7.22.5" +"@babel/helper-function-name@npm:^7.22.5, @babel/helper-function-name@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-function-name@npm:7.23.0" dependencies: - "@babel/template": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 6b1f6ce1b1f4e513bf2c8385a557ea0dd7fa37971b9002ad19268ca4384bbe90c09681fe4c076013f33deabc63a53b341ed91e792de741b4b35e01c00238177a + "@babel/template": ^7.22.15 + "@babel/types": ^7.23.0 + checksum: e44542257b2d4634a1f979244eb2a4ad8e6d75eb6761b4cfceb56b562f7db150d134bc538c8e6adca3783e3bc31be949071527aa8e3aab7867d1ad2d84a26e10 languageName: node linkType: hard @@ -385,37 +384,36 @@ __metadata: languageName: node linkType: hard -"@babel/helper-member-expression-to-functions@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-member-expression-to-functions@npm:7.22.5" +"@babel/helper-member-expression-to-functions@npm:^7.22.15": + version: 7.23.0 + resolution: "@babel/helper-member-expression-to-functions@npm:7.23.0" dependencies: - "@babel/types": ^7.22.5 - checksum: 4bd5791529c280c00743e8bdc669ef0d4cd1620d6e3d35e0d42b862f8262bc2364973e5968007f960780344c539a4b9cf92ab41f5b4f94560a9620f536de2a39 + "@babel/types": ^7.23.0 + checksum: 494659361370c979ada711ca685e2efe9460683c36db1b283b446122596602c901e291e09f2f980ecedfe6e0f2bd5386cb59768285446530df10c14df1024e75 languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-imports@npm:7.22.5" +"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/helper-module-imports@npm:7.22.15" dependencies: - "@babel/types": ^7.22.5 - checksum: 9ac2b0404fa38b80bdf2653fbeaf8e8a43ccb41bd505f9741d820ed95d3c4e037c62a1bcdcb6c9527d7798d2e595924c4d025daed73283badc180ada2c9c49ad + "@babel/types": ^7.22.15 + checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-module-transforms@npm:7.22.5" +"@babel/helper-module-transforms@npm:^7.12.1, @babel/helper-module-transforms@npm:^7.22.5, @babel/helper-module-transforms@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/helper-module-transforms@npm:7.23.0" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: 8985dc0d971fd17c467e8b84fe0f50f3dd8610e33b6c86e5b3ca8e8859f9448bcc5c84e08a2a14285ef388351c0484797081c8f05a03770bf44fc27bf4900e68 + "@babel/helper-split-export-declaration": ^7.22.6 + "@babel/helper-validator-identifier": ^7.22.20 + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 6e2afffb058cf3f8ce92f5116f710dda4341c81cfcd872f9a0197ea594f7ce0ab3cb940b0590af2fe99e60d2e5448bfba6bca8156ed70a2ed4be2adc8586c891 languageName: node linkType: hard @@ -442,31 +440,29 @@ __metadata: languageName: node linkType: hard -"@babel/helper-remap-async-to-generator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-remap-async-to-generator@npm:7.22.5" +"@babel/helper-remap-async-to-generator@npm:^7.22.20, @babel/helper-remap-async-to-generator@npm:^7.22.5": + version: 7.22.20 + resolution: "@babel/helper-remap-async-to-generator@npm:7.22.20" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-wrap-function": ^7.22.5 - "@babel/types": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-wrap-function": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: 1e51dcff1c22e97ea3d22034b77788048eb6d8c6860325bd7a1046b7a7135730cefd93b5c96fd9839d76031095d5ffb6f0cd6ee90a5d69a4c7de980d7f4623d9 + checksum: 2fe6300a6f1b58211dffa0aed1b45d4958506d096543663dba83bd9251fe8d670fa909143a65b45e72acb49e7e20fbdb73eae315d9ddaced467948c3329986e7 languageName: node linkType: hard -"@babel/helper-replace-supers@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-replace-supers@npm:7.22.5" +"@babel/helper-replace-supers@npm:^7.22.5, @babel/helper-replace-supers@npm:^7.22.9": + version: 7.22.20 + resolution: "@babel/helper-replace-supers@npm:7.22.20" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-member-expression-to-functions": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-member-expression-to-functions": ^7.22.15 "@babel/helper-optimise-call-expression": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: af29deff6c6dc3fa2d1a517390716aa3f4d329855e8689f1d5c3cb07c1b898e614a5e175f1826bb58e9ff1480e6552885a71a9a0ba5161787aaafa2c79b216cc + peerDependencies: + "@babel/core": ^7.0.0 + checksum: a0008332e24daedea2e9498733e3c39b389d6d4512637e000f96f62b797e702ee24a407ccbcd7a236a551590a38f31282829a8ef35c50a3c0457d88218cae639 languageName: node linkType: hard @@ -488,7 +484,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-split-export-declaration@npm:^7.22.5, @babel/helper-split-export-declaration@npm:^7.22.6": +"@babel/helper-split-export-declaration@npm:^7.22.6": version: 7.22.6 resolution: "@babel/helper-split-export-declaration@npm:7.22.6" dependencies: @@ -504,84 +500,83 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-identifier@npm:7.22.5" - checksum: 7f0f30113474a28298c12161763b49de5018732290ca4de13cdaefd4fd0d635a6fe3f6686c37a02905fb1e64f21a5ee2b55140cf7b070e729f1bd66866506aea +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-validator-option@npm:7.22.5" - checksum: bbeca8a85ee86990215c0424997438b388b8d642d69b9f86c375a174d3cdeb270efafd1ff128bc7a1d370923d13b6e45829ba8581c027620e83e3a80c5c414b3 +"@babel/helper-validator-option@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/helper-validator-option@npm:7.22.15" + checksum: 68da52b1e10002a543161494c4bc0f4d0398c8fdf361d5f7f4272e95c45d5b32d974896d44f6a0ea7378c9204988879d73613ca683e13bd1304e46d25ff67a8d languageName: node linkType: hard -"@babel/helper-wrap-function@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/helper-wrap-function@npm:7.22.5" +"@babel/helper-wrap-function@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-wrap-function@npm:7.22.20" dependencies: "@babel/helper-function-name": ^7.22.5 - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: a4ba2d7577ad3ce92fadaa341ffce3b0e4b389808099b07c80847f9be0852f4b42344612bc1b3d1b796ffb75be56d5957c5c56a1734f6aee5ccbb7cd9ab12691 + "@babel/template": ^7.22.15 + "@babel/types": ^7.22.19 + checksum: 221ed9b5572612aeb571e4ce6a256f2dee85b3c9536f1dd5e611b0255e5f59a3d0ec392d8d46d4152149156a8109f92f20379b1d6d36abb613176e0e33f05fca languageName: node linkType: hard -"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/helpers@npm:7.22.6" +"@babel/helpers@npm:^7.12.5, @babel/helpers@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/helpers@npm:7.23.2" dependencies: - "@babel/template": ^7.22.5 - "@babel/traverse": ^7.22.6 - "@babel/types": ^7.22.5 - checksum: 5c1f33241fe7bf7709868c2105134a0a86dca26a0fbd508af10a89312b1f77ca38ebae43e50be3b208613c5eacca1559618af4ca236f0abc55d294800faeff30 + "@babel/template": ^7.22.15 + "@babel/traverse": ^7.23.2 + "@babel/types": ^7.23.0 + checksum: aaf4828df75ec460eaa70e5c9f66e6dadc28dae3728ddb7f6c13187dbf38030e142194b83d81aa8a31bbc35a5529a5d7d3f3cf59d5d0b595f5dd7f9d8f1ced8e languageName: node linkType: hard -"@babel/highlight@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/highlight@npm:7.22.5" +"@babel/highlight@npm:^7.22.13": + version: 7.22.20 + resolution: "@babel/highlight@npm:7.22.20" dependencies: - "@babel/helper-validator-identifier": ^7.22.5 - chalk: ^2.0.0 + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 js-tokens: ^4.0.0 - checksum: f61ae6de6ee0ea8d9b5bcf2a532faec5ab0a1dc0f7c640e5047fc61630a0edb88b18d8c92eb06566d30da7a27db841aca11820ecd3ebe9ce514c9350fbed39c4 + checksum: 84bd034dca309a5e680083cd827a766780ca63cef37308404f17653d32366ea76262bd2364b2d38776232f2d01b649f26721417d507e8b4b6da3e4e739f6d134 languageName: node linkType: hard -"@babel/parser@npm:^7.12.7, @babel/parser@npm:^7.18.8, @babel/parser@npm:^7.22.5, @babel/parser@npm:^7.22.7": - version: 7.22.7 - resolution: "@babel/parser@npm:7.22.7" +"@babel/parser@npm:^7.12.7, @babel/parser@npm:^7.18.8, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/parser@npm:7.23.0" bin: parser: ./bin/babel-parser.js - checksum: 02209ddbd445831ee8bf966fdf7c29d189ed4b14343a68eb2479d940e7e3846340d7cc6bd654a5f3d87d19dc84f49f50a58cf9363bee249dc5409ff3ba3dab54 + checksum: 453fdf8b9e2c2b7d7b02139e0ce003d1af21947bbc03eb350fb248ee335c9b85e4ab41697ddbdd97079698de825a265e45a0846bb2ed47a2c7c1df833f42a354 languageName: node linkType: hard -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.5" +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0 - checksum: 1e353a060fb2cd8f1256d28cd768f16fb02513f905b9b6d656fb0242c96c341a196fa188b27c2701506a6e27515359fbcc1a5ca7fa8b9b530cf88fbd137baefc + checksum: 8910ca21a7ec7c06f7b247d4b86c97c5aa15ef321518f44f6f490c5912fdf82c605aaa02b90892e375d82ccbedeadfdeadd922c1b836c9dd4c596871bf654753 languageName: node linkType: hard -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.5" +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 - "@babel/plugin-transform-optional-chaining": ^7.22.5 + "@babel/plugin-transform-optional-chaining": ^7.22.15 peerDependencies: "@babel/core": ^7.13.0 - checksum: 16e7a5f3bf2f2ac0ca032a70bf0ebd7e886d84dbb712b55c0643c04c495f0f221fbcbca14b5f8f8027fa6c87a3dafae0934022ad2b409384af6c5c356495b7bd + checksum: fbefedc0da014c37f1a50a8094ce7dbbf2181ae93243f23d6ecba2499b5b20196c2124d6a4dfe3e9e0125798e80593103e456352a4beb4e5c6f7c75efb80fdac languageName: node linkType: hard @@ -607,18 +602,6 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-proposal-unicode-property-regex@npm:^7.4.4": - version: 7.18.6 - resolution: "@babel/plugin-proposal-unicode-property-regex@npm:7.18.6" - dependencies: - "@babel/helper-create-regexp-features-plugin": ^7.18.6 - "@babel/helper-plugin-utils": ^7.18.6 - peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: a8575ecb7ff24bf6c6e94808d5c84bb5a0c6dd7892b54f09f4646711ba0ee1e1668032b3c43e3e1dfec2c5716c302e851ac756c1645e15882d73df6ad21ae951 - languageName: node - linkType: hard - "@babel/plugin-syntax-async-generators@npm:^7.8.4": version: 7.8.4 resolution: "@babel/plugin-syntax-async-generators@npm:7.8.4" @@ -862,17 +845,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-async-generator-functions@npm:^7.22.7": - version: 7.22.7 - resolution: "@babel/plugin-transform-async-generator-functions@npm:7.22.7" +"@babel/plugin-transform-async-generator-functions@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/plugin-transform-async-generator-functions@npm:7.23.2" dependencies: - "@babel/helper-environment-visitor": ^7.22.5 + "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-remap-async-to-generator": ^7.22.5 + "@babel/helper-remap-async-to-generator": ^7.22.20 "@babel/plugin-syntax-async-generators": ^7.8.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 57cd2cce3fb696dadf00e88f168683df69e900b92dadeae07429243c43bc21d5ccdc0c2db61cf5c37bd0fbd893fc455466bef6babe4aa5b79d9cb8ba89f40ae7 + checksum: e1abae0edcda7304d7c17702ac25a127578791b89c4f767d60589249fa3e50ec33f8c9ff39d3d8d41f00b29947654eaddd4fd586e04c4d598122db745fab2868 languageName: node linkType: hard @@ -900,14 +883,14 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-block-scoping@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-block-scoping@npm:7.22.5" +"@babel/plugin-transform-block-scoping@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-block-scoping@npm:7.23.0" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 26987002cfe6e24544e60fa35f07052b6557f590c1a1cc5cf35d6dc341d7fea163c1222a2d70d5d2692f0b9860d942fd3ba979848b2995d4debffa387b9b19ae + checksum: 0cfe925cc3b5a3ad407e2253fab3ceeaa117a4b291c9cb245578880872999bca91bd83ffa0128ae9ca356330702e1ef1dcb26804f28d2cef678239caf629f73e languageName: node linkType: hard @@ -923,35 +906,35 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-class-static-block@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-class-static-block@npm:7.22.5" +"@babel/plugin-transform-class-static-block@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-class-static-block@npm:7.22.11" dependencies: - "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.11 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-class-static-block": ^7.14.5 peerDependencies: "@babel/core": ^7.12.0 - checksum: bc48b92dbaf625a14f2bf62382384eef01e0515802426841636ae9146e27395d068c7a8a45e9e15699491b0a01d990f38f179cbc9dc89274a393f85648772f12 + checksum: 69f040506fad66f1c6918d288d0e0edbc5c8a07c8b4462c1184ad2f9f08995d68b057126c213871c0853ae0c72afc60ec87492049dfacb20902e32346a448bcb languageName: node linkType: hard -"@babel/plugin-transform-classes@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/plugin-transform-classes@npm:7.22.6" +"@babel/plugin-transform-classes@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-classes@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.6 + "@babel/helper-compilation-targets": ^7.22.15 "@babel/helper-environment-visitor": ^7.22.5 "@babel/helper-function-name": ^7.22.5 "@babel/helper-optimise-call-expression": ^7.22.5 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-replace-supers": ^7.22.5 + "@babel/helper-replace-supers": ^7.22.9 "@babel/helper-split-export-declaration": ^7.22.6 globals: ^11.1.0 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 8380e855c01033dbc7460d9acfbc1fc37c880350fa798c2de8c594ef818ade0e4c96173ec72f05f2a4549d8d37135e18cb62548352d51557b45a0fb4388d2f3f + checksum: d3f4d0c107dd8a3557ea3575cc777fab27efa92958b41e4a9822f7499725c1f554beae58855de16ddec0a7b694e45f59a26cea8fbde4275563f72f09c6e039a0 languageName: node linkType: hard @@ -967,18 +950,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-destructuring@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-destructuring@npm:7.22.5" +"@babel/plugin-transform-destructuring@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-destructuring@npm:7.23.0" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 76f6ea2aee1fcfa1c3791eb7a5b89703c6472650b993e8666fff0f1d6e9d737a84134edf89f63c92297f3e75064c1263219463b02dd9bc7434b6e5b9935e3f20 + checksum: cd6dd454ccc2766be551e4f8a04b1acc2aa539fa19e5c7501c56cc2f8cc921dd41a7ffb78455b4c4b2f954fcab8ca4561ba7c9c7bd5af9f19465243603d18cc3 languageName: node linkType: hard -"@babel/plugin-transform-dotall-regex@npm:^7.22.5, @babel/plugin-transform-dotall-regex@npm:^7.4.4": +"@babel/plugin-transform-dotall-regex@npm:^7.22.5": version: 7.22.5 resolution: "@babel/plugin-transform-dotall-regex@npm:7.22.5" dependencies: @@ -1001,15 +984,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-dynamic-import@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-dynamic-import@npm:7.22.5" +"@babel/plugin-transform-dynamic-import@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-dynamic-import@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-dynamic-import": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 186a6d59f36eb3c5824739fc9c22ed0f4ca68e001662aa3a302634346a8b785cb9579b23b0c158f4570604d697d19598ca09b58c60a7fa2894da1163c4eb1907 + checksum: 78fc9c532210bf9e8f231747f542318568ac360ee6c27e80853962c984283c73da3f8f8aebe83c2096090a435b356b092ed85de617a156cbe0729d847632be45 languageName: node linkType: hard @@ -1025,26 +1008,26 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-export-namespace-from@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-export-namespace-from@npm:7.22.5" +"@babel/plugin-transform-export-namespace-from@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-export-namespace-from@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-export-namespace-from": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3d197b788758044983c96b9c49bed4b456055f35a388521a405968db0f6e2ffb6fd59110e3931f4dcc5e126ae9e5e00e154a0afb47a7ea359d8d0dea79f480d7 + checksum: 73af5883a321ed56a4bfd43c8a7de0164faebe619287706896fc6ee2f7a4e69042adaa1338c0b8b4bdb9f7e5fdceb016fb1d40694cb43ca3b8827429e8aac4bf languageName: node linkType: hard -"@babel/plugin-transform-for-of@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-for-of@npm:7.22.5" +"@babel/plugin-transform-for-of@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-for-of@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d7b8d4db010bce7273674caa95c4e6abd909362866ce297e86a2ecaa9ae636e05d525415811db9b3c942155df7f3651d19b91dd6c41f142f7308a97c7cb06023 + checksum: f395ae7bce31e14961460f56cf751b5d6e37dd27d7df5b1f4e49fec1c11b6f9cf71991c7ffbe6549878591e87df0d66af798cf26edfa4bfa6b4c3dba1fb2f73a languageName: node linkType: hard @@ -1061,15 +1044,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-json-strings@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-json-strings@npm:7.22.5" +"@babel/plugin-transform-json-strings@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-json-strings@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-json-strings": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4e00b902487a670b6c8948f33f9108133fd745cf9d1478aca515fb460b9b2f12e137988ebc1663630fb82070a870aed8b0c1aa4d007a841c18004619798f255c + checksum: 50665e5979e66358c50e90a26db53c55917f78175127ac2fa05c7888d156d418ffb930ec0a109353db0a7c5f57c756ce01bfc9825d24cbfd2b3ec453f2ed8cba languageName: node linkType: hard @@ -1084,15 +1067,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.5" +"@babel/plugin-transform-logical-assignment-operators@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-logical-assignment-operators@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-logical-assignment-operators": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 18748e953c08f64885f18c224eac58df10a13eac4d845d16b5d9b6276907da7ca2530dfebe6ed41cdc5f8a75d9db3e36d8eb54ddce7cd0364af1cab09b435302 + checksum: c664e9798e85afa7f92f07b867682dee7392046181d82f5d21bae6f2ca26dfe9c8375cdc52b7483c3fc09a983c1989f60eff9fbc4f373b0c0a74090553d05739 languageName: node linkType: hard @@ -1107,42 +1090,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-modules-amd@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-amd@npm:7.22.5" +"@babel/plugin-transform-modules-amd@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-modules-amd@npm:7.23.0" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.0 "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7da4c4ebbbcf7d182abb59b2046b22d86eee340caf8a22a39ef6a727da2d8acfec1f714fcdcd5054110b280e4934f735e80a6848d192b6834c5d4459a014f04d + checksum: 5d92875170a37b8282d4bcd805f55829b8fab0f9c8d08b53d32a7a0bfdc62b868e489b52d329ae768ecafc0c993eed0ad7a387baa673ac33211390a9f833ab5d languageName: node linkType: hard -"@babel/plugin-transform-modules-commonjs@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-commonjs@npm:7.22.5" +"@babel/plugin-transform-modules-commonjs@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-modules-commonjs@npm:7.23.0" dependencies: - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.0 "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-simple-access": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 2067aca8f6454d54ffcce69b02c457cfa61428e11372f6a1d99ff4fcfbb55c396ed2ca6ca886bf06c852e38c1a205b8095921b2364fd0243f3e66bc1dda61caa + checksum: 7fb25997194053e167c4207c319ff05362392da841bd9f42ddb3caf9c8798a5d203bd926d23ddf5830fdf05eddc82c2810f40d1287e3a4f80b07eff13d1024b5 languageName: node linkType: hard -"@babel/plugin-transform-modules-systemjs@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-modules-systemjs@npm:7.22.5" +"@babel/plugin-transform-modules-systemjs@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-modules-systemjs@npm:7.23.0" dependencies: "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-module-transforms": ^7.22.5 + "@babel/helper-module-transforms": ^7.23.0 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 04f4178589543396b3c24330a67a59c5e69af5e96119c9adda730c0f20122deaff54671ebbc72ad2df6495a5db8a758bd96942de95fba7ad427de9c80b1b38c8 + checksum: 2d481458b22605046badea2317d5cc5c94ac3031c2293e34c96f02063f5b02af0979c4da6a8fbc67cc249541575dc9c6d710db6b919ede70b7337a22d9fd57a7 languageName: node linkType: hard @@ -1181,42 +1164,42 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.22.5" +"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-nullish-coalescing-operator": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: e6a059169d257fc61322d0708edae423072449b7c33de396261e68dee582aec5396789a1c22bce84e5bd88a169623c2e750b513fc222930979e6accd52a44bf2 + checksum: 167babecc8b8fe70796a7b7d34af667ebbf43da166c21689502e5e8cc93180b7a85979c77c9f64b7cce431b36718bd0a6df9e5e0ffea4ae22afb22cfef886372 languageName: node linkType: hard -"@babel/plugin-transform-numeric-separator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-numeric-separator@npm:7.22.5" +"@babel/plugin-transform-numeric-separator@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-numeric-separator@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-numeric-separator": ^7.10.4 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9e7837d4eae04f211ebaa034fe5003d2927b6bf6d5b9dc09f2b1183c01482cdde5a75b8bd5c7ff195c2abc7b923339eb0b2a9d27cb78359d38248a3b2c2367c4 + checksum: af064d06a4a041767ec396a5f258103f64785df290e038bba9f0ef454e6c914f2ac45d862bbdad8fac2c7ad47fa4e95356f29053c60c100a0160b02a995fe2a3 languageName: node linkType: hard -"@babel/plugin-transform-object-rest-spread@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-object-rest-spread@npm:7.22.5" +"@babel/plugin-transform-object-rest-spread@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-object-rest-spread@npm:7.22.15" dependencies: - "@babel/compat-data": ^7.22.5 - "@babel/helper-compilation-targets": ^7.22.5 + "@babel/compat-data": ^7.22.9 + "@babel/helper-compilation-targets": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-object-rest-spread": ^7.8.3 - "@babel/plugin-transform-parameters": ^7.22.5 + "@babel/plugin-transform-parameters": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 3b5e091f0dc67108f2e41ed5a97e15bbe4381a19d9a7eea80b71c7de1d8169fd28784e1e41a3d2ad12709ab212e58fc481282a5bb65d591fae7b443048de3330 + checksum: 62197a6f12289c1c1bd57f3bed9f0f765ca32390bfe91e0b5561dd94dd9770f4480c4162dec98da094bc0ba99d2c2ebba68de47c019454041b0b7a68ba2ec66d languageName: node linkType: hard @@ -1232,39 +1215,39 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-optional-catch-binding@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.22.5" +"@babel/plugin-transform-optional-catch-binding@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-optional-catch-binding@npm:7.22.11" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-optional-catch-binding": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b0e8b4233ff06b5c9d285257f49c5bd441f883189b24282e6200f9ebdf5db29aeeebbffae57fbbcd5df9f4387b3e66e5d322aaae5652a78e89685ddbae46bbd1 + checksum: f17abd90e1de67c84d63afea29c8021c74abb2794d3a6eeafb0bbe7372d3db32aefca386e392116ec63884537a4a2815d090d26264d259bacc08f6e3ed05294c languageName: node linkType: hard -"@babel/plugin-transform-optional-chaining@npm:^7.22.5, @babel/plugin-transform-optional-chaining@npm:^7.22.6": - version: 7.22.6 - resolution: "@babel/plugin-transform-optional-chaining@npm:7.22.6" +"@babel/plugin-transform-optional-chaining@npm:^7.22.15, @babel/plugin-transform-optional-chaining@npm:^7.23.0": + version: 7.23.0 + resolution: "@babel/plugin-transform-optional-chaining@npm:7.23.0" dependencies: "@babel/helper-plugin-utils": ^7.22.5 "@babel/helper-skip-transparent-expression-wrappers": ^7.22.5 "@babel/plugin-syntax-optional-chaining": ^7.8.3 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9713f7920ed04090c149fc5ec024dd1638e8b97aa4ae3753b93072d84103b8de380afb96d6cf03e53b285420db4f705f3ac13149c6fd54f322b61dc19e33c54f + checksum: f702634f2b97e5260dbec0d4bde05ccb6f4d96d7bfa946481aeacfa205ca846cb6e096a38312f9d51fdbdac1f258f211138c5f7075952e46a5bf8574de6a1329 languageName: node linkType: hard -"@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-parameters@npm:7.22.5" +"@babel/plugin-transform-parameters@npm:^7.12.1, @babel/plugin-transform-parameters@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-parameters@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b44f89cf97daf23903776ba27c2ab13b439d80d8c8a95be5c476ab65023b1e0c0e94c28d3745f3b60a58edc4e590fa0cd4287a0293e51401ca7d29a2ddb13b8e + checksum: 541188bb7d1876cad87687b5c7daf90f63d8208ae83df24acb1e2b05020ad1c78786b2723ca4054a83fcb74fb6509f30c4cacc5b538ee684224261ad5fb047c1 languageName: node linkType: hard @@ -1280,17 +1263,17 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-private-property-in-object@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-private-property-in-object@npm:7.22.5" +"@babel/plugin-transform-private-property-in-object@npm:^7.22.11": + version: 7.22.11 + resolution: "@babel/plugin-transform-private-property-in-object@npm:7.22.11" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.11 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-private-property-in-object": ^7.14.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 9ac019fb2772f3af6278a7f4b8b14b0663accb3fd123d87142ceb2fbc57fd1afa07c945d1329029b026b9ee122096ef71a3f34f257a9e04cf4245b87298c38b4 + checksum: 4d029d84901e53c46dead7a46e2990a7bc62470f4e4ca58a0d063394f86652fd58fe4eea1eb941da3669cd536b559b9d058b342b59300026346b7a2a51badac8 languageName: node linkType: hard @@ -1338,18 +1321,18 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx@npm:7.22.5" +"@babel/plugin-transform-react-jsx@npm:^7.22.15, @babel/plugin-transform-react-jsx@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/plugin-transform-react-jsx@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-jsx": ^7.22.5 - "@babel/types": ^7.22.5 + "@babel/types": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: c8f93f29f32cf79683ca2b8958fd62f38155674846ef27a7d4b6fbeb8713c37257418391731b58ff8024ec37b888bed5960e615a3f552e28245d2082e7f2a2df + checksum: 3899054e89550c3a0ef041af7c47ee266e2e934f498ee80fefeda778a6aa177b48aa8b4d2a8bf5848de977fec564571699ab952d9fa089c4c19b45ddb121df09 languageName: node linkType: hard @@ -1365,15 +1348,15 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-regenerator@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-regenerator@npm:7.22.5" +"@babel/plugin-transform-regenerator@npm:^7.22.10": + version: 7.22.10 + resolution: "@babel/plugin-transform-regenerator@npm:7.22.10" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - regenerator-transform: ^0.15.1 + regenerator-transform: ^0.15.2 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f7c5ca5151321963df777cc02725d10d1ccc3b3b8323da0423aecd9ac6144cbdd2274af5281a5580db2fc2f8b234e318517b5d76b85669118906533a559f2b6a + checksum: e13678d62d6fa96f11cb8b863f00e8693491e7adc88bfca3f2820f80cbac8336e7dec3a596eee6a1c4663b7ececc3564f2cd7fb44ed6d4ce84ac2bb7f39ecc6e languageName: node linkType: hard @@ -1389,18 +1372,18 @@ __metadata: linkType: hard "@babel/plugin-transform-runtime@npm:^7.18.6": - version: 7.22.7 - resolution: "@babel/plugin-transform-runtime@npm:7.22.7" + version: 7.23.2 + resolution: "@babel/plugin-transform-runtime@npm:7.23.2" dependencies: - "@babel/helper-module-imports": ^7.22.5 + "@babel/helper-module-imports": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 - babel-plugin-polyfill-corejs2: ^0.4.4 - babel-plugin-polyfill-corejs3: ^0.8.2 - babel-plugin-polyfill-regenerator: ^0.5.1 + babel-plugin-polyfill-corejs2: ^0.4.6 + babel-plugin-polyfill-corejs3: ^0.8.5 + babel-plugin-polyfill-regenerator: ^0.5.3 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 1b41c44d5c44c98df3885b4f541c4edbef507bbdb1c889eed9878d9aabb29b6f589192ae712454c20ced22c79cfb2911403023daf03d20902434a258632d4773 + checksum: 09f4273bfe9600c67e72e26f853f11c24ee4c1cbb3935c4a28a94d388e7c0d8733479d868c333cb34e9c236f1765788c6daef7852331f5c70a3b5543fd0247a1 languageName: node linkType: hard @@ -1460,28 +1443,28 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-typescript@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-typescript@npm:7.22.5" +"@babel/plugin-transform-typescript@npm:^7.22.15": + version: 7.22.15 + resolution: "@babel/plugin-transform-typescript@npm:7.22.15" dependencies: "@babel/helper-annotate-as-pure": ^7.22.5 - "@babel/helper-create-class-features-plugin": ^7.22.5 + "@babel/helper-create-class-features-plugin": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 "@babel/plugin-syntax-typescript": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: d12f1ca1ef1f2a54432eb044d2999705d1205ebe211c2a7f05b12e8eb2d2a461fd7657b5486b2f2f1efe7c0c0dc8e80725b767073d40fe4ae059a7af057b05e4 + checksum: c5d96cdbf0e1512707aa1c1e3ac6b370a25fd9c545d26008ce44eb13a47bd7fd67a1eb799c98b5ccc82e33a345fda55c0055e1fe3ed97646ed405dd13020b226 languageName: node linkType: hard -"@babel/plugin-transform-unicode-escapes@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.5" +"@babel/plugin-transform-unicode-escapes@npm:^7.22.10": + version: 7.22.10 + resolution: "@babel/plugin-transform-unicode-escapes@npm:7.22.10" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: da5e85ab3bb33a75cbf6181bfd236b208dc934702fd304db127232f17b4e0f42c6d3f238de8589470b4190906967eea8ca27adf3ae9d8ee4de2a2eae906ed186 + checksum: 807f40ed1324c8cb107c45358f1903384ca3f0ef1d01c5a3c5c9b271c8d8eec66936a3dcc8d75ddfceea9421420368c2e77ae3adef0a50557e778dfe296bf382 languageName: node linkType: hard @@ -1522,15 +1505,15 @@ __metadata: linkType: hard "@babel/preset-env@npm:^7.18.6, @babel/preset-env@npm:^7.19.4": - version: 7.22.7 - resolution: "@babel/preset-env@npm:7.22.7" + version: 7.23.2 + resolution: "@babel/preset-env@npm:7.23.2" dependencies: - "@babel/compat-data": ^7.22.6 - "@babel/helper-compilation-targets": ^7.22.6 + "@babel/compat-data": ^7.23.2 + "@babel/helper-compilation-targets": ^7.22.15 "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.22.5 - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": ^7.22.15 + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": ^7.22.15 "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2 "@babel/plugin-syntax-async-generators": ^7.8.4 "@babel/plugin-syntax-class-properties": ^7.12.13 @@ -1551,109 +1534,107 @@ __metadata: "@babel/plugin-syntax-top-level-await": ^7.14.5 "@babel/plugin-syntax-unicode-sets-regex": ^7.18.6 "@babel/plugin-transform-arrow-functions": ^7.22.5 - "@babel/plugin-transform-async-generator-functions": ^7.22.7 + "@babel/plugin-transform-async-generator-functions": ^7.23.2 "@babel/plugin-transform-async-to-generator": ^7.22.5 "@babel/plugin-transform-block-scoped-functions": ^7.22.5 - "@babel/plugin-transform-block-scoping": ^7.22.5 + "@babel/plugin-transform-block-scoping": ^7.23.0 "@babel/plugin-transform-class-properties": ^7.22.5 - "@babel/plugin-transform-class-static-block": ^7.22.5 - "@babel/plugin-transform-classes": ^7.22.6 + "@babel/plugin-transform-class-static-block": ^7.22.11 + "@babel/plugin-transform-classes": ^7.22.15 "@babel/plugin-transform-computed-properties": ^7.22.5 - "@babel/plugin-transform-destructuring": ^7.22.5 + "@babel/plugin-transform-destructuring": ^7.23.0 "@babel/plugin-transform-dotall-regex": ^7.22.5 "@babel/plugin-transform-duplicate-keys": ^7.22.5 - "@babel/plugin-transform-dynamic-import": ^7.22.5 + "@babel/plugin-transform-dynamic-import": ^7.22.11 "@babel/plugin-transform-exponentiation-operator": ^7.22.5 - "@babel/plugin-transform-export-namespace-from": ^7.22.5 - "@babel/plugin-transform-for-of": ^7.22.5 + "@babel/plugin-transform-export-namespace-from": ^7.22.11 + "@babel/plugin-transform-for-of": ^7.22.15 "@babel/plugin-transform-function-name": ^7.22.5 - "@babel/plugin-transform-json-strings": ^7.22.5 + "@babel/plugin-transform-json-strings": ^7.22.11 "@babel/plugin-transform-literals": ^7.22.5 - "@babel/plugin-transform-logical-assignment-operators": ^7.22.5 + "@babel/plugin-transform-logical-assignment-operators": ^7.22.11 "@babel/plugin-transform-member-expression-literals": ^7.22.5 - "@babel/plugin-transform-modules-amd": ^7.22.5 - "@babel/plugin-transform-modules-commonjs": ^7.22.5 - "@babel/plugin-transform-modules-systemjs": ^7.22.5 + "@babel/plugin-transform-modules-amd": ^7.23.0 + "@babel/plugin-transform-modules-commonjs": ^7.23.0 + "@babel/plugin-transform-modules-systemjs": ^7.23.0 "@babel/plugin-transform-modules-umd": ^7.22.5 "@babel/plugin-transform-named-capturing-groups-regex": ^7.22.5 "@babel/plugin-transform-new-target": ^7.22.5 - "@babel/plugin-transform-nullish-coalescing-operator": ^7.22.5 - "@babel/plugin-transform-numeric-separator": ^7.22.5 - "@babel/plugin-transform-object-rest-spread": ^7.22.5 + "@babel/plugin-transform-nullish-coalescing-operator": ^7.22.11 + "@babel/plugin-transform-numeric-separator": ^7.22.11 + "@babel/plugin-transform-object-rest-spread": ^7.22.15 "@babel/plugin-transform-object-super": ^7.22.5 - "@babel/plugin-transform-optional-catch-binding": ^7.22.5 - "@babel/plugin-transform-optional-chaining": ^7.22.6 - "@babel/plugin-transform-parameters": ^7.22.5 + "@babel/plugin-transform-optional-catch-binding": ^7.22.11 + "@babel/plugin-transform-optional-chaining": ^7.23.0 + "@babel/plugin-transform-parameters": ^7.22.15 "@babel/plugin-transform-private-methods": ^7.22.5 - "@babel/plugin-transform-private-property-in-object": ^7.22.5 + "@babel/plugin-transform-private-property-in-object": ^7.22.11 "@babel/plugin-transform-property-literals": ^7.22.5 - "@babel/plugin-transform-regenerator": ^7.22.5 + "@babel/plugin-transform-regenerator": ^7.22.10 "@babel/plugin-transform-reserved-words": ^7.22.5 "@babel/plugin-transform-shorthand-properties": ^7.22.5 "@babel/plugin-transform-spread": ^7.22.5 "@babel/plugin-transform-sticky-regex": ^7.22.5 "@babel/plugin-transform-template-literals": ^7.22.5 "@babel/plugin-transform-typeof-symbol": ^7.22.5 - "@babel/plugin-transform-unicode-escapes": ^7.22.5 + "@babel/plugin-transform-unicode-escapes": ^7.22.10 "@babel/plugin-transform-unicode-property-regex": ^7.22.5 "@babel/plugin-transform-unicode-regex": ^7.22.5 "@babel/plugin-transform-unicode-sets-regex": ^7.22.5 - "@babel/preset-modules": ^0.1.5 - "@babel/types": ^7.22.5 - "@nicolo-ribaudo/semver-v6": ^6.3.3 - babel-plugin-polyfill-corejs2: ^0.4.4 - babel-plugin-polyfill-corejs3: ^0.8.2 - babel-plugin-polyfill-regenerator: ^0.5.1 + "@babel/preset-modules": 0.1.6-no-external-plugins + "@babel/types": ^7.23.0 + babel-plugin-polyfill-corejs2: ^0.4.6 + babel-plugin-polyfill-corejs3: ^0.8.5 + babel-plugin-polyfill-regenerator: ^0.5.3 core-js-compat: ^3.31.0 + semver: ^6.3.1 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: eabde70e450dd54f57997b0f92317f69f268e9a1f85b13f5ef5540d2a38cfae5620bd8e48ddffb547c55fbd2f17673276e6eb9411d6b5fb82e3422faf44cb6cf + checksum: 49327ef584b529b56aedd6577937b80c0d89603c68b23795495a13af04b5aa008db9ad04cd280423600cdc0d3cce13ae9d0d9a977db5c8193697b20ced8a10b2 languageName: node linkType: hard -"@babel/preset-modules@npm:^0.1.5": - version: 0.1.5 - resolution: "@babel/preset-modules@npm:0.1.5" +"@babel/preset-modules@npm:0.1.6-no-external-plugins": + version: 0.1.6-no-external-plugins + resolution: "@babel/preset-modules@npm:0.1.6-no-external-plugins" dependencies: "@babel/helper-plugin-utils": ^7.0.0 - "@babel/plugin-proposal-unicode-property-regex": ^7.4.4 - "@babel/plugin-transform-dotall-regex": ^7.4.4 "@babel/types": ^7.4.4 esutils: ^2.0.2 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 8430e0e9e9d520b53e22e8c4c6a5a080a12b63af6eabe559c2310b187bd62ae113f3da82ba33e9d1d0f3230930ca702843aae9dd226dec51f7d7114dc1f51c10 + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + checksum: 4855e799bc50f2449fb5210f78ea9e8fd46cf4f242243f1e2ed838e2bd702e25e73e822e7f8447722a5f4baa5e67a8f7a0e403f3e7ce04540ff743a9c411c375 languageName: node linkType: hard "@babel/preset-react@npm:^7.18.6": - version: 7.22.5 - resolution: "@babel/preset-react@npm:7.22.5" + version: 7.22.15 + resolution: "@babel/preset-react@npm:7.22.15" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 "@babel/plugin-transform-react-display-name": ^7.22.5 - "@babel/plugin-transform-react-jsx": ^7.22.5 + "@babel/plugin-transform-react-jsx": ^7.22.15 "@babel/plugin-transform-react-jsx-development": ^7.22.5 "@babel/plugin-transform-react-pure-annotations": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: b977c7ee83e93f62d77e61929ca3d97e5291e026e2f025a1b8b7ac9186486ed56c7d5bc36f0becabe0c24e8c42a4e4f2243a3cf841384cfafc3204c5d3e6c619 + checksum: c3ef99dfa2e9f57d2e08603e883aa20f47630a826c8e413888a93ae6e0084b5016871e463829be125329d40a1ba0a89f7c43d77b6dab52083c225cb43e63d10e languageName: node linkType: hard "@babel/preset-typescript@npm:^7.18.6": - version: 7.22.5 - resolution: "@babel/preset-typescript@npm:7.22.5" + version: 7.23.2 + resolution: "@babel/preset-typescript@npm:7.23.2" dependencies: "@babel/helper-plugin-utils": ^7.22.5 - "@babel/helper-validator-option": ^7.22.5 + "@babel/helper-validator-option": ^7.22.15 "@babel/plugin-syntax-jsx": ^7.22.5 - "@babel/plugin-transform-modules-commonjs": ^7.22.5 - "@babel/plugin-transform-typescript": ^7.22.5 + "@babel/plugin-transform-modules-commonjs": ^7.23.0 + "@babel/plugin-transform-typescript": ^7.22.15 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 7be1670cb4404797d3a473bd72d66eb2b3e0f2f8a672a5e40bdb0812cc66085ec84bcd7b896709764cabf042fdc6b7f2d4755ac7cce10515eb596ff61dab5154 + checksum: c4b065c90e7f085dd7a0e57032983ac230c7ffd1d616e4c2b66581e765d5befc9271495f33250bf1cf9b4d436239c8ca3b19ada9f6c419c70bdab2cf6c868f9f languageName: node linkType: hard @@ -1665,61 +1646,68 @@ __metadata: linkType: hard "@babel/runtime-corejs3@npm:^7.18.6": - version: 7.22.6 - resolution: "@babel/runtime-corejs3@npm:7.22.6" + version: 7.23.2 + resolution: "@babel/runtime-corejs3@npm:7.23.2" dependencies: core-js-pure: ^3.30.2 - regenerator-runtime: ^0.13.11 - checksum: 4e1ab78cdb797fe82668df0fcb8c2dccb6c4b12787b07536c4457952c49ff06465a9304b2cff7a31d7e21af6e57008a84ccb0c9886b6aa9cbf4b446c3a8c05e5 + regenerator-runtime: ^0.14.0 + checksum: 922f25c47996a8af604cea82441e41be8b11910e96c662511e54120078f4c64258c045a28a311467a8f14a0c17f46a1f057f7c0501e567869a4343a6ce017962 languageName: node linkType: hard "@babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.3, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.6, @babel/runtime@npm:^7.20.13, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.8.4": - version: 7.22.6 - resolution: "@babel/runtime@npm:7.22.6" + version: 7.23.2 + resolution: "@babel/runtime@npm:7.23.2" dependencies: - regenerator-runtime: ^0.13.11 - checksum: e585338287c4514a713babf4fdb8fc2a67adcebab3e7723a739fc62c79cfda875b314c90fd25f827afb150d781af97bc16c85bfdbfa2889f06053879a1ddb597 + regenerator-runtime: ^0.14.0 + checksum: 6c4df4839ec75ca10175f636d6362f91df8a3137f86b38f6cd3a4c90668a0fe8e9281d320958f4fbd43b394988958585a17c3aab2a4ea6bf7316b22916a371fb languageName: node linkType: hard -"@babel/template@npm:^7.12.7, @babel/template@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/template@npm:7.22.5" +"@babel/template@npm:^7.12.7, @babel/template@npm:^7.22.15, @babel/template@npm:^7.22.5": + version: 7.22.15 + resolution: "@babel/template@npm:7.22.15" dependencies: - "@babel/code-frame": ^7.22.5 - "@babel/parser": ^7.22.5 - "@babel/types": ^7.22.5 - checksum: c5746410164039aca61829cdb42e9a55410f43cace6f51ca443313f3d0bdfa9a5a330d0b0df73dc17ef885c72104234ae05efede37c1cc8a72dc9f93425977a3 + "@babel/code-frame": ^7.22.13 + "@babel/parser": ^7.22.15 + "@babel/types": ^7.22.15 + checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd languageName: node linkType: hard -"@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.22.5, @babel/traverse@npm:^7.22.6, @babel/traverse@npm:^7.22.8": - version: 7.22.8 - resolution: "@babel/traverse@npm:7.22.8" +"@babel/traverse@npm:^7.12.9, @babel/traverse@npm:^7.18.8, @babel/traverse@npm:^7.23.2": + version: 7.23.2 + resolution: "@babel/traverse@npm:7.23.2" dependencies: - "@babel/code-frame": ^7.22.5 - "@babel/generator": ^7.22.7 - "@babel/helper-environment-visitor": ^7.22.5 - "@babel/helper-function-name": ^7.22.5 + "@babel/code-frame": ^7.22.13 + "@babel/generator": ^7.23.0 + "@babel/helper-environment-visitor": ^7.22.20 + "@babel/helper-function-name": ^7.23.0 "@babel/helper-hoist-variables": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.22.7 - "@babel/types": ^7.22.5 + "@babel/parser": ^7.23.0 + "@babel/types": ^7.23.0 debug: ^4.1.0 globals: ^11.1.0 - checksum: a381369bc3eedfd13ed5fef7b884657f1c29024ea7388198149f0edc34bd69ce3966e9f40188d15f56490a5e12ba250ccc485f2882b53d41b054fccefb233e33 + checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d languageName: node linkType: hard -"@babel/types@npm:^7.12.7, @babel/types@npm:^7.20.0, @babel/types@npm:^7.22.5, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/types@npm:7.22.5" +"@babel/types@npm:^7.12.7, @babel/types@npm:^7.20.0, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": + version: 7.23.0 + resolution: "@babel/types@npm:7.23.0" dependencies: "@babel/helper-string-parser": ^7.22.5 - "@babel/helper-validator-identifier": ^7.22.5 + "@babel/helper-validator-identifier": ^7.22.20 to-fast-properties: ^2.0.0 - checksum: c13a9c1dc7d2d1a241a2f8363540cb9af1d66e978e8984b400a20c4f38ba38ca29f06e26a0f2d49a70bad9e57615dac09c35accfddf1bb90d23cd3e0a0bab892 + checksum: 215fe04bd7feef79eeb4d33374b39909ce9cad1611c4135a4f7fdf41fe3280594105af6d7094354751514625ea92d0875aba355f53e86a92600f290e77b0e604 + languageName: node + linkType: hard + +"@braintree/sanitize-url@npm:^6.0.0": + version: 6.0.4 + resolution: "@braintree/sanitize-url@npm:6.0.4" + checksum: f5ec6048973722ea1c46ae555d2e9eb848d7fa258994f8ea7d6db9514ee754ea3ef344ef71b3696d486776bcb839f3124e79f67c6b5b2814ed2da220b340627c languageName: node linkType: hard @@ -1737,25 +1725,26 @@ __metadata: languageName: node linkType: hard -"@docsearch/css@npm:3.5.1": - version: 3.5.1 - resolution: "@docsearch/css@npm:3.5.1" - checksum: ce84aaf2b7ab653a0512869e7398ea92cd20976d63499c5200afdfe8dec2205371c77ee6d529bbad25767594f5cf89854907372560d506154947ff21ef901434 +"@docsearch/css@npm:3.5.2": + version: 3.5.2 + resolution: "@docsearch/css@npm:3.5.2" + checksum: d1d60dd230dd48f896755f21bd20b59583ba844212d7d336953ae48d389baaf868bdf83320fb734a4ed679c3f95b15d620cf3764cd538f6941cae239f8c9d35d languageName: node linkType: hard "@docsearch/react@npm:^3.1.1": - version: 3.5.1 - resolution: "@docsearch/react@npm:3.5.1" + version: 3.5.2 + resolution: "@docsearch/react@npm:3.5.2" dependencies: "@algolia/autocomplete-core": 1.9.3 "@algolia/autocomplete-preset-algolia": 1.9.3 - "@docsearch/css": 3.5.1 - algoliasearch: ^4.0.0 + "@docsearch/css": 3.5.2 + algoliasearch: ^4.19.1 peerDependencies: "@types/react": ">= 16.8.0 < 19.0.0" react: ">= 16.8.0 < 19.0.0" react-dom: ">= 16.8.0 < 19.0.0" + search-insights: ">= 1 < 3" peerDependenciesMeta: "@types/react": optional: true @@ -1763,13 +1752,15 @@ __metadata: optional: true react-dom: optional: true - checksum: 560ff968861820586c84f28df76c3caf5c137b60cb1434c54af87b7fda04b32c38bcc0211f88f0c153e650c8857d5a9d8373556be0bbb3accaf4e3f3b51a22a1 + search-insights: + optional: true + checksum: 4b4584c2c73fc18cbd599047538896450974e134c2c74f19eb202db0ce8e6c3c49c6f65ed6ade61c796d476d3cbb55d6be58df62bc9568a0c72d88e42fca1d16 languageName: node linkType: hard -"@docusaurus/core@npm:2.4.1, @docusaurus/core@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/core@npm:2.4.1" +"@docusaurus/core@npm:2.4.3, @docusaurus/core@npm:^2.4.1": + version: 2.4.3 + resolution: "@docusaurus/core@npm:2.4.3" dependencies: "@babel/core": ^7.18.6 "@babel/generator": ^7.18.7 @@ -1781,13 +1772,13 @@ __metadata: "@babel/runtime": ^7.18.6 "@babel/runtime-corejs3": ^7.18.6 "@babel/traverse": ^7.18.8 - "@docusaurus/cssnano-preset": 2.4.1 - "@docusaurus/logger": 2.4.1 - "@docusaurus/mdx-loader": 2.4.1 + "@docusaurus/cssnano-preset": 2.4.3 + "@docusaurus/logger": 2.4.3 + "@docusaurus/mdx-loader": 2.4.3 "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-common": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-common": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 "@slorber/static-site-generator-webpack-plugin": ^4.0.7 "@svgr/webpack": ^6.2.1 autoprefixer: ^10.4.7 @@ -1847,52 +1838,52 @@ __metadata: react-dom: ^16.8.4 || ^17.0.0 bin: docusaurus: bin/docusaurus.mjs - checksum: 40c887ef662f7679d803695d4193268c2c177c6d4e13b43b56cc519322522a1608b4bfc4999f6355be778ca7a0256f0d27ab18a19b352a9da1aed66e2644dc82 + checksum: cce7173ee131364857c16f70f94155ba0e1b044cde54045fb0cf62ad138f8d8ef093f5aba7c7617a9aa0545b3ee3930aec2e09f645daec015696968338963013 languageName: node linkType: hard -"@docusaurus/cssnano-preset@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/cssnano-preset@npm:2.4.1" +"@docusaurus/cssnano-preset@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/cssnano-preset@npm:2.4.3" dependencies: cssnano-preset-advanced: ^5.3.8 postcss: ^8.4.14 postcss-sort-media-queries: ^4.2.1 tslib: ^2.4.0 - checksum: d498345981288af2dcb8650bed3c3361cfe336541a8bda65743fbe8ee5746e81e723ba086e2e6249c3b283f4bc50b5c81cff15b0406969cd610bed345b3804ac + checksum: f4a4c60b075c23541da90e00ae26af2e7eaadf20d783b37b9110a5e34599e4e91947425e33bad58ba71abee81c85cca99f5d7d76575f53fbaf73617b55e39c62 languageName: node linkType: hard -"@docusaurus/eslint-plugin@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/eslint-plugin@npm:2.4.1" +"@docusaurus/eslint-plugin@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/eslint-plugin@npm:2.4.3" dependencies: "@typescript-eslint/utils": ^5.30.5 tslib: ^2.4.0 peerDependencies: eslint: ">=6" - checksum: 231a81eb01a8dfe1cba0d837567b4a2c100cb80f8bb1bef6dc0136b896c0cbbbf3325f58b11e77a0f36a872eb86c53d883a715e042342fd3d3687c824d9671af + checksum: c2ff2083b96e08aeca05b63168149f5a0aa154387a70e6fd2f9db7baf4feb3c39f471f8b182c9a12927b9ee7026bc494d4b95921f5b6d98ff176e624f1e1dad2 languageName: node linkType: hard -"@docusaurus/logger@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/logger@npm:2.4.1" +"@docusaurus/logger@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/logger@npm:2.4.3" dependencies: chalk: ^4.1.2 tslib: ^2.4.0 - checksum: be81840f2df477ab633d8ced6fd3a512582e764a48d66b1c12bb20b5d4c717f349e254e33b00b9b53381dbdb24a3e3d0ca9b19511366244b3620fa19cc4c69dc + checksum: f026a8233aa317f16ce5b25c6785a431f319c52fc07a1b9e26f4b3df2197974e75830a16b6140314f8f4ef02dc19242106ec2ae1599740b26d516cc34c56102f languageName: node linkType: hard -"@docusaurus/mdx-loader@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/mdx-loader@npm:2.4.1" +"@docusaurus/mdx-loader@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/mdx-loader@npm:2.4.3" dependencies: "@babel/parser": ^7.18.8 "@babel/traverse": ^7.18.8 - "@docusaurus/logger": 2.4.1 - "@docusaurus/utils": 2.4.1 + "@docusaurus/logger": 2.4.3 + "@docusaurus/utils": 2.4.3 "@mdx-js/mdx": ^1.6.22 escape-html: ^1.0.3 file-loader: ^6.2.0 @@ -1909,16 +1900,16 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: cf36bbde228a058869dfd770a85f130035a54e563b957a3cfc3191d06efdcfc272bb51b51e6225a0246b233e5d7d0ca1cb4df4b700b837aa72bbb0c9f6f6f5bd + checksum: 5a774f7ea5f484e888b2bd1bf8b182279e3788afec779eb8920cf468b92ab8d83a1ae8be51925074241a4d1a38d989cfb366d2baf0f67ed6f063342395a7ca8e languageName: node linkType: hard -"@docusaurus/module-type-aliases@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/module-type-aliases@npm:2.4.1" +"@docusaurus/module-type-aliases@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/module-type-aliases@npm:2.4.3" dependencies: "@docusaurus/react-loadable": 5.5.2 - "@docusaurus/types": 2.4.1 + "@docusaurus/types": 2.4.3 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" @@ -1928,19 +1919,19 @@ __metadata: peerDependencies: react: "*" react-dom: "*" - checksum: 9e328c7bc5cd40b399550995edbeeea5ce88be7eb75f4c49499e8fd05a8bbabf180dce4d1cae0185721629fc6e0f2e8fc513e3ce846080f9771f7a9bc1c45ba8 + checksum: 22ce1a6a20acc35cdd2ec57e55f29e65dbe0fb3a46aaa8c033ec78bf04cd3087f0523c816c744ed311095512dd686c83e0a8619cc1a2a937c27cd54527739c38 languageName: node linkType: hard -"@docusaurus/plugin-client-redirects@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-client-redirects@npm:2.4.1" +"@docusaurus/plugin-client-redirects@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/plugin-client-redirects@npm:2.4.3" dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/logger": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-common": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/logger": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-common": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 eta: ^2.0.0 fs-extra: ^10.1.0 lodash: ^4.17.21 @@ -1948,21 +1939,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 0b6d30dd8afebc116fd88505e36fbe6b3b64aa49ef7d247a92bb793676a93f3b998abef3229117cb03162cdb94ed1f874977db8423cb8188e35e11514d8a1e0f + checksum: f039f89ad2658524819543ff4a370e409053bfd3b4851be82c3cceb6fcd39e954a1ca3bfd13e99fbd1f7fbb9cd69ed28545a852c8dbca2e8300eec23586767a4 languageName: node linkType: hard -"@docusaurus/plugin-content-blog@npm:2.4.1, @docusaurus/plugin-content-blog@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-content-blog@npm:2.4.1" - dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/logger": 2.4.1 - "@docusaurus/mdx-loader": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-common": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 +"@docusaurus/plugin-content-blog@npm:2.4.3, @docusaurus/plugin-content-blog@npm:^2.4.1": + version: 2.4.3 + resolution: "@docusaurus/plugin-content-blog@npm:2.4.3" + dependencies: + "@docusaurus/core": 2.4.3 + "@docusaurus/logger": 2.4.3 + "@docusaurus/mdx-loader": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-common": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 cheerio: ^1.0.0-rc.12 feed: ^4.2.2 fs-extra: ^10.1.0 @@ -1975,21 +1966,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 9d4e543b70d032d7edf0c986c45f36a088db76dc737a24374dcb877177b889fb0a5ed7b0a9c9ebb912523ef23ba26787d0fff59d9032b3e8075bdde9c072956a + checksum: 9fd41331c609b9488eea363e617e3763a814c75f83eb1b858cef402a0f5b96f67a342e25ff8c333489e550eb4d379eae09a88b986a97c25170fe203662e2f1ae languageName: node linkType: hard -"@docusaurus/plugin-content-docs@npm:2.4.1, @docusaurus/plugin-content-docs@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-content-docs@npm:2.4.1" - dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/logger": 2.4.1 - "@docusaurus/mdx-loader": 2.4.1 - "@docusaurus/module-type-aliases": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 +"@docusaurus/plugin-content-docs@npm:2.4.3, @docusaurus/plugin-content-docs@npm:^2.4.1": + version: 2.4.3 + resolution: "@docusaurus/plugin-content-docs@npm:2.4.3" + dependencies: + "@docusaurus/core": 2.4.3 + "@docusaurus/logger": 2.4.3 + "@docusaurus/mdx-loader": 2.4.3 + "@docusaurus/module-type-aliases": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 "@types/react-router-config": ^5.0.6 combine-promises: ^1.1.0 fs-extra: ^10.1.0 @@ -2002,108 +1993,108 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 028eda178dc81a74c25fd2efddb47e44451af2b268b13d99ef2b60cf13da1443f3bce884fd4a8a7ae92fed8ef747308309074f9524753fd80a40b5252a237e37 + checksum: bc01201f64721131eb84f264e51c7497b8034d2a3d99d762169f5dc456c3d8882acfa01fdbaa8fdc6e2e220479b36e0c9e8e17397bf887884589535bdeaeb4bb languageName: node linkType: hard -"@docusaurus/plugin-content-pages@npm:2.4.1, @docusaurus/plugin-content-pages@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-content-pages@npm:2.4.1" +"@docusaurus/plugin-content-pages@npm:2.4.3, @docusaurus/plugin-content-pages@npm:^2.4.1": + version: 2.4.3 + resolution: "@docusaurus/plugin-content-pages@npm:2.4.3" dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/mdx-loader": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/mdx-loader": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 fs-extra: ^10.1.0 tslib: ^2.4.0 webpack: ^5.73.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 6af4eb7c064ed90158ad584eb64593473940b1880034a65fbcfde36116d6702b882bb9b0340141a5a48e67b0f84c03b8202b94171f5924d9f0c279cb68959a47 + checksum: 00439c2e1a1f345cd549739db13a3610b6d9f7ffa6cf7507ad6ac1f3c8d24041947acc2a446be7edf1a613cf354a50d1133aa28ddf64a0eff6ed8a31bf1a542f languageName: node linkType: hard "@docusaurus/plugin-debug@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-debug@npm:2.4.1" + version: 2.4.3 + resolution: "@docusaurus/plugin-debug@npm:2.4.3" dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils": 2.4.3 fs-extra: ^10.1.0 react-json-view: ^1.21.3 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 0be51e9a881383ed76b6e8f369ca6f7754a4f6bd59093c6d28d955b9422a25e868f24b534eb08ba84a5524ae742edd4a052813767b2ea1e8767914dceffc19b8 + checksum: 88955828b72e463e04501cc6bedf802208e377ae0f4d72735625bcbb47918afc4f2588355c6914064cfdbe4945d3da6473ce76319aa1f66dd975b3b43c4c39b0 languageName: node linkType: hard "@docusaurus/plugin-google-analytics@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-google-analytics@npm:2.4.1" + version: 2.4.3 + resolution: "@docusaurus/plugin-google-analytics@npm:2.4.3" dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 9e754c0bc7779867af07cd77de36f5b491671a96fba5e3517458803465c24773357eb2f1400c41c80e69524cb2c7e9e353262335051aa54192eeae9d9eb055cb + checksum: 6e30de6b5c479493614a5552a295f07ffb9c83f3740a68c7d4dbac378b8288da7430f26cdc246d763855c6084ad86a6f87286e6c8b40f4817794bb1a04e109ea languageName: node linkType: hard "@docusaurus/plugin-google-gtag@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-google-gtag@npm:2.4.1" + version: 2.4.3 + resolution: "@docusaurus/plugin-google-gtag@npm:2.4.3" dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: ed529f2100599401e1c2aa772dca7c60fdb1990e44af3a9e476e1922f1370ef0dd0b5e6442f846bd942b74af63f3163ac85f1eefe1e85660b61ee60f2044c463 + checksum: 4aaac4d262b3bb7fc3f16620c5329b90db92bf28361ced54f2945fc0e4669483e2f36b076332e0ee9d11b6233cd2c81ca35c953119bad42171e62571c1692d6a languageName: node linkType: hard "@docusaurus/plugin-google-tag-manager@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-google-tag-manager@npm:2.4.1" + version: 2.4.3 + resolution: "@docusaurus/plugin-google-tag-manager@npm:2.4.3" dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: c5c6fce9c9eeae7cbeb277b9765a67d5c4403a3e04f634aadac6d4ba9901739a547d4ea023c83a76cfece2fdb2d175851acaa69abb2f190401b612adeab5524d + checksum: c3af89b4d41fab463d853cbfbe8f43d384f702dd09fd914fffcca01fdf94c282d1b98d762c9142fe21f6471f5dd643679e8d11344c95fdf6657aff0618c3c7a5 languageName: node linkType: hard "@docusaurus/plugin-sitemap@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/plugin-sitemap@npm:2.4.1" - dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/logger": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-common": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + version: 2.4.3 + resolution: "@docusaurus/plugin-sitemap@npm:2.4.3" + dependencies: + "@docusaurus/core": 2.4.3 + "@docusaurus/logger": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-common": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 fs-extra: ^10.1.0 sitemap: ^7.1.1 tslib: ^2.4.0 peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: aa6728278017c047b4ed1456e349b1a267d85b4bb0c422bb63e59fc28ccb0e286dc66918f44f6ade660e550b047e2b14796c54c96fde6eb69395770cf39cf306 + checksum: cf96b9f0e32cefa58e37a4bc2f0a112ea657f06faf47b780ec2ba39d5e2daca6486a73f3b376c56ad3bb42f3f0c3f70a783f1ce1964b74e2ba273e6f439e439b languageName: node linkType: hard @@ -2120,21 +2111,21 @@ __metadata: linkType: hard "@docusaurus/theme-classic@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-classic@npm:2.4.1" - dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/mdx-loader": 2.4.1 - "@docusaurus/module-type-aliases": 2.4.1 - "@docusaurus/plugin-content-blog": 2.4.1 - "@docusaurus/plugin-content-docs": 2.4.1 - "@docusaurus/plugin-content-pages": 2.4.1 - "@docusaurus/theme-common": 2.4.1 - "@docusaurus/theme-translations": 2.4.1 - "@docusaurus/types": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-common": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + version: 2.4.3 + resolution: "@docusaurus/theme-classic@npm:2.4.3" + dependencies: + "@docusaurus/core": 2.4.3 + "@docusaurus/mdx-loader": 2.4.3 + "@docusaurus/module-type-aliases": 2.4.3 + "@docusaurus/plugin-content-blog": 2.4.3 + "@docusaurus/plugin-content-docs": 2.4.3 + "@docusaurus/plugin-content-pages": 2.4.3 + "@docusaurus/theme-common": 2.4.3 + "@docusaurus/theme-translations": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-common": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 "@mdx-js/react": ^1.6.22 clsx: ^1.2.1 copy-text-to-clipboard: ^3.0.1 @@ -2151,21 +2142,21 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 058875d4c60f77f86b5d679b1ef99ed06101411f003d2d65fa4fe5ae6fbe5e5e6a291616268a18a29fdd84f0853cc4219a2c1801663b75f27c664b3ace7d009e + checksum: 215b7fa416f40ce68773265a168af47fa770583ebe33ec7b34c7e082dfe7c79252b589a6b26532cb0ab7dd089611a9cd0e20c94df097be320a227b98e3b3fbb8 languageName: node linkType: hard -"@docusaurus/theme-common@npm:2.4.1, @docusaurus/theme-common@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-common@npm:2.4.1" - dependencies: - "@docusaurus/mdx-loader": 2.4.1 - "@docusaurus/module-type-aliases": 2.4.1 - "@docusaurus/plugin-content-blog": 2.4.1 - "@docusaurus/plugin-content-docs": 2.4.1 - "@docusaurus/plugin-content-pages": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-common": 2.4.1 +"@docusaurus/theme-common@npm:2.4.3, @docusaurus/theme-common@npm:^2.4.1, @docusaurus/theme-common@npm:^2.4.3": + version: 2.4.3 + resolution: "@docusaurus/theme-common@npm:2.4.3" + dependencies: + "@docusaurus/mdx-loader": 2.4.3 + "@docusaurus/module-type-aliases": 2.4.3 + "@docusaurus/plugin-content-blog": 2.4.3 + "@docusaurus/plugin-content-docs": 2.4.3 + "@docusaurus/plugin-content-pages": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-common": 2.4.3 "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router-config": "*" @@ -2178,22 +2169,41 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 206db83caab59eadc5b8e5394d46b64ec8695bd20d4a3defe111c28094faf6de92481c3bb4e54c159a519bc782759031b121e17d7e0175d873a843f36630c539 + checksum: 76817f548705542124d708c804e724674ec9bf996a5cb2a5c9a2919416367567cca4a3fa6055589990c339f6e1fb9d3944e25ed30b79fabe191db00d6ef986ca + languageName: node + linkType: hard + +"@docusaurus/theme-mermaid@npm:^2.4.3": + version: 2.4.3 + resolution: "@docusaurus/theme-mermaid@npm:2.4.3" + dependencies: + "@docusaurus/core": 2.4.3 + "@docusaurus/module-type-aliases": 2.4.3 + "@docusaurus/theme-common": 2.4.3 + "@docusaurus/types": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 + "@mdx-js/react": ^1.6.22 + mermaid: ^9.2.2 + tslib: ^2.4.0 + peerDependencies: + react: ^16.8.4 || ^17.0.0 + react-dom: ^16.8.4 || ^17.0.0 + checksum: 63b2eafaf929e3266d91b8c38bfa0aa9e4a6f625576d4c3c220426aaab3118185b2ed0d74fa359273e69c9f41dea3267d8ff77646acbcd1e1c3d392d20d8f77a languageName: node linkType: hard "@docusaurus/theme-search-algolia@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-search-algolia@npm:2.4.1" + version: 2.4.3 + resolution: "@docusaurus/theme-search-algolia@npm:2.4.3" dependencies: "@docsearch/react": ^3.1.1 - "@docusaurus/core": 2.4.1 - "@docusaurus/logger": 2.4.1 - "@docusaurus/plugin-content-docs": 2.4.1 - "@docusaurus/theme-common": 2.4.1 - "@docusaurus/theme-translations": 2.4.1 - "@docusaurus/utils": 2.4.1 - "@docusaurus/utils-validation": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/logger": 2.4.3 + "@docusaurus/plugin-content-docs": 2.4.3 + "@docusaurus/theme-common": 2.4.3 + "@docusaurus/theme-translations": 2.4.3 + "@docusaurus/utils": 2.4.3 + "@docusaurus/utils-validation": 2.4.3 algoliasearch: ^4.13.1 algoliasearch-helper: ^3.10.0 clsx: ^1.2.1 @@ -2205,23 +2215,23 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: 00016804462e3ca961de96f477c397bf68bbfa7c641cfb95e76492ec00f2e0f8f5b19623cd6ad0fda31ad08aa29fa1a74185d9bd34f61437e7f36f711064f3ba + checksum: 665d244c25bff21dd45c983c9b85f9827d2dd58945b802d645370b5e7092820532faf488c0bc0ce88e8fc0088c7f56eb9abb96589cf3857372c1b61bba6cbed7 languageName: node linkType: hard -"@docusaurus/theme-translations@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/theme-translations@npm:2.4.1" +"@docusaurus/theme-translations@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/theme-translations@npm:2.4.3" dependencies: fs-extra: ^10.1.0 tslib: ^2.4.0 - checksum: cf21cd01db6426ccc29360fe9caca39e61ee5efde3796539e8292e212c25727227970f935050f294f0ab475f201720e32a1d09a7e40f2b08f56f69282f660da8 + checksum: 8424583a130b0d32b6adf578dc5daeefaad199019c8a6a23fbd67577209be64923cde59d423ea9d41d6e7cfc2318e7fa6a17a665e8ae1c871ce0880525f9b8fd languageName: node linkType: hard -"@docusaurus/types@npm:2.4.1, @docusaurus/types@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/types@npm:2.4.1" +"@docusaurus/types@npm:2.4.3, @docusaurus/types@npm:^2.4.1": + version: 2.4.3 + resolution: "@docusaurus/types@npm:2.4.3" dependencies: "@types/history": ^4.7.11 "@types/react": "*" @@ -2234,13 +2244,13 @@ __metadata: peerDependencies: react: ^16.8.4 || ^17.0.0 react-dom: ^16.8.4 || ^17.0.0 - checksum: d44e91c9153802a5c63a0bd91e56654f901df837ac7b380dff8f165991728e88d29efa7c64c6522d0afdf8ec845613aff5867badb717d29b691392712f655936 + checksum: c123c45630e885b588f808baa06a97f8408a3381906f65cb92ae75732aedfca6ab2cada94f969c08e043b885b95298616440326259b789010e0986cbcd7a960b languageName: node linkType: hard -"@docusaurus/utils-common@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/utils-common@npm:2.4.1" +"@docusaurus/utils-common@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/utils-common@npm:2.4.3" dependencies: tslib: ^2.4.0 peerDependencies: @@ -2248,28 +2258,28 @@ __metadata: peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: 475f05b94a879d9078564dbb081d91a953356f54d0a4384a8711281a62851b58d99df9b45664a30e40ac37733772cedd53a253d34a07fbd5b36bcce46ab200c8 + checksum: 1ae315d8d8ce7a0163a698ffdca55b734d21f336512138c128bc0fa2a8d224edbaad0c8dbd7a3de2e8ef734dc2656c505d09066dee4fc84819d153593abb8984 languageName: node linkType: hard -"@docusaurus/utils-validation@npm:2.4.1": - version: 2.4.1 - resolution: "@docusaurus/utils-validation@npm:2.4.1" +"@docusaurus/utils-validation@npm:2.4.3": + version: 2.4.3 + resolution: "@docusaurus/utils-validation@npm:2.4.3" dependencies: - "@docusaurus/logger": 2.4.1 - "@docusaurus/utils": 2.4.1 + "@docusaurus/logger": 2.4.3 + "@docusaurus/utils": 2.4.3 joi: ^17.6.0 js-yaml: ^4.1.0 tslib: ^2.4.0 - checksum: 44dc482770ea3932e68e58c0bb9503e1b3c73ce28565c438b0d68a7427ee91760ca84a5e150dfc4e04497e072fe4394050dd2af4c4ff43a227b1464e89d705a0 + checksum: d3472b3f7a0a029c2cef1f00bc9db403d5f7e74e2091eccbc45d06f5776a84fd73bd1a18cf3a8a3cc0348ce49f753a1300deac670c2a82c56070cc40ca9df06e languageName: node linkType: hard -"@docusaurus/utils@npm:2.4.1, @docusaurus/utils@npm:^2.4.1": - version: 2.4.1 - resolution: "@docusaurus/utils@npm:2.4.1" +"@docusaurus/utils@npm:2.4.3, @docusaurus/utils@npm:^2.4.1": + version: 2.4.3 + resolution: "@docusaurus/utils@npm:2.4.3" dependencies: - "@docusaurus/logger": 2.4.1 + "@docusaurus/logger": 2.4.3 "@svgr/webpack": ^6.2.1 escape-string-regexp: ^4.0.0 file-loader: ^6.2.0 @@ -2290,7 +2300,7 @@ __metadata: peerDependenciesMeta: "@docusaurus/types": optional: true - checksum: 4c7e49cabe6650b027c0f698344532fb81c8aaf912f17a287fad986e008ce7c6d34d372b44974488ce160ae43ef6aad4ac7b2790bc3fe2ab05ef5fa7b9506ce9 + checksum: dd1aa7688d1a4b2775e13a91d528608ceab33c57a921404d9a989867c31c8ef17fe3892e4f5680dfb4a783da7b9973e2077e907ff4ac172927433e606e8fa9b9 languageName: node linkType: hard @@ -2305,16 +2315,16 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0": - version: 4.5.1 - resolution: "@eslint-community/regexpp@npm:4.5.1" - checksum: 6d901166d64998d591fab4db1c2f872981ccd5f6fe066a1ad0a93d4e11855ecae6bfb76660869a469563e8882d4307228cebd41142adb409d182f2966771e57e +"@eslint-community/regexpp@npm:^4.4.0, @eslint-community/regexpp@npm:^4.6.1": + version: 4.9.1 + resolution: "@eslint-community/regexpp@npm:4.9.1" + checksum: 06fb839e9c756f6375cc545c2f2e05a0a64576bd6370e8e3c07983fd29a3d6e164ef4aa48a361f7d27e6713ab79c83053ff6a2ccb78748bc955e344279c4a3b6 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.0": - version: 2.1.0 - resolution: "@eslint/eslintrc@npm:2.1.0" +"@eslint/eslintrc@npm:^2.1.2": + version: 2.1.2 + resolution: "@eslint/eslintrc@npm:2.1.2" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -2325,30 +2335,30 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: d5ed0adbe23f6571d8c9bb0ca6edf7618dc6aed4046aa56df7139f65ae7b578874e0d9c796df784c25bda648ceb754b6320277d828c8b004876d7443b8dc018c + checksum: bc742a1e3b361f06fedb4afb6bf32cbd27171292ef7924f61c62f2aed73048367bcc7ac68f98c06d4245cd3fabc43270f844e3c1699936d4734b3ac5398814a7 languageName: node linkType: hard -"@eslint/js@npm:8.44.0": - version: 8.44.0 - resolution: "@eslint/js@npm:8.44.0" - checksum: fc539583226a28f5677356e9f00d2789c34253f076643d2e32888250e509a4e13aafe0880cb2425139051de0f3a48d25bfc5afa96b7304f203b706c17340e3cf +"@eslint/js@npm:8.51.0": + version: 8.51.0 + resolution: "@eslint/js@npm:8.51.0" + checksum: 0228bf1e1e0414843e56d9ff362a2a72d579c078f93174666f29315690e9e30a8633ad72c923297f7fd7182381b5a476805ff04dac8debe638953eb1ded3ac73 languageName: node linkType: hard -"@fortawesome/fontawesome-common-types@npm:6.4.0": - version: 6.4.0 - resolution: "@fortawesome/fontawesome-common-types@npm:6.4.0" - checksum: a9b79136caa615352bd921cfe2710516321b402cd76c3f0ae68e579a7e3d7645c5a5c0ecd7516c0b207adeeffd1d2174978638d8c0d3c8c937d66fca4f2ff556 +"@fortawesome/fontawesome-common-types@npm:6.4.2": + version: 6.4.2 + resolution: "@fortawesome/fontawesome-common-types@npm:6.4.2" + checksum: 4a22932bd0cac65be1d35b739624f366b6c247b60eb5b8f66218957f54ce1cae56e2a20ea88789ede45d1e1c0c1014f160e01c1752122ec174ad0823e60f94bf languageName: node linkType: hard "@fortawesome/fontawesome-svg-core@npm:^6.1.1": - version: 6.4.0 - resolution: "@fortawesome/fontawesome-svg-core@npm:6.4.0" + version: 6.4.2 + resolution: "@fortawesome/fontawesome-svg-core@npm:6.4.2" dependencies: - "@fortawesome/fontawesome-common-types": 6.4.0 - checksum: 5d4e6c15f814f5ce29053b666d0c7d194dc8ba173d128a38cc5856403a09d4e817e54956d30ed8d48d621f2f5ebcc71756f4e8fe5c5a091c636fc728fcb2362b + "@fortawesome/fontawesome-common-types": 6.4.2 + checksum: 0c0ecd9058883b128127e2b281c983ba6272be38a17577aaa2293ada58e9b1538357fe44430ded508d49ae3f5cc55aa720a0448d2b9d99689bb912d786f034e5 languageName: node linkType: hard @@ -2380,14 +2390,14 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.10": - version: 0.11.10 - resolution: "@humanwhocodes/config-array@npm:0.11.10" +"@humanwhocodes/config-array@npm:^0.11.11": + version: 0.11.11 + resolution: "@humanwhocodes/config-array@npm:0.11.11" dependencies: "@humanwhocodes/object-schema": ^1.2.1 debug: ^4.1.1 minimatch: ^3.0.5 - checksum: 1b1302e2403d0e35bc43e66d67a2b36b0ad1119efc704b5faff68c41f791a052355b010fb2d27ef022670f550de24cd6d08d5ecf0821c16326b7dcd0ee5d5d8a + checksum: db84507375ab77b8ffdd24f498a5b49ad6b64391d30dd2ac56885501d03964d29637e05b1ed5aefa09d57ac667e28028bc22d2da872bfcd619652fbdb5f4ca19 languageName: node linkType: hard @@ -2419,26 +2429,26 @@ __metadata: languageName: node linkType: hard -"@jest/schemas@npm:^29.6.0": - version: 29.6.0 - resolution: "@jest/schemas@npm:29.6.0" +"@jest/schemas@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/schemas@npm:29.6.3" dependencies: "@sinclair/typebox": ^0.27.8 - checksum: c00511c69cf89138a7d974404d3a5060af375b5a52b9c87215d91873129b382ca11c1ff25bd6d605951404bb381ddce5f8091004a61e76457da35db1f5c51365 + checksum: 910040425f0fc93cd13e68c750b7885590b8839066dfa0cd78e7def07bbb708ad869381f725945d66f2284de5663bbecf63e8fdd856e2ae6e261ba30b1687e93 languageName: node linkType: hard -"@jest/types@npm:^29.6.1": - version: 29.6.1 - resolution: "@jest/types@npm:29.6.1" +"@jest/types@npm:^29.6.3": + version: 29.6.3 + resolution: "@jest/types@npm:29.6.3" dependencies: - "@jest/schemas": ^29.6.0 + "@jest/schemas": ^29.6.3 "@types/istanbul-lib-coverage": ^2.0.0 "@types/istanbul-reports": ^3.0.0 "@types/node": "*" "@types/yargs": ^17.0.8 chalk: ^4.0.0 - checksum: 89fc1ccf71a84fe0da643e0675b1cfe6a6f19ea72e935b2ab1dbdb56ec547e94433fb59b3536d3832a6e156c077865b7176fe9dae707dab9c3d2f9405ba6233c + checksum: a0bcf15dbb0eca6bdd8ce61a3fb055349d40268622a7670a3b2eb3c3dbafe9eb26af59938366d520b86907b9505b0f9b29b85cec11579a9e580694b87cd90fcc languageName: node linkType: hard @@ -2453,10 +2463,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: f5b441fe7900eab4f9155b3b93f9800a916257f4e8563afbcd3b5a5337b55e52bd8ae6735453b1b745457d9f6cdb16d74cd6220bbdd98cf153239e13f6cbb653 languageName: node linkType: hard @@ -2477,14 +2487,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 - languageName: node - linkType: hard - -"@jridgewell/sourcemap-codec@npm:^1.4.10": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": version: 1.4.15 resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" checksum: b881c7e503db3fc7f3c1f35a1dd2655a188cc51a3612d76efc8a6eb74728bef5606e6758ee77423e564092b4a518aba569bbb21c9bac5ab7a35b0c6ae7e344c8 @@ -2492,12 +2495,12 @@ __metadata: linkType: hard "@jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.18 - resolution: "@jridgewell/trace-mapping@npm:0.3.18" + version: 0.3.19 + resolution: "@jridgewell/trace-mapping@npm:0.3.19" dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 0572669f855260808c16fe8f78f5f1b4356463b11d3f2c7c0b5580c8ba1cbf4ae53efe9f627595830856e57dbac2325ac17eb0c3dd0ec42102e6f227cc289c02 + "@jridgewell/resolve-uri": ^3.1.0 + "@jridgewell/sourcemap-codec": ^1.4.14 + checksum: 956a6f0f6fec060fb48c6bf1f5ec2064e13cd38c8be3873877d4b92b4a27ba58289a34071752671262a3e3c202abcc3fa2aac64d8447b4b0fa1ba3c9047f1c20 languageName: node linkType: hard @@ -2526,7 +2529,7 @@ __metadata: languageName: node linkType: hard -"@json-schema-tools/reference-resolver@npm:1.2.4, @json-schema-tools/reference-resolver@npm:^1.2.4": +"@json-schema-tools/reference-resolver@npm:1.2.4": version: 1.2.4 resolution: "@json-schema-tools/reference-resolver@npm:1.2.4" dependencies: @@ -2536,6 +2539,16 @@ __metadata: languageName: node linkType: hard +"@json-schema-tools/reference-resolver@npm:^1.2.4": + version: 1.2.5 + resolution: "@json-schema-tools/reference-resolver@npm:1.2.5" + dependencies: + "@json-schema-spec/json-pointer": ^0.1.2 + isomorphic-fetch: ^3.0.0 + checksum: 469aa847c9d90dff5909fda01164076c5ab66baa671640a1b0cffc81fb72bd2a9339d7a4a5b7115b824c99efd98fce1f4eb1a3c98fdc1d968929ad7becebbdbd + languageName: node + linkType: hard + "@json-schema-tools/traverse@npm:^1.10.1, @json-schema-tools/traverse@npm:^1.7.8": version: 1.10.1 resolution: "@json-schema-tools/traverse@npm:1.10.1" @@ -2550,29 +2563,29 @@ __metadata: languageName: node linkType: hard -"@lavamoat/aa@npm:^3.1.1": - version: 3.1.2 - resolution: "@lavamoat/aa@npm:3.1.2" +"@lavamoat/aa@npm:^3.1.5": + version: 3.1.5 + resolution: "@lavamoat/aa@npm:3.1.5" dependencies: - resolve: ^1.20.0 + resolve: ^1.22.3 bin: lavamoat-ls: src/cli.js - checksum: e580278f2119e26b968105b1ba61d9285537b2577b2f2a256c12d4e623bc544eb7664989855b90e7b2aee6ed23222179423a0c9009f67995ded85678e132332f + checksum: 46ced120a30e9472c2e448bd6af694911c644ee036d6cd0087692b47c553b5ac26748a9bff1e99f1220f672579bce664fb48cb2f39884fd0b1a45d16b9195e48 languageName: node linkType: hard "@lavamoat/allow-scripts@npm:^2.3.0": - version: 2.3.1 - resolution: "@lavamoat/allow-scripts@npm:2.3.1" + version: 2.5.1 + resolution: "@lavamoat/allow-scripts@npm:2.5.1" dependencies: - "@lavamoat/aa": ^3.1.1 + "@lavamoat/aa": ^3.1.5 "@npmcli/run-script": ^6.0.0 bin-links: 4.0.1 npm-normalize-package-bin: ^3.0.0 yargs: ^16.2.0 bin: allow-scripts: src/cli.js - checksum: 334612c1ecd357f0143542837ba9982b16e884e4091083b7f437ddc48e79071e3e5503bc3eaa65adf5aa84e4e3021abc074438dd202a72b80ad6fff785caad69 + checksum: 5f249803b13ad1d2900d1be7d500135b3898f700465e748e7f9d88a7c5a8b07829a0665910d4047ffd65877babe94a80c8e8c9ad8ee02e61446e89bcd4179611 languageName: node linkType: hard @@ -2688,15 +2701,6 @@ __metadata: languageName: node linkType: hard -"@nicolo-ribaudo/semver-v6@npm:^6.3.3": - version: 6.3.3 - resolution: "@nicolo-ribaudo/semver-v6@npm:6.3.3" - bin: - semver: bin/semver.js - checksum: 8290855b1591477d2298364541fda64fafd4acc110b387067a71c9b05f4105c0a4ac079857ae9cd107c42ee884e8724a406b5116f069575e02d7ab87a35a5272 - languageName: node - linkType: hard - "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -2802,9 +2806,9 @@ __metadata: linkType: hard "@polka/url@npm:^1.0.0-next.20": - version: 1.0.0-next.21 - resolution: "@polka/url@npm:1.0.0-next.21" - checksum: c7654046d38984257dd639eab3dc770d1b0340916097b2fac03ce5d23506ada684e05574a69b255c32ea6a144a957c8cd84264159b545fca031c772289d88788 + version: 1.0.0-next.23 + resolution: "@polka/url@npm:1.0.0-next.23" + checksum: 4b0330de1ceecd1002c7e7449094d0c41f2ed0e21765f4835ccc7b003f2f024ac557d503b9ffdf0918cf50b80d5b8c99dfc5a91927e7b3c468b09c6bb42a3c41 languageName: node linkType: hard @@ -2907,13 +2911,13 @@ __metadata: linkType: hard "@react-types/checkbox@npm:^3.2.3": - version: 3.4.4 - resolution: "@react-types/checkbox@npm:3.4.4" + version: 3.5.2 + resolution: "@react-types/checkbox@npm:3.5.2" dependencies: - "@react-types/shared": ^3.18.1 + "@react-types/shared": ^3.21.0 peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 147bd4288ee714ead98433388589673632d92e26a7152032809dbcab9424b219505aabed9ad49770197c5d8cc0e660cad7cb077426eb08f333b333aecacd40fc + checksum: 56e764547ab7943fc5522150769b5b670b804ac308224fc2a76bed339acf9472703efc320859ac36684d6cb4b00f9f6c25385737a42c54e4791095e96aacd57d languageName: node linkType: hard @@ -2928,7 +2932,7 @@ __metadata: languageName: node linkType: hard -"@react-types/shared@npm:3.9.0, @react-types/shared@npm:^3.8.0, @react-types/shared@npm:^3.9.0": +"@react-types/shared@npm:3.9.0": version: 3.9.0 resolution: "@react-types/shared@npm:3.9.0" peerDependencies: @@ -2937,12 +2941,12 @@ __metadata: languageName: node linkType: hard -"@react-types/shared@npm:^3.18.1": - version: 3.18.1 - resolution: "@react-types/shared@npm:3.18.1" +"@react-types/shared@npm:^3.21.0, @react-types/shared@npm:^3.8.0, @react-types/shared@npm:^3.9.0": + version: 3.21.0 + resolution: "@react-types/shared@npm:3.21.0" peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - checksum: 298822d1cca26b5da1bdf53a57d26d5619f3af816db3fdecdc8b99a3a305ca8ee352347ca43f426a5d79045b08cf32c00c6b083ad4a1002abf673de9dd4a9bb5 + checksum: 1decbd6765c345104225e9245eb865e154fa6b869f6f9ee298f4e0a988333b9d819fb05217eb6ce38c7f3d3f1b81e6aabf14c1ee378acbc2c21a162d1181ac12 languageName: node linkType: hard @@ -2979,24 +2983,24 @@ __metadata: linkType: hard "@rjsf/core@npm:^5.6.2": - version: 5.9.0 - resolution: "@rjsf/core@npm:5.9.0" + version: 5.13.2 + resolution: "@rjsf/core@npm:5.13.2" dependencies: lodash: ^4.17.21 lodash-es: ^4.17.21 - markdown-to-jsx: ^7.2.1 + markdown-to-jsx: ^7.3.2 nanoid: ^3.3.6 prop-types: ^15.8.1 peerDependencies: - "@rjsf/utils": ^5.8.x + "@rjsf/utils": ^5.12.x react: ^16.14.0 || >=17 - checksum: 52406fcf560af51cb5b45ce95eb826ff1ad4ed1366c70b16b16137455f6b252cef507f76f139524228e12ccf2d49816b3538747431886476574ac2911f29aac1 + checksum: e977c33bc74075fe2035a22d242bd1a8433468834e3e45fe9b8edaf9e14e14793c43936917805f105960b3d71385fc6616ce502b5273fd6ee1c4539aa3c4e69c languageName: node linkType: hard "@rjsf/utils@npm:^5.6.2": - version: 5.9.0 - resolution: "@rjsf/utils@npm:5.9.0" + version: 5.13.2 + resolution: "@rjsf/utils@npm:5.13.2" dependencies: json-schema-merge-allof: ^0.8.1 jsonpointer: ^5.0.1 @@ -3005,21 +3009,21 @@ __metadata: react-is: ^18.2.0 peerDependencies: react: ^16.14.0 || >=17 - checksum: f1a1070539b24763b64631bb8d0d16a504fa46f029775a34e57c47e58b913b07e2869b45de6c993745a6320df3b6571f101abc2d07be59054a971e43facae6ea + checksum: 06834669205fa0429355f04fc551986ca6899c7b656feb2f2f0477c02e6da625bf198bd292b06e703e2c029436d899a2c802fe28d1bfe5017b2a2d016a361180 languageName: node linkType: hard "@rjsf/validator-ajv8@npm:^5.6.2": - version: 5.9.0 - resolution: "@rjsf/validator-ajv8@npm:5.9.0" + version: 5.13.2 + resolution: "@rjsf/validator-ajv8@npm:5.13.2" dependencies: ajv: ^8.12.0 ajv-formats: ^2.1.1 lodash: ^4.17.21 lodash-es: ^4.17.21 peerDependencies: - "@rjsf/utils": ^5.8.x - checksum: fe6ed5727bab1cab7fa4b69b788a0c7b0a7009a8c57eaf8926ca1ae45c6807005674ffc136f4f7a5d7b25404ce154377d3cda7f1dc7994adcf97457147c3bcbb + "@rjsf/utils": ^5.12.x + checksum: 1c88d806ac3c6c8753f798ebc0c23afc3ac9066bf872baa82f0623029b0683ec51a962282dfa48a130234f6e875a856ff7dbd4e268d86a639d3a4f8612e31a10 languageName: node linkType: hard @@ -3162,25 +3166,25 @@ __metadata: languageName: node linkType: hard -"@stoplight/json-schema-tree@npm:^2.2.2": - version: 2.2.3 - resolution: "@stoplight/json-schema-tree@npm:2.2.3" +"@stoplight/json-schema-tree@npm:^2.2.5": + version: 2.2.5 + resolution: "@stoplight/json-schema-tree@npm:2.2.5" dependencies: "@stoplight/json": ^3.12.0 "@stoplight/json-schema-merge-allof": ^0.7.8 "@stoplight/lifecycle": ^2.3.2 "@types/json-schema": ^7.0.7 magic-error: 0.0.1 - checksum: 8424248613cc5dea9a2341366ab49a6052cf4107abef78a4d0b6227a9fec78a593783f6a17bb881efc8a40361f1732e34d1b945a354ae437fb06462603b5b278 + checksum: c21078cc5ba708153ae323e35e2e23c2348d7c0d6588a24c43f4ebe1ab102450789c439158b95b791869ebc863713a8a89667a1ad79c36c09fb35f52359bcded languageName: node linkType: hard "@stoplight/json-schema-viewer@npm:^4.9.1": - version: 4.10.0 - resolution: "@stoplight/json-schema-viewer@npm:4.10.0" + version: 4.12.1 + resolution: "@stoplight/json-schema-viewer@npm:4.12.1" dependencies: "@stoplight/json": ^3.20.1 - "@stoplight/json-schema-tree": ^2.2.2 + "@stoplight/json-schema-tree": ^2.2.5 "@stoplight/react-error-boundary": ^2.0.0 "@types/json-schema": ^7.0.7 classnames: ^2.2.6 @@ -3193,7 +3197,7 @@ __metadata: "@stoplight/mosaic-code-viewer": ^1.32 react: ">=16.8" react-dom: ">=16.8" - checksum: d9c527a0715d17186da04354fea2f19e31c180ce118fabd5b08f96b5224c5df8068bf12ebd9f09432015a8548097cb1159dfcfc23fe94dadf992105ddee8909f + checksum: bcbe88f0004f7795405c3da4ccc16026cb42faf8e09bedf53624e70f872dfbe3ba552ddcaad47dfdb40afe6d252cb6721aef61be7254b62a571e05fd0786d366 languageName: node linkType: hard @@ -3271,8 +3275,8 @@ __metadata: linkType: hard "@stoplight/mosaic-code-viewer@npm:^1.32": - version: 1.41.0 - resolution: "@stoplight/mosaic-code-viewer@npm:1.41.0" + version: 1.44.3 + resolution: "@stoplight/mosaic-code-viewer@npm:1.44.3" dependencies: "@fortawesome/fontawesome-svg-core": ^6.1.1 "@fortawesome/react-fontawesome": ^0.2.0 @@ -3281,7 +3285,7 @@ __metadata: "@react-types/radio": 3.1.2 "@react-types/shared": 3.9.0 "@react-types/switch": 3.1.2 - "@stoplight/mosaic": 1.41.0 + "@stoplight/mosaic": 1.44.3 "@stoplight/types": ^13.7.0 clsx: ^1.1.1 copy-to-clipboard: ^3.3.1 @@ -3299,13 +3303,13 @@ __metadata: zustand: ^3.5.2 peerDependencies: react: ">= 16.14" - checksum: 743f8c4bf589a32bd0eb972252be683dcca6ff60fc142e88b192af1c77a40295f0f0a84cf6572d124970a546eb4b25e3b0b1f3dd172dbc142f937576d2e84d8d + checksum: 13c6912f71c0dcedb6857a8d97ab89d4869a24df45fcc7f7270ac8902b0bbac09dee5eae789de2f9f4a61f9585f36962aaba3c69e937ea872c2e81a6cec5a894 languageName: node linkType: hard -"@stoplight/mosaic@npm:1.41.0, @stoplight/mosaic@npm:^1.32": - version: 1.41.0 - resolution: "@stoplight/mosaic@npm:1.41.0" +"@stoplight/mosaic@npm:1.44.3, @stoplight/mosaic@npm:^1.32": + version: 1.44.3 + resolution: "@stoplight/mosaic@npm:1.44.3" dependencies: "@fortawesome/fontawesome-svg-core": ^6.1.1 "@fortawesome/react-fontawesome": ^0.2.0 @@ -3333,7 +3337,7 @@ __metadata: zustand: ^3.5.2 peerDependencies: react: ">= 16.14" - checksum: a605d8e380b7c3cd313500c0e0c97b2beccd9fc4fe86a7a69d46024e2bc2553467f5d5f721fc12c02a70779ff65e1681654120f99ebd75ea2f28bc914c3e01c9 + checksum: 833eacf0ba412915a76a5cdd1da0e7f72c731cf2eedaebfa73444a7919e1a1841749d136502b8fc10fe4035d59e69e19c6f937db402acb57a804bfc623efefae languageName: node linkType: hard @@ -3374,12 +3378,12 @@ __metadata: linkType: hard "@stoplight/types@npm:^13.0.0, @stoplight/types@npm:^13.6.0, @stoplight/types@npm:^13.7.0": - version: 13.15.0 - resolution: "@stoplight/types@npm:13.15.0" + version: 13.20.0 + resolution: "@stoplight/types@npm:13.20.0" dependencies: "@types/json-schema": ^7.0.4 utility-types: ^3.10.0 - checksum: 839f0bbedb791bd6792ef22b6a821ca504b14b705927f7c510c4cdcc591eddc8818c82b8857129501aa809d6f369b82e4487bfe18dfc5ce00e28317ecad2df9a + checksum: b4c7ee22a8d4377aa9b2f901887c17b4a27d1009b2b9348962b2c6a72100ca954d11293a6dd2de01920e8fdc589e31b20ad84421eb0bf5edd9aeef5b5810f04b languageName: node linkType: hard @@ -3589,109 +3593,109 @@ __metadata: linkType: hard "@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.3 + resolution: "@types/body-parser@npm:1.19.3" dependencies: "@types/connect": "*" "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + checksum: 932fa71437c275023799123680ef26ffd90efd37f51a1abe405e6ae6e5b4ad9511b7a3a8f5a12877ed1444a02b6286c0a137a98e914b3c61932390c83643cc2c languageName: node linkType: hard "@types/bonjour@npm:^3.5.9": - version: 3.5.10 - resolution: "@types/bonjour@npm:3.5.10" + version: 3.5.11 + resolution: "@types/bonjour@npm:3.5.11" dependencies: "@types/node": "*" - checksum: bfcadb042a41b124c4e3de4925e3be6d35b78f93f27c4535d5ff86980dc0f8bc407ed99b9b54528952dc62834d5a779392f7a12c2947dd19330eb05a6bcae15a + checksum: 12fb86a1bb4a610f16ef6d7d68f85e7c31070029f02b6622073794a271e75abcf58230ed205a2ae23c53be2c08b9e507d3b91fa0dc9dfe76c4b1f5e19e9370cb languageName: node linkType: hard "@types/connect-history-api-fallback@npm:^1.3.5": - version: 1.5.0 - resolution: "@types/connect-history-api-fallback@npm:1.5.0" + version: 1.5.1 + resolution: "@types/connect-history-api-fallback@npm:1.5.1" dependencies: "@types/express-serve-static-core": "*" "@types/node": "*" - checksum: f180e7c540728d6dd3a1eb2376e445fe7f9de4ee8a5b460d5ad80062cdb6de6efc91c6851f39e9d5933b3dcd5cd370673c52343a959aa091238b6f863ea4447c + checksum: bc5e46663300eba56eaf8ef242156256e2bdadc52bb7d6543f4b37f2945b6a810901c245711f8321fce7d94c7b588b308a86519f3e1f87a80eb87841d808dbdc languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.35 - resolution: "@types/connect@npm:3.4.35" + version: 3.4.36 + resolution: "@types/connect@npm:3.4.36" dependencies: "@types/node": "*" - checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + checksum: 4dee3d966fb527b98f0cbbdcf6977c9193fc3204ed539b7522fe5e64dfa45f9017bdda4ffb1f760062262fce7701a0ee1c2f6ce2e50af36c74d4e37052303172 languageName: node linkType: hard "@types/debug@npm:^4.0.0": - version: 4.1.8 - resolution: "@types/debug@npm:4.1.8" + version: 4.1.9 + resolution: "@types/debug@npm:4.1.9" dependencies: "@types/ms": "*" - checksum: a9a9bb40a199e9724aa944e139a7659173a9b274798ea7efbc277cb084bc37d32fc4c00877c3496fac4fed70a23243d284adb75c00b5fdabb38a22154d18e5df + checksum: e88ee8b19d106f33eb0d3bc58bacff9702e98d821fd1ebd1de8942e6b97419e19a1ccf39370f1764a1dc66f79fd4619f3412e1be6eeb9f0b76412f5ffe4ead93 languageName: node linkType: hard "@types/eslint-scope@npm:^3.7.3": - version: 3.7.4 - resolution: "@types/eslint-scope@npm:3.7.4" + version: 3.7.5 + resolution: "@types/eslint-scope@npm:3.7.5" dependencies: "@types/eslint": "*" "@types/estree": "*" - checksum: ea6a9363e92f301cd3888194469f9ec9d0021fe0a397a97a6dd689e7545c75de0bd2153dfb13d3ab532853a278b6572c6f678ce846980669e41029d205653460 + checksum: e91ce335c3791c2cf6084caa0073f90d5b7ae3fcf27785ade8422b7d896159fa14a5a3f1efd31ef03e9ebc1ff04983288280dfe8c9a5579a958539f59df8cc9f languageName: node linkType: hard "@types/eslint@npm:*": - version: 8.44.0 - resolution: "@types/eslint@npm:8.44.0" + version: 8.44.4 + resolution: "@types/eslint@npm:8.44.4" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: 2655f409a4ecdd64bb9dd9eb6715e7a2ac30c0e7f902b414e10dbe9d6d497baa5a0f13105e1f7bd5ad7a913338e2ab4bed1faf192a7a0d27d1acd45ba79d3f69 + checksum: 15bafdaba800e2995f38d3a2a929d8e9303035315e8d3535523a21cd719b6769a45884afa955f0b845ffa545a4150429b0178e2c44feeedf59ebb285eeae9825 languageName: node linkType: hard "@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.1 - resolution: "@types/estree@npm:1.0.1" - checksum: e9aa175eacb797216fafce4d41e8202c7a75555bc55232dee0f9903d7171f8f19f0ae7d5191bb1a88cb90e65468be508c0df850a9fb81b4433b293a5a749899d + version: 1.0.2 + resolution: "@types/estree@npm:1.0.2" + checksum: aeedb1b2fe20cbe06f44b99b562bf9703e360bfcdf5bb3d61d248182ee1dd63500f2474e12f098ffe1f5ac3202b43b3e18ec99902d9328d5374f5512fa077e45 languageName: node linkType: hard "@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.17.35 - resolution: "@types/express-serve-static-core@npm:4.17.35" + version: 4.17.37 + resolution: "@types/express-serve-static-core@npm:4.17.37" dependencies: "@types/node": "*" "@types/qs": "*" "@types/range-parser": "*" "@types/send": "*" - checksum: cc8995d10c6feda475ec1b3a0e69eb0f35f21ab6b49129ad5c6f279e0bc5de8175bc04ec51304cb79a43eec3ed2f5a1e01472eb6d5f827b8c35c6ca8ad24eb6e + checksum: 2dab1380e45eb44e56ecc1be1c42c4b897364d2f2a08e03ca28fbcb1e6866e390217385435813711c046f9acd684424d088855dc32825d5cbecf72c60ecd037f languageName: node linkType: hard "@types/express@npm:*, @types/express@npm:^4.17.13": - version: 4.17.17 - resolution: "@types/express@npm:4.17.17" + version: 4.17.19 + resolution: "@types/express@npm:4.17.19" dependencies: "@types/body-parser": "*" "@types/express-serve-static-core": ^4.17.33 "@types/qs": "*" "@types/serve-static": "*" - checksum: 0196dacc275ac3ce89d7364885cb08e7fb61f53ca101f65886dbf1daf9b7eb05c0943e2e4bbd01b0cc5e50f37e0eea7e4cbe97d0304094411ac73e1b7998f4da + checksum: 3d39d0655eb0825d96fec100985a38737767ddd6da2dbda1e330a3adf36c98a9b7cd8d9539db32876d1fbb47a09343cad7b38c30c8dd7c291271fcb9b85cb21b languageName: node linkType: hard "@types/hast@npm:^2.0.0": - version: 2.3.5 - resolution: "@types/hast@npm:2.3.5" + version: 2.3.6 + resolution: "@types/hast@npm:2.3.6" dependencies: "@types/unist": ^2 - checksum: e435e9fbf6afc616ade377d2246a632fb75f4064be4bfd619b67a1ba0d9935d75968a18fbdb66535dfb5e77ef81f4b9b56fd8f35c1cffa34b48ddb0287fec91e + checksum: c004372f6ab919ec92a2de43e4380707e27b76fe371c7d06ab26547c1e851dfba2a7c740c544218df8c7e0a94443458793c43730ad563a39e3fdc1a48904d7f5 languageName: node linkType: hard @@ -3710,18 +3714,18 @@ __metadata: linkType: hard "@types/http-errors@npm:*": - version: 2.0.1 - resolution: "@types/http-errors@npm:2.0.1" - checksum: 3bb0c50b0a652e679a84c30cd0340d696c32ef6558518268c238840346c077f899315daaf1c26c09c57ddd5dc80510f2a7f46acd52bf949e339e35ed3ee9654f + version: 2.0.2 + resolution: "@types/http-errors@npm:2.0.2" + checksum: d7f14045240ac4b563725130942b8e5c8080bfabc724c8ff3f166ea928ff7ae02c5194763bc8f6aaf21897e8a44049b0492493b9de3e058247e58fdfe0f86692 languageName: node linkType: hard "@types/http-proxy@npm:^1.17.8": - version: 1.17.11 - resolution: "@types/http-proxy@npm:1.17.11" + version: 1.17.12 + resolution: "@types/http-proxy@npm:1.17.12" dependencies: "@types/node": "*" - checksum: 38ef4f8c91c7a5b664cf6dd4d90de7863f88549a9f8ef997f2f1184e4f8cf2e7b9b63c04f0b7b962f34a09983073a31a9856de5aae5159b2ddbb905a4c44dc9f + checksum: 89700c8e3c8f2c59c87c8db8e7a070c97a3b30a4a38223aca6b8b817e6f2ca931f5a500e16ecadc1ebcfed2676cc60e073d8f887e621d84420298728ec6fd000 languageName: node linkType: hard @@ -3733,20 +3737,20 @@ __metadata: linkType: hard "@types/istanbul-lib-report@npm:*": - version: 3.0.0 - resolution: "@types/istanbul-lib-report@npm:3.0.0" + version: 3.0.1 + resolution: "@types/istanbul-lib-report@npm:3.0.1" dependencies: "@types/istanbul-lib-coverage": "*" - checksum: 656398b62dc288e1b5226f8880af98087233cdb90100655c989a09f3052b5775bf98ba58a16c5ae642fb66c61aba402e07a9f2bff1d1569e3b306026c59f3f36 + checksum: cfc66de48577bb7b2636a6afded7056483693c3ea70916276518cdfaa0d4b51bf564ded88fb13e75716665c3af3d4d54e9c2de042c0219dcabad7e81c398688b languageName: node linkType: hard "@types/istanbul-reports@npm:^3.0.0": - version: 3.0.1 - resolution: "@types/istanbul-reports@npm:3.0.1" + version: 3.0.2 + resolution: "@types/istanbul-reports@npm:3.0.2" dependencies: "@types/istanbul-lib-report": "*" - checksum: f1ad54bc68f37f60b30c7915886b92f86b847033e597f9b34f2415acdbe5ed742fa559a0a40050d74cdba3b6a63c342cac1f3a64dba5b68b66a6941f4abd7903 + checksum: f52028d6fe4d28f0085dd7ed66ccfa6af632579e9a4091b90928ffef93d4dbec0bacd49e9caf1b939d05df9eafc5ac1f5939413cdf8ac59fbe4b29602d4d0939 languageName: node linkType: hard @@ -3758,9 +3762,9 @@ __metadata: linkType: hard "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.4, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.7, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": - version: 7.0.12 - resolution: "@types/json-schema@npm:7.0.12" - checksum: 00239e97234eeb5ceefb0c1875d98ade6e922bfec39dd365ec6bd360b5c2f825e612ac4f6e5f1d13601b8b30f378f15e6faa805a3a732f4a1bbe61915163d293 + version: 7.0.13 + resolution: "@types/json-schema@npm:7.0.13" + checksum: 345df21a678fa72fb389f35f33de77833d09d4a142bb2bcb27c18690efa4cf70fc2876e43843cefb3fbdb9fcb12cd3e970a90936df30f53bbee899865ff605ab languageName: node linkType: hard @@ -3774,46 +3778,48 @@ __metadata: linkType: hard "@types/mdast@npm:^3.0.0": - version: 3.0.12 - resolution: "@types/mdast@npm:3.0.12" + version: 3.0.13 + resolution: "@types/mdast@npm:3.0.13" dependencies: "@types/unist": ^2 - checksum: 83adb8679b9d139f69f63554d120af921e9f1289e9903a2c99e0554a327c8524a6c0beccdc0721e4fdbccc606e81964fecb0d390d53df0f74360938e22f1a469 + checksum: f13fa17a2931ed1492a2f0012a3abd6de3a2d1128145981321909e03fedba80162668f284a4af92aca3732b27e933c5f4772336d96b9ae660bfde696d07abbe6 languageName: node linkType: hard "@types/mdurl@npm:^1.0.0": - version: 1.0.2 - resolution: "@types/mdurl@npm:1.0.2" - checksum: 79c7e523b377f53cf1f5a240fe23d0c6cae856667692bd21bf1d064eafe5ccc40ae39a2aa0a9a51e8c94d1307228c8f6b121e847124591a9a828c3baf65e86e2 + version: 1.0.3 + resolution: "@types/mdurl@npm:1.0.3" + checksum: 5bbed4f0eb9f60040fa26be77aa2158ca468b6423876cec0d2043e7f8298e83b8e5b95fb66056327b02d747c4d376aed16c11ff3fdc4cb3dca327a6931a71f18 languageName: node linkType: hard "@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 + version: 3.0.2 + resolution: "@types/mime@npm:3.0.2" + checksum: 09cf74f6377d1b27f4a24512cb689ad30af59880ac473ed6f7bc5285ecde88bbe8fe500789340ad57810da9d6fe1704f86e8bfe147b9ea76d58925204a60b906 languageName: node linkType: hard "@types/mime@npm:^1": - version: 1.3.2 - resolution: "@types/mime@npm:1.3.2" - checksum: 0493368244cced1a69cb791b485a260a422e6fcc857782e1178d1e6f219f1b161793e9f87f5fae1b219af0f50bee24fcbe733a18b4be8fdd07a38a8fb91146fd + version: 1.3.3 + resolution: "@types/mime@npm:1.3.3" + checksum: 7e27dede6517c1d604821a8a5412d6b7131decc8397ad4bac9216fc90dea26c9571426623ebeea2a9b89dbfb89ad98f7370a3c62cd2be8896c6e897333b117c9 languageName: node linkType: hard "@types/ms@npm:*": - version: 0.7.31 - resolution: "@types/ms@npm:0.7.31" - checksum: daadd354aedde024cce6f5aa873fefe7b71b22cd0e28632a69e8b677aeb48ae8caa1c60e5919bb781df040d116b01cb4316335167a3fc0ef6a63fa3614c0f6da + version: 0.7.32 + resolution: "@types/ms@npm:0.7.32" + checksum: 610744605c5924aa2657c8a62d307052af4f0e38e2aa015f154ef03391fabb4fd903f9c9baacb41f6e5798b8697e898463c351e5faf638738603ed29137b5254 languageName: node linkType: hard "@types/node@npm:*": - version: 20.4.1 - resolution: "@types/node@npm:20.4.1" - checksum: 22cbcc792f2eb636fe4188778ed0f32658ab872aa7fcb9847b3fa289a42b14b9f5e30c6faec50ef3c7adbc6c2a246926e5858136bb8b10c035a3fcaa6afbeed2 + version: 20.8.5 + resolution: "@types/node@npm:20.8.5" + dependencies: + undici-types: ~5.25.1 + checksum: 4bca4e4f6307a6f5dc78812015eca9c5a998b35fcf3ba4058c9851d3dde2b22c914fa25a85b804eab5af2ab95375d15943dce8e9ba5e01d15f4bf516ca0d2816 languageName: node linkType: hard @@ -3846,43 +3852,43 @@ __metadata: linkType: hard "@types/prop-types@npm:*, @types/prop-types@npm:^15.0.0": - version: 15.7.5 - resolution: "@types/prop-types@npm:15.7.5" - checksum: 5b43b8b15415e1f298243165f1d44390403bb2bd42e662bca3b5b5633fdd39c938e91b7fce3a9483699db0f7a715d08cef220c121f723a634972fdf596aec980 + version: 15.7.8 + resolution: "@types/prop-types@npm:15.7.8" + checksum: 61dfad79da8b1081c450bab83b77935df487ae1cdd4660ec7df6be8e74725c15fa45cf486ce057addc956ca4ae78300b97091e2a25061133d1b9a1440bc896ae languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + version: 6.9.8 + resolution: "@types/qs@npm:6.9.8" + checksum: c28e07d00d07970e5134c6eed184a0189b8a4649e28fdf36d9117fe671c067a44820890de6bdecef18217647a95e9c6aebdaaae69f5fe4b0bec9345db885f77e languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + version: 1.2.5 + resolution: "@types/range-parser@npm:1.2.5" + checksum: db9aaa04a02d019395a9a4346475669a2864a32a6477ad0fc457bd2ef39a167cabe742f55a8a3fa8bc90abac795b716c22b37348bc3e19313ebe6c9310815233 languageName: node linkType: hard "@types/react-dom@npm:^17.0.3": - version: 17.0.20 - resolution: "@types/react-dom@npm:17.0.20" + version: 17.0.21 + resolution: "@types/react-dom@npm:17.0.21" dependencies: "@types/react": ^17 - checksum: 525439fb14a033fc5dbe74711ecc50ec82273a528df9656594066a6219401e975101dafffd15d9a1a57a9442d52ea0c92eaacae09554dde27cd792e773f67467 + checksum: a2e3f068c1374601856b63bc57f3f436cf6270c1ba5c5cef0776def6de296c8bdd31c39b5be9e9e77f4652e923bef1e71ae377a2b038f4a81bfd0fec8d10d0d0 languageName: node linkType: hard "@types/react-router-config@npm:*, @types/react-router-config@npm:^5.0.6": - version: 5.0.7 - resolution: "@types/react-router-config@npm:5.0.7" + version: 5.0.8 + resolution: "@types/react-router-config@npm:5.0.8" dependencies: "@types/history": ^4.7.11 "@types/react": "*" "@types/react-router": ^5.1.0 - checksum: e7ecc3fc957a41a22d64c53529e801c434d8b3fb80d0b98e9fc614b2d34ede1b89ec32bbaf68ead8ec7e573a485ac6a5476142e6e659bbee0697599f206070a7 + checksum: afbd96e526fcdd19a3c8604912496a5a7ecfdcd848632a003ef8af69701ca74f14451e4fac93d265b678ca07c82ec4a103126f64c040a4aefa1a8172619be2bd languageName: node linkType: hard @@ -3908,33 +3914,33 @@ __metadata: linkType: hard "@types/react@npm:*": - version: 18.2.14 - resolution: "@types/react@npm:18.2.14" + version: 18.2.28 + resolution: "@types/react@npm:18.2.28" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: a6a5e8cc78f486b9020d1ad009aa6c56943c68c7c6376e0f8399e9cbcd950b7b8f5d73f00200f5379f5e58d31d57d8aed24357f301d8e86108cd438ce6c8b3dd + checksum: 81381bedeba83278f4c9febb0b83e0bd3f42a25897a50b9cb36ef53651d34b3d50f87ebf11211ea57ea575131f85d31e93e496ce46478a00b0f9bf7b26b5917a languageName: node linkType: hard "@types/react@npm:^17, @types/react@npm:^17.0.3": - version: 17.0.62 - resolution: "@types/react@npm:17.0.62" + version: 17.0.68 + resolution: "@types/react@npm:17.0.68" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 428a5aff44824ef504e9a9259b5894fe44a5db1c344b536990f07e132900ff5b34cbef0be77a84f30f37be1f88fc8b56dce328f568de8d65de3bfe414c05b2e1 + checksum: c6ca4415b53b1abe91162b29af541a1797a56a6f462ef796e8ebda3eaa4d0609205f4f17b3fce8d9a12235d4ffd8a67c47b5e018ed85c2f3bee0fba8f54638c1 languageName: node linkType: hard "@types/responselike@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/responselike@npm:1.0.0" + version: 1.0.1 + resolution: "@types/responselike@npm:1.0.1" dependencies: "@types/node": "*" - checksum: e99fc7cc6265407987b30deda54c1c24bb1478803faf6037557a774b2f034c5b097ffd65847daa87e82a61a250d919f35c3588654b0fdaa816906650f596d1b0 + checksum: ae8c36c9354aaedfa462dab655aa17613529d545a418acc54ba0214145fc1d0454be2ae107031a1b2c24768f19f2af7e4096a85d1e604010becd0bec2355cb0e languageName: node linkType: hard @@ -3946,96 +3952,96 @@ __metadata: linkType: hard "@types/sax@npm:^1.2.1": - version: 1.2.4 - resolution: "@types/sax@npm:1.2.4" + version: 1.2.5 + resolution: "@types/sax@npm:1.2.5" dependencies: "@types/node": "*" - checksum: 2aa50cbf1d1f0cf8541ef1787f94c7442e58e63900afd3b45c354e4140ed5efc5cf26fca8eb9df9970a74c7ea582293ae2083271bd046dedf4c3cc2689a40892 + checksum: a4bf27d7eb1b99030e75dea01fab2fa3959554f5c463b4f577dbbc9d8ed88a5b26b83ac84d045ae5a53e350057f120574db6e1c4e8507c011299dd023e4fa4f2 languageName: node linkType: hard "@types/scheduler@npm:*": - version: 0.16.3 - resolution: "@types/scheduler@npm:0.16.3" - checksum: 2b0aec39c24268e3ce938c5db2f2e77f5c3dd280e05c262d9c2fe7d890929e4632a6b8e94334017b66b45e4f92a5aa42ba3356640c2a1175fa37bef2f5200767 + version: 0.16.4 + resolution: "@types/scheduler@npm:0.16.4" + checksum: a57b0f10da1b021e6bd5eeef8a1917dd3b08a8715bd8029e2ded2096d8f091bb1bb1fef2d66e139588a983c4bfbad29b59e48011141725fa83c76e986e1257d7 languageName: node linkType: hard "@types/semver@npm:^7.3.12": - version: 7.5.0 - resolution: "@types/semver@npm:7.5.0" - checksum: 0a64b9b9c7424d9a467658b18dd70d1d781c2d6f033096a6e05762d20ebbad23c1b69b0083b0484722aabf35640b78ccc3de26368bcae1129c87e9df028a22e2 + version: 7.5.3 + resolution: "@types/semver@npm:7.5.3" + checksum: 349fdd1ab6c213bac5c991bac766bd07b8b12e63762462bb058740dcd2eb09c8193d068bb226f134661275f2022976214c0e727a4e5eb83ec1b131127c980d3e languageName: node linkType: hard "@types/send@npm:*": - version: 0.17.1 - resolution: "@types/send@npm:0.17.1" + version: 0.17.2 + resolution: "@types/send@npm:0.17.2" dependencies: "@types/mime": ^1 "@types/node": "*" - checksum: 10b620a5960058ef009afbc17686f680d6486277c62f640845381ec4baa0ea683fdd77c3afea4803daf5fcddd3fb2972c8aa32e078939f1d4e96f83195c89793 + checksum: 1ff5b1bd6a4f6fdc6402c7024781ff5dbd0e1f51a43c69529fb67c710943c7416d2f0d77c57c70fccf6616f25f838f32f960284526e408d4edae2e91e1fce95a languageName: node linkType: hard "@types/serve-index@npm:^1.9.1": - version: 1.9.1 - resolution: "@types/serve-index@npm:1.9.1" + version: 1.9.2 + resolution: "@types/serve-index@npm:1.9.2" dependencies: "@types/express": "*" - checksum: 026f3995fb500f6df7c3fe5009e53bad6d739e20b84089f58ebfafb2f404bbbb6162bbe33f72d2f2af32d5b8d3799c8e179793f90d9ed5871fb8591190bb6056 + checksum: 4fd0a8fcdd6e2b2d7704a539b7c1e0d143e9e00be4c3992394fe2ef7e9b67283d74b43db3f92b0e0717d779aa51184168bbae617d30456357cb95ec58aa59ea8 languageName: node linkType: hard "@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10": - version: 1.15.2 - resolution: "@types/serve-static@npm:1.15.2" + version: 1.15.3 + resolution: "@types/serve-static@npm:1.15.3" dependencies: "@types/http-errors": "*" "@types/mime": "*" "@types/node": "*" - checksum: 15c261dbfc57890f7cc17c04d5b22b418dfa0330c912b46c5d8ae2064da5d6f844ef7f41b63c7f4bbf07675e97ebe6ac804b032635ec742ae45d6f1274259b3e + checksum: afa52252f0ba94cdb5391e80f23e17fd629bdf2a31be8876e2c4490312ed6b0570822dd7de7cea04c9002049e207709563568b7f4ee10bb9f456321db1e83e40 languageName: node linkType: hard "@types/sockjs@npm:^0.3.33": - version: 0.3.33 - resolution: "@types/sockjs@npm:0.3.33" + version: 0.3.34 + resolution: "@types/sockjs@npm:0.3.34" dependencies: "@types/node": "*" - checksum: b9bbb2b5c5ead2fb884bb019f61a014e37410bddd295de28184e1b2e71ee6b04120c5ba7b9954617f0bdf962c13d06249ce65004490889c747c80d3f628ea842 + checksum: 1d38b1976a97f5895a6be00cead1b2a59d842f023b6e35450b7eec8a3131c860c447aba3f7ea3c880c066d8277b0c76fae9d080be1aad475811b568ed6079d49 languageName: node linkType: hard "@types/unist@npm:^2, @types/unist@npm:^2.0.0, @types/unist@npm:^2.0.2, @types/unist@npm:^2.0.3": - version: 2.0.7 - resolution: "@types/unist@npm:2.0.7" - checksum: b97a219554e83431f19a93ff113306bf0512909292815e8f32964e47d041c505af1aaa2a381c23e137c4c0b962fad58d4ce9c5c3256642921a466be43c1fc715 + version: 2.0.8 + resolution: "@types/unist@npm:2.0.8" + checksum: f4852d10a6752dc70df363917ef74453e5d2fd42824c0f6d09d19d530618e1402193977b1207366af4415aaec81d4e262c64d00345402020c4ca179216e553c7 languageName: node linkType: hard "@types/ws@npm:^8.5.5": - version: 8.5.5 - resolution: "@types/ws@npm:8.5.5" + version: 8.5.7 + resolution: "@types/ws@npm:8.5.7" dependencies: "@types/node": "*" - checksum: d00bf8070e6938e3ccf933010921c6ce78ac3606696ce37a393b27a9a603f7bd93ea64f3c5fa295a2f743575ba9c9a9fdb904af0f5fe2229bf2adf0630386e4a + checksum: 4502085c0f7ae6b36d5419c0fc6ce4b9002ee5e997a8708d6ed10b393e97091e1b986e8038ec604945c194f14aac150e74d6596629a2775628d122f552009c35 languageName: node linkType: hard "@types/yargs-parser@npm:*": - version: 21.0.0 - resolution: "@types/yargs-parser@npm:21.0.0" - checksum: b2f4c8d12ac18a567440379909127cf2cec393daffb73f246d0a25df36ea983b93b7e9e824251f959e9f928cbc7c1aab6728d0a0ff15d6145f66cec2be67d9a2 + version: 21.0.1 + resolution: "@types/yargs-parser@npm:21.0.1" + checksum: 64e6316c2045e2d460c4fb79572f872f9d2f98fddc6d9d3949c71f0b6ad0ef8a2706cf49db26dfb02a9cb81433abb8f340f015e1d20a9692279abe9477b72c8e languageName: node linkType: hard "@types/yargs@npm:^17.0.8": - version: 17.0.24 - resolution: "@types/yargs@npm:17.0.24" + version: 17.0.28 + resolution: "@types/yargs@npm:17.0.28" dependencies: "@types/yargs-parser": "*" - checksum: 5f3ac4dc4f6e211c1627340160fbe2fd247ceba002190da6cf9155af1798450501d628c9165a183f30a224fc68fa5e700490d740ff4c73e2cdef95bc4e8ba7bf + checksum: f78c5e5c29903933c0557b4ffcd1d0b8564d66859c8ca4aa51da3714e49109ed7c2644334a1918d033df19028f4cecc91fd2e502651bb8e8451f246c371da847 languageName: node linkType: hard @@ -4427,13 +4433,11 @@ __metadata: linkType: hard "agentkeepalive@npm:^4.2.1": - version: 4.3.0 - resolution: "agentkeepalive@npm:4.3.0" + version: 4.5.0 + resolution: "agentkeepalive@npm:4.5.0" dependencies: - debug: ^4.1.0 - depd: ^2.0.0 humanize-ms: ^1.2.1 - checksum: 982453aa44c11a06826c836025e5162c846e1200adb56f2d075400da7d32d87021b3b0a58768d949d824811f5654223d5a8a3dad120921a2439625eb847c6260 + checksum: 13278cd5b125e51eddd5079f04d6fe0914ac1b8b91c1f3db2c1822f99ac1a7457869068997784342fe455d59daaff22e14fb7b8c3da4e741896e7e31faf92481 languageName: node linkType: hard @@ -4506,35 +4510,35 @@ __metadata: linkType: hard "algoliasearch-helper@npm:^3.10.0": - version: 3.13.3 - resolution: "algoliasearch-helper@npm:3.13.3" + version: 3.14.2 + resolution: "algoliasearch-helper@npm:3.14.2" dependencies: "@algolia/events": ^4.0.1 peerDependencies: algoliasearch: ">= 3.1 < 6" - checksum: a59bcf0ee7811a75969d8accf5240a0f6cd5bed27c1ad3a899ce215b86b82603c861427fb017b9b0d3f32f5d147330de25bebf2cb798d304ed6a8b0af83c44bf + checksum: d66444b25fe8ee64675bb660ff1980870751818cb4a29c57bda6ca410372f2bfa031a455dcd5981941736db89d8294187c5b3bc1ce2a2567c6e43657ccd208b8 languageName: node linkType: hard -"algoliasearch@npm:^4.0.0, algoliasearch@npm:^4.13.1": - version: 4.18.0 - resolution: "algoliasearch@npm:4.18.0" +"algoliasearch@npm:^4.13.1, algoliasearch@npm:^4.19.1": + version: 4.20.0 + resolution: "algoliasearch@npm:4.20.0" dependencies: - "@algolia/cache-browser-local-storage": 4.18.0 - "@algolia/cache-common": 4.18.0 - "@algolia/cache-in-memory": 4.18.0 - "@algolia/client-account": 4.18.0 - "@algolia/client-analytics": 4.18.0 - "@algolia/client-common": 4.18.0 - "@algolia/client-personalization": 4.18.0 - "@algolia/client-search": 4.18.0 - "@algolia/logger-common": 4.18.0 - "@algolia/logger-console": 4.18.0 - "@algolia/requester-browser-xhr": 4.18.0 - "@algolia/requester-common": 4.18.0 - "@algolia/requester-node-http": 4.18.0 - "@algolia/transporter": 4.18.0 - checksum: 0ea62878610dc2cc02c8463fab06c8b6c960b3c90a1c09f9a23deb17d060a9efcf1a2f008824e109f3f0458e643e8345edede8edfc984a453831ff8134160806 + "@algolia/cache-browser-local-storage": 4.20.0 + "@algolia/cache-common": 4.20.0 + "@algolia/cache-in-memory": 4.20.0 + "@algolia/client-account": 4.20.0 + "@algolia/client-analytics": 4.20.0 + "@algolia/client-common": 4.20.0 + "@algolia/client-personalization": 4.20.0 + "@algolia/client-search": 4.20.0 + "@algolia/logger-common": 4.20.0 + "@algolia/logger-console": 4.20.0 + "@algolia/requester-browser-xhr": 4.20.0 + "@algolia/requester-common": 4.20.0 + "@algolia/requester-node-http": 4.20.0 + "@algolia/transporter": 4.20.0 + checksum: 078954944452f57d2e3b47c6ed4905caf797814324a4d5068a8b6685d434a885977a3e607714c5fb6eb29c7c3e717b3ee9cb01c8b2320e2c7bd73bcd8d42e70f languageName: node linkType: hard @@ -4600,6 +4604,13 @@ __metadata: languageName: node linkType: hard +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.1 + resolution: "ansi-sequence-parser@npm:1.1.1" + checksum: ead5b15c596e8e85ca02951a844366c6776769dcc9fd1bd3a0db11bb21364554822c6a439877fb599e7e1ffa0b5f039f1e5501423950457f3dcb2f480c30b188 + languageName: node + linkType: hard + "ansi-styles@npm:^3.2.1": version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" @@ -4707,15 +4718,15 @@ __metadata: linkType: hard "array-includes@npm:^3.1.6": - version: 3.1.6 - resolution: "array-includes@npm:3.1.6" + version: 3.1.7 + resolution: "array-includes@npm:3.1.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.3 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 is-string: ^1.0.7 - checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5 + checksum: 06f9e4598fac12a919f7c59a3f04f010ea07f0b7f0585465ed12ef528a60e45f374e79d1bddbb34cdd4338357d00023ddbd0ac18b0be36964f5e726e8965d7fc languageName: node linkType: hard @@ -4727,39 +4738,54 @@ __metadata: linkType: hard "array.prototype.flat@npm:^1.3.1": - version: 1.3.1 - resolution: "array.prototype.flat@npm:1.3.1" + version: 1.3.2 + resolution: "array.prototype.flat@npm:1.3.2" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 es-shim-unscopables: ^1.0.0 - checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b + checksum: 5d6b4bf102065fb3f43764bfff6feb3295d372ce89591e6005df3d0ce388527a9f03c909af6f2a973969a4d178ab232ffc9236654149173e0e187ec3a1a6b87b languageName: node linkType: hard "array.prototype.flatmap@npm:^1.3.1": - version: 1.3.1 - resolution: "array.prototype.flatmap@npm:1.3.1" + version: 1.3.2 + resolution: "array.prototype.flatmap@npm:1.3.2" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 es-shim-unscopables: ^1.0.0 - checksum: 8c1c43a4995f12cf12523436da28515184c753807b3f0bc2ca6c075f71c470b099e2090cc67dba8e5280958fea401c1d0c59e1db0143272aef6cd1103921a987 + checksum: ce09fe21dc0bcd4f30271f8144083aa8c13d4639074d6c8dc82054b847c7fc9a0c97f857491f4da19d4003e507172a78f4bcd12903098adac8b9cd374f734be3 languageName: node linkType: hard "array.prototype.tosorted@npm:^1.1.1": - version: 1.1.1 - resolution: "array.prototype.tosorted@npm:1.1.1" + version: 1.1.2 + resolution: "array.prototype.tosorted@npm:1.1.2" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 es-shim-unscopables: ^1.0.0 - get-intrinsic: ^1.1.3 - checksum: 7923324a67e70a2fc0a6e40237405d92395e45ebd76f5cb89c2a5cf1e66b47aca6baacd0cd628ffd88830b90d47fff268071493d09c9ae123645613dac2c2ca3 + get-intrinsic: ^1.2.1 + checksum: 3607a7d6b117f0ffa6f4012457b7af0d47d38cf05e01d50e09682fd2fb782a66093a5e5fbbdbad77c8c824794a9d892a51844041641f719ad41e3a974f0764de + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.2": + version: 1.0.2 + resolution: "arraybuffer.prototype.slice@npm:1.0.2" + dependencies: + array-buffer-byte-length: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + is-array-buffer: ^3.0.2 + is-shared-array-buffer: ^1.0.2 + checksum: c200faf437786f5b2c80d4564ff5481c886a16dee642ef02abdc7306c7edd523d1f01d1dd12b769c7eb42ac9bc53874510db19a92a2c035c0f6696172aafa5d3 languageName: node linkType: hard @@ -4783,14 +4809,24 @@ __metadata: linkType: hard "assert@npm:^2.0.0": - version: 2.0.0 - resolution: "assert@npm:2.0.0" + version: 2.1.0 + resolution: "assert@npm:2.1.0" + dependencies: + call-bind: ^1.0.2 + is-nan: ^1.3.2 + object-is: ^1.1.5 + object.assign: ^4.1.4 + util: ^0.12.5 + checksum: 1ed1cabba9abe55f4109b3f7292b4e4f3cf2953aad8dc148c0b3c3bd676675c31b1abb32ef563b7d5a19d1715bf90d1e5f09fad2a4ee655199468902da80f7c2 + languageName: node + linkType: hard + +"asynciterator.prototype@npm:^1.0.0": + version: 1.0.0 + resolution: "asynciterator.prototype@npm:1.0.0" dependencies: - es6-object-assign: ^1.1.0 - is-nan: ^1.2.1 - object-is: ^1.0.1 - util: ^0.12.0 - checksum: bb91f181a86d10588ee16c5e09c280f9811373974c29974cbe401987ea34e966699d7989a812b0e19377b511ea0bc627f5905647ce569311824848ede382cae8 + has-symbols: ^1.0.3 + checksum: e8ebfd9493ac651cf9b4165e9d64030b3da1d17181bb1963627b59e240cdaf021d9b59d44b827dc1dde4e22387ec04c2d0f8720cf58a1c282e34e40cc12721b3 languageName: node linkType: hard @@ -4802,12 +4838,12 @@ __metadata: linkType: hard "autoprefixer@npm:^10.4.12, autoprefixer@npm:^10.4.7": - version: 10.4.14 - resolution: "autoprefixer@npm:10.4.14" + version: 10.4.16 + resolution: "autoprefixer@npm:10.4.16" dependencies: - browserslist: ^4.21.5 - caniuse-lite: ^1.0.30001464 - fraction.js: ^4.2.0 + browserslist: ^4.21.10 + caniuse-lite: ^1.0.30001538 + fraction.js: ^4.3.6 normalize-range: ^0.1.2 picocolors: ^1.0.0 postcss-value-parser: ^4.2.0 @@ -4815,7 +4851,7 @@ __metadata: postcss: ^8.1.0 bin: autoprefixer: bin/autoprefixer - checksum: e9f18e664a4e4a54a8f4ec5f6b49ed228ec45afaa76efcae361c93721795dc5ab644f36d2fdfc0dea446b02a8067b9372f91542ea431994399e972781ed46d95 + checksum: 45fad7086495048dacb14bb7b00313e70e135b5d8e8751dcc60548889400763705ab16fc2d99ea628b44c3472698fb0e39598f595ba28409c965ab159035afde languageName: node linkType: hard @@ -4890,39 +4926,39 @@ __metadata: languageName: node linkType: hard -"babel-plugin-polyfill-corejs2@npm:^0.4.4": - version: 0.4.4 - resolution: "babel-plugin-polyfill-corejs2@npm:0.4.4" +"babel-plugin-polyfill-corejs2@npm:^0.4.6": + version: 0.4.6 + resolution: "babel-plugin-polyfill-corejs2@npm:0.4.6" dependencies: "@babel/compat-data": ^7.22.6 - "@babel/helper-define-polyfill-provider": ^0.4.1 - "@nicolo-ribaudo/semver-v6": ^6.3.3 + "@babel/helper-define-polyfill-provider": ^0.4.3 + semver: ^6.3.1 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0273f3d74ccbf78086a3b14bb11b1fb94933830f51c576a24229d75b3b91c8b357c3a381d4ab3146abf9b052fa4c33ec9368dd010ada9ee355e1d03ff64e1ff0 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 08896811df31530be6a9bcdd630cb9fd4b5ae5181039d18db3796efbc54e38d57a42af460845c10a04434e1bc45c0d47743c7e6c860383cc6b141083cde22030 languageName: node linkType: hard -"babel-plugin-polyfill-corejs3@npm:^0.8.2": - version: 0.8.2 - resolution: "babel-plugin-polyfill-corejs3@npm:0.8.2" +"babel-plugin-polyfill-corejs3@npm:^0.8.5": + version: 0.8.5 + resolution: "babel-plugin-polyfill-corejs3@npm:0.8.5" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.1 - core-js-compat: ^3.31.0 + "@babel/helper-define-polyfill-provider": ^0.4.3 + core-js-compat: ^3.32.2 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 0bc3e9e0114eba18f4fea8a9ff5a6016cae73b74cb091290c3f75fd7b9e34e712ee26f95b52d796f283970d7c6256fb01196e3608e8db03f620e3389d56d37c6 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 54ff3956c4f88e483d38b27ceec6199b9e73fceac10ebf969469d215e6a62929384e4433f85335c9a6ba809329636e27f9bdae2f54075f833e7a745341c07d84 languageName: node linkType: hard -"babel-plugin-polyfill-regenerator@npm:^0.5.1": - version: 0.5.1 - resolution: "babel-plugin-polyfill-regenerator@npm:0.5.1" +"babel-plugin-polyfill-regenerator@npm:^0.5.3": + version: 0.5.3 + resolution: "babel-plugin-polyfill-regenerator@npm:0.5.3" dependencies: - "@babel/helper-define-polyfill-provider": ^0.4.1 + "@babel/helper-define-polyfill-provider": ^0.4.3 peerDependencies: - "@babel/core": ^7.0.0-0 - checksum: 85a56d28b34586fbe482225fb6a9592fc793a459c5eea987a3427fb723c7aa2f76916348a9fc5e9ca48754ebf6086cfbb9226f4cd0cf9c6257f94553622562ed + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + checksum: 2bb546582cda1870d19e646a7183baeb2cccd56e0ef3e4eaeabd28e120daf17cb87399194a9ccdcf32506bcaa68d23e73440fc8ab990a7a0f8c5a77c12d5d4bc languageName: node linkType: hard @@ -5025,7 +5061,7 @@ __metadata: languageName: node linkType: hard -"bn.js@npm:^5.0.0, bn.js@npm:^5.1.1": +"bn.js@npm:^5.0.0, bn.js@npm:^5.2.1": version: 5.2.1 resolution: "bn.js@npm:5.2.1" checksum: 3dd8c8d38055fedfa95c1d5fc3c99f8dd547b36287b37768db0abab3c239711f88ff58d18d155dd8ad902b0b0cee973747b7ae20ea12a09473272b0201c9edd3 @@ -5190,7 +5226,7 @@ __metadata: languageName: node linkType: hard -"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.0.1": +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": version: 4.1.0 resolution: "browserify-rsa@npm:4.1.0" dependencies: @@ -5201,19 +5237,19 @@ __metadata: linkType: hard "browserify-sign@npm:^4.0.0": - version: 4.2.1 - resolution: "browserify-sign@npm:4.2.1" + version: 4.2.2 + resolution: "browserify-sign@npm:4.2.2" dependencies: - bn.js: ^5.1.1 - browserify-rsa: ^4.0.1 + bn.js: ^5.2.1 + browserify-rsa: ^4.1.0 create-hash: ^1.2.0 create-hmac: ^1.1.7 - elliptic: ^6.5.3 + elliptic: ^6.5.4 inherits: ^2.0.4 - parse-asn1: ^5.1.5 - readable-stream: ^3.6.0 - safe-buffer: ^5.2.0 - checksum: 0221f190e3f5b2d40183fa51621be7e838d9caa329fe1ba773406b7637855f37b30f5d83e52ff8f244ed12ffe6278dd9983638609ed88c841ce547e603855707 + parse-asn1: ^5.1.6 + readable-stream: ^3.6.2 + safe-buffer: ^5.2.1 + checksum: b622730c0fc183328c3a1c9fdaaaa5118821ed6822b266fa6b0375db7e20061ebec87301d61931d79b9da9a96ada1cab317fce3c68f233e5e93ed02dbb35544c languageName: node linkType: hard @@ -5226,17 +5262,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.18.1, browserslist@npm:^4.21.4, browserslist@npm:^4.21.5, browserslist@npm:^4.21.9": - version: 4.21.9 - resolution: "browserslist@npm:4.21.9" +"browserslist@npm:^4.0.0, browserslist@npm:^4.14.5, browserslist@npm:^4.18.1, browserslist@npm:^4.21.10, browserslist@npm:^4.21.4, browserslist@npm:^4.21.9, browserslist@npm:^4.22.1": + version: 4.22.1 + resolution: "browserslist@npm:4.22.1" dependencies: - caniuse-lite: ^1.0.30001503 - electron-to-chromium: ^1.4.431 - node-releases: ^2.0.12 - update-browserslist-db: ^1.0.11 + caniuse-lite: ^1.0.30001541 + electron-to-chromium: ^1.4.535 + node-releases: ^2.0.13 + update-browserslist-db: ^1.0.13 bin: browserslist: cli.js - checksum: 80d3820584e211484ad1b1a5cfdeca1dd00442f47be87e117e1dda34b628c87e18b81ae7986fa5977b3e6a03154f6d13cd763baa6b8bf5dd9dd19f4926603698 + checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 languageName: node linkType: hard @@ -5338,14 +5374,14 @@ __metadata: linkType: hard "cacache@npm:^17.0.0": - version: 17.1.3 - resolution: "cacache@npm:17.1.3" + version: 17.1.4 + resolution: "cacache@npm:17.1.4" dependencies: "@npmcli/fs": ^3.1.0 fs-minipass: ^3.0.0 glob: ^10.2.2 lru-cache: ^7.7.1 - minipass: ^5.0.0 + minipass: ^7.0.3 minipass-collect: ^1.0.2 minipass-flush: ^1.0.5 minipass-pipeline: ^1.2.4 @@ -5353,7 +5389,7 @@ __metadata: ssri: ^10.0.0 tar: ^6.1.11 unique-filename: ^3.0.0 - checksum: 385756781e1e21af089160d89d7462b7ed9883c978e848c7075b90b73cb823680e66092d61513050164588387d2ca87dd6d910e28d64bc13a9ac82cd8580c796 + checksum: b7751df756656954a51201335addced8f63fc53266fa56392c9f5ae83c8d27debffb4458ac2d168a744a4517ec3f2163af05c20097f93d17bdc2dc8a385e14a6 languageName: node linkType: hard @@ -5453,10 +5489,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001464, caniuse-lite@npm:^1.0.30001503": - version: 1.0.30001515 - resolution: "caniuse-lite@npm:1.0.30001515" - checksum: ec5d51785aea6af5cf62ca9d35821d36ab7fa0f85e3e7f752d532025ad59e07131fa3cb3a0a6c486b5ac8620c8c3440e761dc5b38c990d49c17655906f216123 +"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001538, caniuse-lite@npm:^1.0.30001541": + version: 1.0.30001547 + resolution: "caniuse-lite@npm:1.0.30001547" + checksum: ec0fc2b46721887f6f4aca1f3902f03d9a1a07416d16a86b7cd4bfba60e7b6b03ab3969659d3ea0158cc2f298972c80215c06c9457eb15c649d7780e8f5e91a7 languageName: node linkType: hard @@ -5474,7 +5510,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.0.1, chalk@npm:^2.1.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: @@ -5614,9 +5650,9 @@ __metadata: linkType: hard "ci-info@npm:^3.2.0": - version: 3.8.0 - resolution: "ci-info@npm:3.8.0" - checksum: d0a4d3160497cae54294974a7246202244fff031b0a6ea20dd57b10ec510aa17399c41a1b0982142c105f3255aff2173e5c0dd7302ee1b2f28ba3debda375098 + version: 3.9.0 + resolution: "ci-info@npm:3.9.0" + checksum: 6b19dc9b2966d1f8c2041a838217299718f15d6c4b63ae36e4674edd2bee48f780e94761286a56aa59eb305a85fbea4ddffb7630ec063e7ec7e7e5ad42549a87 languageName: node linkType: hard @@ -5878,9 +5914,9 @@ __metadata: linkType: hard "combine-promises@npm:^1.1.0": - version: 1.1.0 - resolution: "combine-promises@npm:1.1.0" - checksum: 23b55f66d5cea3ddf39608c07f7a96065c7bb7cc4f54c7f217040771262ad97e808b30f7f267c553a9ca95552fc9813fb465232f5d82e190e118b33238186af8 + version: 1.2.0 + resolution: "combine-promises@npm:1.2.0" + checksum: ddce91436e24da03d5dc360c59cd55abfc9da5e949a26255aa42761925c574797c43138f0aabfc364e184e738e5e218a94ac6e88ebc459045bcf048ac7fe5f07 languageName: node linkType: hard @@ -5898,6 +5934,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:7, commander@npm:^7.2.0": + version: 7.2.0 + resolution: "commander@npm:7.2.0" + checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + languageName: node + linkType: hard + "commander@npm:^2.20.0, commander@npm:^2.9.0": version: 2.20.3 resolution: "commander@npm:2.20.3" @@ -5912,13 +5955,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:^7.2.0": - version: 7.2.0 - resolution: "commander@npm:7.2.0" - checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc - languageName: node - linkType: hard - "commander@npm:^8.3.0": version: 8.3.0 resolution: "commander@npm:8.3.0" @@ -6092,6 +6128,13 @@ __metadata: languageName: node linkType: hard +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 63ae9933be5a2b8d4509daca5124e20c14d023c820258e484e32dc324d34c2754e71297c94a05784064ad27615037ef677e3f0c00469fb55f409d2bb21261035 + languageName: node + linkType: hard + "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" @@ -6152,26 +6195,26 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.31.0": - version: 3.31.1 - resolution: "core-js-compat@npm:3.31.1" +"core-js-compat@npm:^3.31.0, core-js-compat@npm:^3.32.2": + version: 3.33.0 + resolution: "core-js-compat@npm:3.33.0" dependencies: - browserslist: ^4.21.9 - checksum: 9a16d6992621f4e099169297381a28d5712cdef7df1fa85352a7c285a5885d5d7a117ec2eae9ad715ed88c7cc774787a22cdb8aceababf6775fbc8b0cbeccdb7 + browserslist: ^4.22.1 + checksum: 83ae54008c09b8e0ae3c59457039866c342c7e28b0d30eebb638a5b51c01432e63fe97695c90645cbc6a8b073a4f9a8b0e75f0818bbf8b4b054e01f4c17d3181 languageName: node linkType: hard "core-js-pure@npm:^3.30.2": - version: 3.31.1 - resolution: "core-js-pure@npm:3.31.1" - checksum: 93c3dd28471755cb81ec4828f5617bd32a7c682295d88671534a6733a0d41dae9e28f8f8000ddd1f1e597a3bec4602db5f906a03c9ba1a360534f7ae2519db7c + version: 3.33.0 + resolution: "core-js-pure@npm:3.33.0" + checksum: d47084a4de9a0cef9779eccd3ac9f435cf9fd7aa71794150cd4c6b305036bcc392d94766d4a7b6456bdd08faba7752d55c2ec40185bda161c3563081c9fa1e17 languageName: node linkType: hard "core-js@npm:^3.23.3": - version: 3.31.1 - resolution: "core-js@npm:3.31.1" - checksum: 14519213a63c55cf188bdd2f4dece54583feaf6b90e75d6c65e07f509cd487055bf64898aeda7c97c36029ac1ea2f2ed8e4b02281553f6a257e7143a32a14015 + version: 3.33.0 + resolution: "core-js@npm:3.33.0" + checksum: dd62217935ac281faf6f833bb306fb891162919fcf9c1f0c975b1b91e82ac09a940f5deb5950bbb582739ceef716e8bd7e4f9eab8328932fb029d3bc2ecb2881 languageName: node linkType: hard @@ -6182,6 +6225,24 @@ __metadata: languageName: node linkType: hard +"cose-base@npm:^1.0.0": + version: 1.0.3 + resolution: "cose-base@npm:1.0.3" + dependencies: + layout-base: ^1.0.0 + checksum: 3f3d592316df74adb215ca91e430f1c22b6e890bc0025b32ae1f6464c73fdb9614816cb40a8d38b40c6a3e9e7b8c64eda90d53fb9a4a6948abec17dad496f30b + languageName: node + linkType: hard + +"cose-base@npm:^2.2.0": + version: 2.2.0 + resolution: "cose-base@npm:2.2.0" + dependencies: + layout-base: ^2.0.0 + checksum: 2e694f340bf216c71fc126d237578a4168e138720011d0b48c88bf9bfc7fd45f912eff2c603ef3d1307d6e3ce6f465ed382285a764a3a6620db590c5457d2557 + languageName: node + linkType: hard + "cosmiconfig@npm:^6.0.0": version: 6.0.0 resolution: "cosmiconfig@npm:6.0.0" @@ -6209,14 +6270,19 @@ __metadata: linkType: hard "cosmiconfig@npm:^8.2.0": - version: 8.2.0 - resolution: "cosmiconfig@npm:8.2.0" + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" dependencies: - import-fresh: ^3.2.1 + import-fresh: ^3.3.0 js-yaml: ^4.1.0 - parse-json: ^5.0.0 + parse-json: ^5.2.0 path-type: ^4.0.0 - checksum: 836d5d8efa750f3fb17b03d6ca74cd3154ed025dffd045304b3ef59637f662bde1e5dc88f8830080d180ec60841719cf4ea2ce73fb21ec694b16865c478ff297 + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: dc339ebea427898c9e03bf01b56ba7afbac07fc7d2a2d5a15d6e9c14de98275a9565da949375aee1809591c152c0a3877bb86dbeaf74d5bd5aaa79955ad9e7a0 languageName: node linkType: hard @@ -6563,6 +6629,366 @@ __metadata: languageName: node linkType: hard +"cytoscape-cose-bilkent@npm:^4.1.0": + version: 4.1.0 + resolution: "cytoscape-cose-bilkent@npm:4.1.0" + dependencies: + cose-base: ^1.0.0 + peerDependencies: + cytoscape: ^3.2.0 + checksum: bea6aa139e21bf4135b01b99f8778eed061e074d1a1689771597e8164a999d66f4075d46be584b0a88a5447f9321f38c90c8821df6a9322faaf5afebf4848d97 + languageName: node + linkType: hard + +"cytoscape-fcose@npm:^2.1.0": + version: 2.2.0 + resolution: "cytoscape-fcose@npm:2.2.0" + dependencies: + cose-base: ^2.2.0 + peerDependencies: + cytoscape: ^3.2.0 + checksum: 94ffe6f131f9c08c2a0a7a6ce1c6c5e523a395bf8d84eba6d4a5f85e23f33788ea3ff807540861a5f78a6914a27729e06a7e6f66784f4f28ea1c030acf500121 + languageName: node + linkType: hard + +"cytoscape@npm:^3.23.0": + version: 3.26.0 + resolution: "cytoscape@npm:3.26.0" + dependencies: + heap: ^0.2.6 + lodash: ^4.17.21 + checksum: c6a3b2fbe99009cde6e5e2eb6ff2e0469b37f3e12b0828d676aa3c25a7ce7b6ed689b6765e9d3975d51c718a7870e358c639c9128352813b95eb342ef64a26b8 + languageName: node + linkType: hard + +"d3-array@npm:2 - 3, d3-array@npm:2.10.0 - 3, d3-array@npm:2.5.0 - 3, d3-array@npm:3, d3-array@npm:^3.2.0": + version: 3.2.4 + resolution: "d3-array@npm:3.2.4" + dependencies: + internmap: 1 - 2 + checksum: a5976a6d6205f69208478bb44920dd7ce3e788c9dceb86b304dbe401a4bfb42ecc8b04c20facde486e9adcb488b5d1800d49393a3f81a23902b68158e12cddd0 + languageName: node + linkType: hard + +"d3-axis@npm:3": + version: 3.0.0 + resolution: "d3-axis@npm:3.0.0" + checksum: 227ddaa6d4bad083539c1ec245e2228b4620cca941997a8a650cb0af239375dc20271993127eedac66f0543f331027aca09385e1e16eed023f93eac937cddf0b + languageName: node + linkType: hard + +"d3-brush@npm:3": + version: 3.0.0 + resolution: "d3-brush@npm:3.0.0" + dependencies: + d3-dispatch: 1 - 3 + d3-drag: 2 - 3 + d3-interpolate: 1 - 3 + d3-selection: 3 + d3-transition: 3 + checksum: 1d042167769a02ac76271c71e90376d7184206e489552b7022a8ec2860209fe269db55e0a3430f3dcbe13b6fec2ff65b1adeaccba3218991b38e022390df72e3 + languageName: node + linkType: hard + +"d3-chord@npm:3": + version: 3.0.1 + resolution: "d3-chord@npm:3.0.1" + dependencies: + d3-path: 1 - 3 + checksum: ddf35d41675e0f8738600a8a2f05bf0858def413438c12cba357c5802ecc1014c80a658acbbee63cbad2a8c747912efb2358455d93e59906fe37469f1dc6b78b + languageName: node + linkType: hard + +"d3-color@npm:1 - 3, d3-color@npm:3": + version: 3.1.0 + resolution: "d3-color@npm:3.1.0" + checksum: 4931fbfda5d7c4b5cfa283a13c91a954f86e3b69d75ce588d06cde6c3628cebfc3af2069ccf225e982e8987c612aa7948b3932163ce15eb3c11cd7c003f3ee3b + languageName: node + linkType: hard + +"d3-contour@npm:4": + version: 4.0.2 + resolution: "d3-contour@npm:4.0.2" + dependencies: + d3-array: ^3.2.0 + checksum: 56aa082c1acf62a45b61c8d29fdd307041785aa17d9a07de7d1d848633769887a33fb6823888afa383f31c460d0f21d24756593e84e334ddb92d774214d32f1b + languageName: node + linkType: hard + +"d3-delaunay@npm:6": + version: 6.0.4 + resolution: "d3-delaunay@npm:6.0.4" + dependencies: + delaunator: 5 + checksum: ce6d267d5ef21a8aeadfe4606329fc80a22ab6e7748d47bc220bcc396ee8be84b77a5473033954c5ac4aa522d265ddc45d4165d30fe4787dd60a15ea66b9bbb4 + languageName: node + linkType: hard + +"d3-dispatch@npm:1 - 3, d3-dispatch@npm:3": + version: 3.0.1 + resolution: "d3-dispatch@npm:3.0.1" + checksum: fdfd4a230f46463e28e5b22a45dd76d03be9345b605e1b5dc7d18bd7ebf504e6c00ae123fd6d03e23d9e2711e01f0e14ea89cd0632545b9f0c00b924ba4be223 + languageName: node + linkType: hard + +"d3-drag@npm:2 - 3, d3-drag@npm:3": + version: 3.0.0 + resolution: "d3-drag@npm:3.0.0" + dependencies: + d3-dispatch: 1 - 3 + d3-selection: 3 + checksum: d297231e60ecd633b0d076a63b4052b436ddeb48b5a3a11ff68c7e41a6774565473a6b064c5e9256e88eca6439a917ab9cea76032c52d944ddbf4fd289e31111 + languageName: node + linkType: hard + +"d3-dsv@npm:1 - 3, d3-dsv@npm:3": + version: 3.0.1 + resolution: "d3-dsv@npm:3.0.1" + dependencies: + commander: 7 + iconv-lite: 0.6 + rw: 1 + bin: + csv2json: bin/dsv2json.js + csv2tsv: bin/dsv2dsv.js + dsv2dsv: bin/dsv2dsv.js + dsv2json: bin/dsv2json.js + json2csv: bin/json2dsv.js + json2dsv: bin/json2dsv.js + json2tsv: bin/json2dsv.js + tsv2csv: bin/dsv2dsv.js + tsv2json: bin/dsv2json.js + checksum: 5fc0723647269d5dccd181d74f2265920ab368a2868b0b4f55ffa2fecdfb7814390ea28622cd61ee5d9594ab262879509059544e9f815c54fe76fbfb4ffa4c8a + languageName: node + linkType: hard + +"d3-ease@npm:1 - 3, d3-ease@npm:3": + version: 3.0.1 + resolution: "d3-ease@npm:3.0.1" + checksum: 06e2ee5326d1e3545eab4e2c0f84046a123dcd3b612e68858219aa034da1160333d9ce3da20a1d3486d98cb5c2a06f7d233eee1bc19ce42d1533458bd85dedcd + languageName: node + linkType: hard + +"d3-fetch@npm:3": + version: 3.0.1 + resolution: "d3-fetch@npm:3.0.1" + dependencies: + d3-dsv: 1 - 3 + checksum: 382dcea06549ef82c8d0b719e5dc1d96286352579e3b51b20f71437f5800323315b09cf7dcfd4e1f60a41e1204deb01758470cea257d2285a7abd9dcec806984 + languageName: node + linkType: hard + +"d3-force@npm:3": + version: 3.0.0 + resolution: "d3-force@npm:3.0.0" + dependencies: + d3-dispatch: 1 - 3 + d3-quadtree: 1 - 3 + d3-timer: 1 - 3 + checksum: 6c7e96438cab62fa32aeadb0ade3297b62b51f81b1b38b0a60a5ec9fd627d74090c1189654d92df2250775f31b06812342f089f1d5947de9960a635ee3581def + languageName: node + linkType: hard + +"d3-format@npm:1 - 3, d3-format@npm:3": + version: 3.1.0 + resolution: "d3-format@npm:3.1.0" + checksum: f345ec3b8ad3cab19bff5dead395bd9f5590628eb97a389b1dd89f0b204c7c4fc1d9520f13231c2c7cf14b7c9a8cf10f8ef15bde2befbab41454a569bd706ca2 + languageName: node + linkType: hard + +"d3-geo@npm:3": + version: 3.1.0 + resolution: "d3-geo@npm:3.1.0" + dependencies: + d3-array: 2.5.0 - 3 + checksum: adf82b0c105c0c5951ae0a833d4dfc479a563791ad7938579fa14e1cffd623b469d8aa7a37dc413a327fb6ac56880f3da3f6c43d4abe3c923972dd98f34f37d1 + languageName: node + linkType: hard + +"d3-hierarchy@npm:3": + version: 3.1.2 + resolution: "d3-hierarchy@npm:3.1.2" + checksum: 0fd946a8c5fd4686d43d3e11bbfc2037a145fda29d2261ccd0e36f70b66af6d7638e2c0c7112124d63fc3d3127197a00a6aecf676bd5bd392a94d7235a214263 + languageName: node + linkType: hard + +"d3-interpolate@npm:1 - 3, d3-interpolate@npm:1.2.0 - 3, d3-interpolate@npm:3": + version: 3.0.1 + resolution: "d3-interpolate@npm:3.0.1" + dependencies: + d3-color: 1 - 3 + checksum: a42ba314e295e95e5365eff0f604834e67e4a3b3c7102458781c477bd67e9b24b6bb9d8e41ff5521050a3f2c7c0c4bbbb6e187fd586daa3980943095b267e78b + languageName: node + linkType: hard + +"d3-path@npm:1 - 3, d3-path@npm:3, d3-path@npm:^3.1.0": + version: 3.1.0 + resolution: "d3-path@npm:3.1.0" + checksum: 2306f1bd9191e1eac895ec13e3064f732a85f243d6e627d242a313f9777756838a2215ea11562f0c7630c7c3b16a19ec1fe0948b1c82f3317fac55882f6ee5d8 + languageName: node + linkType: hard + +"d3-polygon@npm:3": + version: 3.0.1 + resolution: "d3-polygon@npm:3.0.1" + checksum: 0b85c532517895544683849768a2c377cee3801ef8ccf3fa9693c8871dd21a0c1a2a0fc75ff54192f0ba2c562b0da2bc27f5bf959dfafc7fa23573b574865d2c + languageName: node + linkType: hard + +"d3-quadtree@npm:1 - 3, d3-quadtree@npm:3": + version: 3.0.1 + resolution: "d3-quadtree@npm:3.0.1" + checksum: 5469d462763811475f34a7294d984f3eb100515b0585ca5b249656f6b1a6e99b20056a2d2e463cc9944b888896d2b1d07859c50f9c0cf23438df9cd2e3146066 + languageName: node + linkType: hard + +"d3-random@npm:3": + version: 3.0.1 + resolution: "d3-random@npm:3.0.1" + checksum: a70ad8d1cabe399ebeb2e482703121ac8946a3b336830b518da6848b9fdd48a111990fc041dc716f16885a72176ffa2898f2a250ca3d363ecdba5ef92b18e131 + languageName: node + linkType: hard + +"d3-scale-chromatic@npm:3": + version: 3.0.0 + resolution: "d3-scale-chromatic@npm:3.0.0" + dependencies: + d3-color: 1 - 3 + d3-interpolate: 1 - 3 + checksum: a8ce4cb0267a17b28ebbb929f5e3071d985908a9c13b6fcaa2a198e1e018f275804d691c5794b970df0049725b7944f32297b31603d235af6414004f0c7f82c0 + languageName: node + linkType: hard + +"d3-scale@npm:4": + version: 4.0.2 + resolution: "d3-scale@npm:4.0.2" + dependencies: + d3-array: 2.10.0 - 3 + d3-format: 1 - 3 + d3-interpolate: 1.2.0 - 3 + d3-time: 2.1.1 - 3 + d3-time-format: 2 - 4 + checksum: a9c770d283162c3bd11477c3d9d485d07f8db2071665f1a4ad23eec3e515e2cefbd369059ec677c9ac849877d1a765494e90e92051d4f21111aa56791c98729e + languageName: node + linkType: hard + +"d3-selection@npm:2 - 3, d3-selection@npm:3": + version: 3.0.0 + resolution: "d3-selection@npm:3.0.0" + checksum: f4e60e133309115b99f5b36a79ae0a19d71ee6e2d5e3c7216ef3e75ebd2cb1e778c2ed2fa4c01bef35e0dcbd96c5428f5bd6ca2184fe2957ed582fde6841cbc5 + languageName: node + linkType: hard + +"d3-shape@npm:3": + version: 3.2.0 + resolution: "d3-shape@npm:3.2.0" + dependencies: + d3-path: ^3.1.0 + checksum: de2af5fc9a93036a7b68581ca0bfc4aca2d5a328aa7ba7064c11aedd44d24f310c20c40157cb654359d4c15c3ef369f95ee53d71221017276e34172c7b719cfa + languageName: node + linkType: hard + +"d3-time-format@npm:2 - 4, d3-time-format@npm:4": + version: 4.1.0 + resolution: "d3-time-format@npm:4.1.0" + dependencies: + d3-time: 1 - 3 + checksum: 7342bce28355378152bbd4db4e275405439cabba082d9cd01946d40581140481c8328456d91740b0fe513c51ec4a467f4471ffa390c7e0e30ea30e9ec98fcdf4 + languageName: node + linkType: hard + +"d3-time@npm:1 - 3, d3-time@npm:2.1.1 - 3, d3-time@npm:3": + version: 3.1.0 + resolution: "d3-time@npm:3.1.0" + dependencies: + d3-array: 2 - 3 + checksum: 613b435352a78d9f31b7f68540788186d8c331b63feca60ad21c88e9db1989fe888f97f242322ebd6365e45ec3fb206a4324cd4ca0dfffa1d9b5feb856ba00a7 + languageName: node + linkType: hard + +"d3-timer@npm:1 - 3, d3-timer@npm:3": + version: 3.0.1 + resolution: "d3-timer@npm:3.0.1" + checksum: 1cfddf86d7bca22f73f2c427f52dfa35c49f50d64e187eb788dcad6e927625c636aa18ae4edd44d084eb9d1f81d8ca4ec305dae7f733c15846a824575b789d73 + languageName: node + linkType: hard + +"d3-transition@npm:2 - 3, d3-transition@npm:3": + version: 3.0.1 + resolution: "d3-transition@npm:3.0.1" + dependencies: + d3-color: 1 - 3 + d3-dispatch: 1 - 3 + d3-ease: 1 - 3 + d3-interpolate: 1 - 3 + d3-timer: 1 - 3 + peerDependencies: + d3-selection: 2 - 3 + checksum: cb1e6e018c3abf0502fe9ff7b631ad058efb197b5e14b973a410d3935aead6e3c07c67d726cfab258e4936ef2667c2c3d1cd2037feb0765f0b4e1d3b8788c0ea + languageName: node + linkType: hard + +"d3-zoom@npm:3": + version: 3.0.0 + resolution: "d3-zoom@npm:3.0.0" + dependencies: + d3-dispatch: 1 - 3 + d3-drag: 2 - 3 + d3-interpolate: 1 - 3 + d3-selection: 2 - 3 + d3-transition: 2 - 3 + checksum: 8056e3527281cfd1ccbcbc458408f86973b0583e9dac00e51204026d1d36803ca437f970b5736f02fafed9f2b78f145f72a5dbc66397e02d4d95d4c594b8ff54 + languageName: node + linkType: hard + +"d3@npm:^7.4.0, d3@npm:^7.8.2": + version: 7.8.5 + resolution: "d3@npm:7.8.5" + dependencies: + d3-array: 3 + d3-axis: 3 + d3-brush: 3 + d3-chord: 3 + d3-color: 3 + d3-contour: 4 + d3-delaunay: 6 + d3-dispatch: 3 + d3-drag: 3 + d3-dsv: 3 + d3-ease: 3 + d3-fetch: 3 + d3-force: 3 + d3-format: 3 + d3-geo: 3 + d3-hierarchy: 3 + d3-interpolate: 3 + d3-path: 3 + d3-polygon: 3 + d3-quadtree: 3 + d3-random: 3 + d3-scale: 4 + d3-scale-chromatic: 3 + d3-selection: 3 + d3-shape: 3 + d3-time: 3 + d3-time-format: 4 + d3-timer: 3 + d3-transition: 3 + d3-zoom: 3 + checksum: e407e79731f74d946a5eb8dec2f037b5a4ad33c294409b1d3531fdf7094de48adfe364974cb37e2396bdb81e23149d56d0ede716c004d6aebb52b3cc114cd15c + languageName: node + linkType: hard + +"dagre-d3-es@npm:7.0.9": + version: 7.0.9 + resolution: "dagre-d3-es@npm:7.0.9" + dependencies: + d3: ^7.8.2 + lodash-es: ^4.17.21 + checksum: 5f24ad9558e84066e70cfa6979320d93079979ac8b0a3b033e5330742aeeba74e205f66794ab6e0a82354b061a4e29c10a291590d7b2cf82b5780fab5443f5ba + languageName: node + linkType: hard + "datauri@npm:^3.0.0": version: 3.0.0 resolution: "datauri@npm:3.0.0" @@ -6573,6 +6999,13 @@ __metadata: languageName: node linkType: hard +"dayjs@npm:^1.11.7": + version: 1.11.10 + resolution: "dayjs@npm:1.11.10" + checksum: a6b5a3813b8884f5cd557e2e6b7fa569f4c5d0c97aca9558e38534af4f2d60daafd3ff8c2000fed3435cfcec9e805bcebd99f90130c6d1c5ef524084ced588c4 + languageName: node + linkType: hard + "debug@npm:2.6.9, debug@npm:^2.6.0": version: 2.6.9 resolution: "debug@npm:2.6.9" @@ -6644,7 +7077,7 @@ __metadata: languageName: node linkType: hard -"deepmerge@npm:^4.2.2": +"deepmerge@npm:^4.0.0, deepmerge@npm:^4.2.2": version: 4.3.1 resolution: "deepmerge@npm:4.3.1" checksum: 2024c6a980a1b7128084170c4cf56b0fd58a63f2da1660dcfe977415f27b17dbe5888668b59d0b063753f3220719d5e400b7f113609489c90160bb9a5518d052 @@ -6667,6 +7100,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.0.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: ^1.2.1 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.0 + checksum: a29855ad3f0630ea82e3c5012c812efa6ca3078d5c2aa8df06b5f597c1cde6f7254692df41945851d903e05a1668607b6d34e778f402b9ff9ffb38111f1a3f0d + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -6674,13 +7118,14 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0": - version: 1.2.0 - resolution: "define-properties@npm:1.2.0" +"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" dependencies: + define-data-property: ^1.0.1 has-property-descriptors: ^1.0.0 object-keys: ^1.1.1 - checksum: e60aee6a19b102df4e2b1f301816804e81ab48bb91f00d0d935f269bf4b3f79c88b39e4f89eaa132890d23267335fd1140dfcd8d5ccd61031a0a2c41a54e33a6 + checksum: b4ccd00597dd46cb2d4a379398f5b19fca84a16f3374e2249201992f36b30f6835949a9429669ee6b41b6e837205a163eadd745e472069e70dfc10f03e5fcc12 languageName: node linkType: hard @@ -6700,6 +7145,15 @@ __metadata: languageName: node linkType: hard +"delaunator@npm:5": + version: 5.0.0 + resolution: "delaunator@npm:5.0.0" + dependencies: + robust-predicates: ^3.0.0 + checksum: d6764188442b7f7c6bcacebd96edc00e35f542a96f1af3ef600e586bfb9849a3682c489c0ab423440c90bc4c7cac77f28761babff76fa29e193e1cf50a95b860 + languageName: node + linkType: hard + "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -6707,7 +7161,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0, depd@npm:^2.0.0": +"depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a @@ -6822,11 +7276,11 @@ __metadata: linkType: hard "dns-packet@npm:^5.2.2": - version: 5.6.0 - resolution: "dns-packet@npm:5.6.0" + version: 5.6.1 + resolution: "dns-packet@npm:5.6.1" dependencies: "@leichtgewicht/ip-codec": ^2.0.1 - checksum: 1b643814e5947a87620f8a906287079347492282964ce1c236d52c414e3e3941126b96581376b180ba6e66899e70b86b587bc1aa23e3acd9957765be952d83fc + checksum: 64c06457f0c6e143f7a0946e0aeb8de1c5f752217cfa143ef527467c00a6d78db1835cfdb6bb68333d9f9a4963cf23f410439b5262a8935cce1236f45e344b81 languageName: node linkType: hard @@ -6848,6 +7302,17 @@ __metadata: languageName: node linkType: hard +"docusaurus-plugin-typedoc@npm:1.0.0-next.17": + version: 1.0.0-next.17 + resolution: "docusaurus-plugin-typedoc@npm:1.0.0-next.17" + dependencies: + "@docusaurus/types": ^2.4.1 + peerDependencies: + typedoc-plugin-markdown: ">=4.0.0-next.22" + checksum: a8103fb2461b59eaf394a159ee6b23777d4994c17f9be8264e18e687e973f6c7fee273f66bf64eef3069f1144b712d1753e9a4709b0f367fde7fe8d52c625ce6 + languageName: node + linkType: hard + "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -6920,6 +7385,13 @@ __metadata: languageName: node linkType: hard +"dompurify@npm:2.4.3": + version: 2.4.3 + resolution: "dompurify@npm:2.4.3" + checksum: b440981f2a38cada2085759cc3d1e2f94571afc34343d011a8a6aa1ad91ae6abf651adbfa4994b0e2283f0ce81f7891cdb04b67d0b234c8d190cb70e9691f026 + languageName: node + linkType: hard + "domutils@npm:^2.5.2, domutils@npm:^2.8.0": version: 2.8.0 resolution: "domutils@npm:2.8.0" @@ -7020,14 +7492,21 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.431": - version: 1.4.456 - resolution: "electron-to-chromium@npm:1.4.456" - checksum: 40e508d643676a54f6418eab8000198c480c3f79e5c9a0c37f4e17e51f22cf86646e14f3fdf36273b84fb06727d815be818ea33758fed1c65b6b277900bce5e6 +"electron-to-chromium@npm:^1.4.535": + version: 1.4.554 + resolution: "electron-to-chromium@npm:1.4.554" + checksum: cbac43c50b43777327f4a7bf149ee3088c1da8b91bbcd80f78d2cc77bc52763f6d0941574499239d9caefd3430d3093f865e5f1093371418f7d6b70301eeae9b + languageName: node + linkType: hard + +"elkjs@npm:^0.8.2": + version: 0.8.2 + resolution: "elkjs@npm:0.8.2" + checksum: ed615c485fa4ac1e858af509df24fdc9f61f2c6576df5f79f6a31c733fda69f235f53cd36af037aa9d2b8a935cb4f823fbd89d784b67f6e51be5100306ea1b39 languageName: node linkType: hard -"elliptic@npm:^6.5.3": +"elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: @@ -7165,17 +7644,18 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": - version: 1.21.2 - resolution: "es-abstract@npm:1.21.2" +"es-abstract@npm:^1.22.1": + version: 1.22.2 + resolution: "es-abstract@npm:1.22.2" dependencies: array-buffer-byte-length: ^1.0.0 + arraybuffer.prototype.slice: ^1.0.2 available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 es-set-tostringtag: ^2.0.1 es-to-primitive: ^1.2.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.2.0 + function.prototype.name: ^1.1.6 + get-intrinsic: ^1.2.1 get-symbol-description: ^1.0.0 globalthis: ^1.0.3 gopd: ^1.0.1 @@ -7190,27 +7670,53 @@ __metadata: is-regex: ^1.1.4 is-shared-array-buffer: ^1.0.2 is-string: ^1.0.7 - is-typed-array: ^1.1.10 + is-typed-array: ^1.1.12 is-weakref: ^1.0.2 object-inspect: ^1.12.3 object-keys: ^1.1.1 object.assign: ^4.1.4 - regexp.prototype.flags: ^1.4.3 + regexp.prototype.flags: ^1.5.1 + safe-array-concat: ^1.0.1 safe-regex-test: ^1.0.0 - string.prototype.trim: ^1.2.7 - string.prototype.trimend: ^1.0.6 - string.prototype.trimstart: ^1.0.6 + string.prototype.trim: ^1.2.8 + string.prototype.trimend: ^1.0.7 + string.prototype.trimstart: ^1.0.7 + typed-array-buffer: ^1.0.0 + typed-array-byte-length: ^1.0.0 + typed-array-byte-offset: ^1.0.0 typed-array-length: ^1.0.4 unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.9 - checksum: 037f55ee5e1cdf2e5edbab5524095a4f97144d95b94ea29e3611b77d852fd8c8a40e7ae7101fa6a759a9b9b1405f188c3c70928f2d3cd88d543a07fc0d5ad41a + which-typed-array: ^1.1.11 + checksum: cc70e592d360d7d729859013dee7a610c6b27ed8630df0547c16b0d16d9fe6505a70ee14d1af08d970fdd132b3f88c9ca7815ce72c9011608abf8ab0e55fc515 + languageName: node + linkType: hard + +"es-iterator-helpers@npm:^1.0.12": + version: 1.0.15 + resolution: "es-iterator-helpers@npm:1.0.15" + dependencies: + asynciterator.prototype: ^1.0.0 + call-bind: ^1.0.2 + define-properties: ^1.2.1 + es-abstract: ^1.22.1 + es-set-tostringtag: ^2.0.1 + function-bind: ^1.1.1 + get-intrinsic: ^1.2.1 + globalthis: ^1.0.3 + has-property-descriptors: ^1.0.0 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + internal-slot: ^1.0.5 + iterator.prototype: ^1.1.2 + safe-array-concat: ^1.0.1 + checksum: 50081ae5c549efe62e5c1d244df0194b40b075f7897fc2116b7e1aa437eb3c41f946d2afda18c33f9b31266ec544765932542765af839f76fa6d7b7855d1e0e1 languageName: node linkType: hard "es-module-lexer@npm:^1.2.1": - version: 1.3.0 - resolution: "es-module-lexer@npm:1.3.0" - checksum: 48fd9f504a9d2a894126f75c8b7ccc6273a289983e9b67255f165bfd9ae765d50100218251e94e702ca567826905ea2f7b3b4a0c4d74d3ce99cce3a2a606a238 + version: 1.3.1 + resolution: "es-module-lexer@npm:1.3.1" + checksum: 3beafa7e171eb1e8cc45695edf8d51638488dddf65294d7911f8d6a96249da6a9838c87529262cc6ea53988d8272cec0f4bff93f476ed031a54ba3afb51a0ed3 languageName: node linkType: hard @@ -7245,13 +7751,6 @@ __metadata: languageName: node linkType: hard -"es6-object-assign@npm:^1.1.0": - version: 1.1.0 - resolution: "es6-object-assign@npm:1.1.0" - checksum: 8d4fdf63484d78b5c64cacc2c2e1165bc7b6a64b739d2a9db6a4dc8641d99cc9efb433cdd4dc3d3d6b00bfa6ce959694e4665e3255190339945c5f33b692b5d8 - languageName: node - linkType: hard - "es6-promise@npm:^4.0.3": version: 4.2.8 resolution: "es6-promise@npm:4.2.8" @@ -7304,13 +7803,14 @@ __metadata: linkType: hard "eslint-plugin-react@npm:^7.31.10": - version: 7.32.2 - resolution: "eslint-plugin-react@npm:7.32.2" + version: 7.33.2 + resolution: "eslint-plugin-react@npm:7.33.2" dependencies: array-includes: ^3.1.6 array.prototype.flatmap: ^1.3.1 array.prototype.tosorted: ^1.1.1 doctrine: ^2.1.0 + es-iterator-helpers: ^1.0.12 estraverse: ^5.3.0 jsx-ast-utils: ^2.4.1 || ^3.0.0 minimatch: ^3.1.2 @@ -7320,11 +7820,11 @@ __metadata: object.values: ^1.1.6 prop-types: ^15.8.1 resolve: ^2.0.0-next.4 - semver: ^6.3.0 + semver: ^6.3.1 string.prototype.matchall: ^4.0.8 peerDependencies: eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 - checksum: 2232b3b8945aa50b7773919c15cd96892acf35d2f82503667a79e2f55def90f728ed4f0e496f0f157acbe1bd4397c5615b676ae7428fe84488a544ca53feb944 + checksum: b4c3d76390b0ae6b6f9fed78170604cc2c04b48e6778a637db339e8e3911ec9ef22510b0ae77c429698151d0f1b245f282177f384105b6830e7b29b9c9b26610 languageName: node linkType: hard @@ -7360,43 +7860,43 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.0": - version: 7.2.0 - resolution: "eslint-scope@npm:7.2.0" +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: 64591a2d8b244ade9c690b59ef238a11d5c721a98bcee9e9f445454f442d03d3e04eda88e95a4daec558220a99fa384309d9faae3d459bd40e7a81b4063980ae + checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1": - version: 3.4.1 - resolution: "eslint-visitor-keys@npm:3.4.1" - checksum: f05121d868202736b97de7d750847a328fcfa8593b031c95ea89425333db59676ac087fa905eba438d0a3c5769632f828187e0c1a0d271832a2153c1d3661c2c +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 languageName: node linkType: hard "eslint@npm:^8.26.0": - version: 8.44.0 - resolution: "eslint@npm:8.44.0" + version: 8.51.0 + resolution: "eslint@npm:8.51.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.4.0 - "@eslint/eslintrc": ^2.1.0 - "@eslint/js": 8.44.0 - "@humanwhocodes/config-array": ^0.11.10 + "@eslint-community/regexpp": ^4.6.1 + "@eslint/eslintrc": ^2.1.2 + "@eslint/js": 8.51.0 + "@humanwhocodes/config-array": ^0.11.11 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 + ajv: ^6.12.4 chalk: ^4.0.0 cross-spawn: ^7.0.2 debug: ^4.3.2 doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.0 - eslint-visitor-keys: ^3.4.1 - espree: ^9.6.0 + eslint-scope: ^7.2.2 + eslint-visitor-keys: ^3.4.3 + espree: ^9.6.1 esquery: ^1.4.2 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 @@ -7406,7 +7906,6 @@ __metadata: globals: ^13.19.0 graphemer: ^1.4.0 ignore: ^5.2.0 - import-fresh: ^3.0.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 is-path-inside: ^3.0.3 @@ -7418,22 +7917,21 @@ __metadata: natural-compare: ^1.4.0 optionator: ^0.9.3 strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: d06309ce4aafb9d27d558c8e5e5aa5cba3bbec3ce8ceccbc7d4b7a35f2b67fd40189159155553270e2e6febeb69bd8a3b60d6241c8f5ddc2ef1702ccbd328501 + checksum: 214fa5d1fcb67af1b8992ce9584ccd85e1aa7a482f8b8ea5b96edc28fa838a18a3b69456db45fc1ed3ef95f1e9efa9714f737292dc681e572d471d02fda9649c languageName: node linkType: hard -"espree@npm:^9.6.0": - version: 9.6.0 - resolution: "espree@npm:9.6.0" +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" dependencies: acorn: ^8.9.0 acorn-jsx: ^5.3.2 eslint-visitor-keys: ^3.4.1 - checksum: 1287979510efb052a6a97c73067ea5d0a40701b29adde87bbe2d3eb1667e39ca55e8129e20e2517fed3da570150e7ef470585228459a8f3e3755f45007a1c662 + checksum: eb8c149c7a2a77b3f33a5af80c10875c3abd65450f60b8af6db1bfcfa8f101e21c1e56a561c6dc13b848e18148d43469e7cd208506238554fb5395a9ea5a1ab9 languageName: node linkType: hard @@ -7664,15 +8162,15 @@ __metadata: linkType: hard "fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": - version: 3.3.0 - resolution: "fast-glob@npm:3.3.0" + version: 3.3.1 + resolution: "fast-glob@npm:3.3.1" dependencies: "@nodelib/fs.stat": ^2.0.2 "@nodelib/fs.walk": ^1.2.3 glob-parent: ^5.1.2 merge2: ^1.3.0 micromatch: ^4.0.4 - checksum: 20df62be28eb5426fe8e40e0d05601a63b1daceb7c3d87534afcad91bdcf1e4b1743cf2d5247d6e225b120b46df0b9053a032b2691ba34ee121e033acd81f547 + checksum: b6f3add6403e02cf3a798bfbb1183d0f6da2afd368f27456010c0bc1f9640aea308243d4cb2c0ab142f618276e65ecb8be1661d7c62a7b4e5ba774b9ce5432e5 languageName: node linkType: hard @@ -7936,19 +8434,20 @@ __metadata: linkType: hard "flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" + version: 3.1.1 + resolution: "flat-cache@npm:3.1.1" dependencies: - flatted: ^3.1.0 + flatted: ^3.2.9 + keyv: ^4.5.3 rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + checksum: 4958cfe0f46acf84953d4e16676ef5f0d38eab3a92d532a1e8d5f88f11eea8b36d5d598070ff2aeae15f1fde18f8d7d089eefaf9db10b5a587cc1c9072325c7a languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: f14167fbe26a9d20f6fca8d998e8f1f41df72c8e81f9f2c9d61ed2bea058248f5e1cbd05e7f88c0e5087a6a0b822a1e5e2b446e879f3cfbe0b07ba2d7f80b026 languageName: node linkType: hard @@ -7991,12 +8490,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.14.7": - version: 1.15.2 - resolution: "follow-redirects@npm:1.15.2" + version: 1.15.3 + resolution: "follow-redirects@npm:1.15.3" peerDependenciesMeta: debug: optional: true - checksum: faa66059b66358ba65c234c2f2a37fcec029dc22775f35d9ad6abac56003268baf41e55f9ee645957b32c7d9f62baf1f0b906e68267276f54ec4b4c597c2b190 + checksum: 584da22ec5420c837bd096559ebfb8fe69d82512d5585004e36a3b4a6ef6d5905780e0c74508c7b72f907d1fa2b7bd339e613859e9c304d0dc96af2027fd0231 languageName: node linkType: hard @@ -8064,10 +8563,10 @@ __metadata: languageName: node linkType: hard -"fraction.js@npm:^4.2.0": - version: 4.2.0 - resolution: "fraction.js@npm:4.2.0" - checksum: 8c76a6e21dedea87109d6171a0ac77afa14205794a565d71cb10d2925f629a3922da61bf45ea52dbc30bce4d8636dc0a27213a88cbd600eab047d82f9a3a94c5 +"fraction.js@npm:^4.3.6": + version: 4.3.7 + resolution: "fraction.js@npm:4.3.7" + checksum: e1553ae3f08e3ba0e8c06e43a3ab20b319966dfb7ddb96fd9b5d0ee11a66571af7f993229c88ebbb0d4a816eb813a24ed48207b140d442a8f76f33763b8d1f3f languageName: node linkType: hard @@ -8146,18 +8645,18 @@ __metadata: linkType: hard "fs-minipass@npm:^3.0.0": - version: 3.0.2 - resolution: "fs-minipass@npm:3.0.2" + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" dependencies: - minipass: ^5.0.0 - checksum: e9cc0e1f2d01c6f6f62f567aee59530aba65c6c7b2ae88c5027bc34c711ebcfcfaefd0caf254afa6adfe7d1fba16bc2537508a6235196bac7276747d078aef0a + minipass: ^7.0.3 + checksum: 8722a41109130851d979222d3ec88aabaceeaaf8f57b2a8f744ef8bd2d1ce95453b04a61daa0078822bc5cd21e008814f06fe6586f56fef511e71b8d2394d802 languageName: node linkType: hard "fs-monkey@npm:^1.0.4": - version: 1.0.4 - resolution: "fs-monkey@npm:1.0.4" - checksum: 8b254c982905c0b7e028eab22b410dc35a5c0019c1c860456f5f54ae6a61666e1cb8c6b700d6c88cc873694c00953c935847b9959cc4dcf274aacb8673c1e8bf + version: 1.0.5 + resolution: "fs-monkey@npm:1.0.5" + checksum: 424b67f65b37fe66117ae2bb061f790fe6d4b609e1d160487c74b3d69fbf42f262c665ccfba32e8b5f113f96f92e9a58fcdebe42d5f6649bdfc72918093a3119 languageName: node linkType: hard @@ -8181,18 +8680,18 @@ __metadata: linkType: hard "fsevents@npm:~2.3.2": - version: 2.3.2 - resolution: "fsevents@npm:2.3.2" + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 conditions: os=darwin languageName: node linkType: hard "fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" dependencies: node-gyp: latest conditions: os=darwin @@ -8200,25 +8699,25 @@ __metadata: linkType: hard "function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" +"function.prototype.name@npm:^1.1.5, function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + functions-have-names: ^1.2.3 + checksum: 7a3f9bd98adab09a07f6e1f03da03d3f7c26abbdeaeee15223f6c04a9fb5674792bdf5e689dac19b97ac71de6aad2027ba3048a9b883aa1b3173eed6ab07f479 languageName: node linkType: hard -"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 @@ -8262,7 +8761,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0": +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1": version: 1.2.1 resolution: "get-intrinsic@npm:1.2.1" dependencies: @@ -8395,17 +8894,17 @@ __metadata: linkType: hard "glob@npm:^10.2.2": - version: 10.3.3 - resolution: "glob@npm:10.3.3" + version: 10.3.10 + resolution: "glob@npm:10.3.10" dependencies: foreground-child: ^3.1.0 - jackspeak: ^2.0.3 + jackspeak: ^2.3.5 minimatch: ^9.0.1 minipass: ^5.0.0 || ^6.0.2 || ^7.0.0 path-scurry: ^1.10.1 bin: - glob: dist/cjs/src/bin.js - checksum: 29190d3291f422da0cb40b77a72fc8d2c51a36524e99b8bf412548b7676a6627489528b57250429612b6eec2e6fe7826d328451d3e694a9d15e575389308ec53 + glob: dist/esm/bin.mjs + checksum: 4f2fe2511e157b5a3f525a54092169a5f92405f24d2aed3142f4411df328baca13059f4182f1db1bf933e2c69c0bd89e57ae87edd8950cba8c7ccbe84f721cf3 languageName: node linkType: hard @@ -8491,11 +8990,11 @@ __metadata: linkType: hard "globals@npm:^13.19.0": - version: 13.20.0 - resolution: "globals@npm:13.20.0" + version: 13.23.0 + resolution: "globals@npm:13.23.0" dependencies: type-fest: ^0.20.2 - checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a + checksum: 194c97cf8d1ef6ba59417234c2386549c4103b6e5f24b1ff1952de61a4753e5d2069435ba629de711a6480b1b1d114a98e2ab27f85e966d5a10c319c3bbd3dc3 languageName: node linkType: hard @@ -8692,11 +9191,9 @@ __metadata: linkType: hard "has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + version: 1.0.4 + resolution: "has@npm:1.0.4" + checksum: 8a11ba062e0627c9578a1d08285401e39f1d071a9692ddf793199070edb5648b21c774dd733e2a181edd635bf6862731885f476f4ccf67c998d7a5ff7cef2550 languageName: node linkType: hard @@ -8918,6 +9415,13 @@ __metadata: languageName: node linkType: hard +"heap@npm:^0.2.6": + version: 0.2.7 + resolution: "heap@npm:0.2.7" + checksum: b0f3963a799e02173f994c452921a777f2b895b710119df999736bfed7477235c2860c423d9aea18a9f3b3d065cb1114d605c208cfcb8d0ac550f97ec5d28cb0 + languageName: node + linkType: hard + "highlight.js@npm:^10.4.1, highlight.js@npm:~10.7.0": version: 10.7.3 resolution: "highlight.js@npm:10.7.3" @@ -9240,7 +9744,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -9308,7 +9812,7 @@ __metadata: languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": +"import-fresh@npm:^3.1.0, import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -9422,7 +9926,7 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3, internal-slot@npm:^1.0.5": +"internal-slot@npm:^1.0.5": version: 1.0.5 resolution: "internal-slot@npm:1.0.5" dependencies: @@ -9433,6 +9937,13 @@ __metadata: languageName: node linkType: hard +"internmap@npm:1 - 2": + version: 2.0.3 + resolution: "internmap@npm:2.0.3" + checksum: 7ca41ec6aba8f0072fc32fa8a023450a9f44503e2d8e403583c55714b25efd6390c38a87161ec456bf42d7bc83aab62eb28f5aef34876b1ac4e60693d5e1d241 + languageName: node + linkType: hard + "interpret@npm:^1.0.0": version: 1.4.0 resolution: "interpret@npm:1.4.0" @@ -9522,6 +10033,15 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.0.0 + resolution: "is-async-function@npm:2.0.0" + dependencies: + has-tostringtag: ^1.0.0 + checksum: e3471d95e6c014bf37cad8a93f2f4b6aac962178e0a5041e8903147166964fdc1c5c1d2ef87e86d77322c370ca18f2ea004fa7420581fa747bcaf7c223069dbd + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -9586,16 +10106,16 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.12.0, is-core-module@npm:^2.9.0": - version: 2.12.1 - resolution: "is-core-module@npm:2.12.1" +"is-core-module@npm:^2.13.0": + version: 2.13.0 + resolution: "is-core-module@npm:2.13.0" dependencies: has: ^1.0.3 - checksum: f04ea30533b5e62764e7b2e049d3157dc0abd95ef44275b32489ea2081176ac9746ffb1cdb107445cf1ff0e0dfcad522726ca27c27ece64dadf3795428b8e468 + checksum: 053ab101fb390bfeb2333360fd131387bed54e476b26860dc7f5a700bbf34a0ec4454f7c8c4d43e8a0030957e4b3db6e16d35e1890ea6fb654c833095e040355 languageName: node linkType: hard -"is-date-object@npm:^1.0.1": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -9634,6 +10154,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.0.2": + version: 1.0.2 + resolution: "is-finalizationregistry@npm:1.0.2" + dependencies: + call-bind: ^1.0.2 + checksum: 4f243a8e06228cd45bdab8608d2cb7abfc20f6f0189c8ac21ea8d603f1f196eabd531ce0bb8e08cbab047e9845ef2c191a3761c9a17ad5cabf8b35499c4ad35d + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^2.0.0": version: 2.0.0 resolution: "is-fullwidth-code-point@npm:2.0.0" @@ -9648,7 +10177,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -9700,7 +10229,14 @@ __metadata: languageName: node linkType: hard -"is-nan@npm:^1.2.1": +"is-map@npm:^2.0.1": + version: 2.0.2 + resolution: "is-map@npm:2.0.2" + checksum: ace3d0ecd667bbdefdb1852de601268f67f2db725624b1958f279316e13fecb8fa7df91fd60f690d7417b4ec180712f5a7ee967008e27c65cfd475cc84337728 + languageName: node + linkType: hard + +"is-nan@npm:^1.3.2": version: 1.3.2 resolution: "is-nan@npm:1.3.2" dependencies: @@ -9814,6 +10350,13 @@ __metadata: languageName: node linkType: hard +"is-plain-object@npm:^5.0.0": + version: 5.0.0 + resolution: "is-plain-object@npm:5.0.0" + checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + languageName: node + linkType: hard + "is-redirect@npm:^1.0.0": version: 1.0.0 resolution: "is-redirect@npm:1.0.0" @@ -9852,6 +10395,13 @@ __metadata: languageName: node linkType: hard +"is-set@npm:^2.0.1": + version: 2.0.2 + resolution: "is-set@npm:2.0.2" + checksum: b64343faf45e9387b97a6fd32be632ee7b269bd8183701f3b3f5b71a7cf00d04450ed8669d0bd08753e08b968beda96fca73a10fd0ff56a32603f64deba55a57 + languageName: node + linkType: hard + "is-shared-array-buffer@npm:^1.0.2": version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" @@ -9893,16 +10443,12 @@ __metadata: languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": - version: 1.1.10 - resolution: "is-typed-array@npm:1.1.10" +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.3, is-typed-array@npm:^1.1.9": + version: 1.1.12 + resolution: "is-typed-array@npm:1.1.12" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + which-typed-array: ^1.1.11 + checksum: 4c89c4a3be07186caddadf92197b17fda663a9d259ea0d44a85f171558270d36059d1c386d34a12cba22dfade5aba497ce22778e866adc9406098c8fc4771796 languageName: node linkType: hard @@ -9920,6 +10466,13 @@ __metadata: languageName: node linkType: hard +"is-weakmap@npm:^2.0.1": + version: 2.0.1 + resolution: "is-weakmap@npm:2.0.1" + checksum: 1222bb7e90c32bdb949226e66d26cb7bce12e1e28e3e1b40bfa6b390ba3e08192a8664a703dff2a00a84825f4e022f9cd58c4599ff9981ab72b1d69479f4f7f6 + languageName: node + linkType: hard + "is-weakref@npm:^1.0.2": version: 1.0.2 resolution: "is-weakref@npm:1.0.2" @@ -9929,6 +10482,16 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.1": + version: 2.0.2 + resolution: "is-weakset@npm:2.0.2" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.1.1 + checksum: 5d8698d1fa599a0635d7ca85be9c26d547b317ed8fd83fc75f03efbe75d50001b5eececb1e9971de85fcde84f69ae6f8346bc92d20d55d46201d328e4c74a367 + languageName: node + linkType: hard + "is-whitespace-character@npm:^1.0.0": version: 1.0.4 resolution: "is-whitespace-character@npm:1.0.4" @@ -9980,6 +10543,13 @@ __metadata: languageName: node linkType: hard +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: bd5bbe4104438c4196ba58a54650116007fa0262eccef13a4c55b2e09a5b36b59f1e75b9fcc49883dd9d4953892e6fc007eef9e9155648ceea036e184b0f930a + languageName: node + linkType: hard + "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -10032,30 +10602,43 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^2.0.3": - version: 2.2.1 - resolution: "jackspeak@npm:2.2.1" +"iterator.prototype@npm:^1.1.2": + version: 1.1.2 + resolution: "iterator.prototype@npm:1.1.2" + dependencies: + define-properties: ^1.2.1 + get-intrinsic: ^1.2.1 + has-symbols: ^1.0.3 + reflect.getprototypeof: ^1.0.4 + set-function-name: ^2.0.1 + checksum: d8a507e2ccdc2ce762e8a1d3f4438c5669160ac72b88b648e59a688eec6bc4e64b22338e74000518418d9e693faf2a092d2af21b9ec7dbf7763b037a54701168 + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" dependencies: "@isaacs/cliui": ^8.0.2 "@pkgjs/parseargs": ^0.11.0 dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: e29291c0d0f280a063fa18fbd1e891ab8c2d7519fd34052c0ebde38538a15c603140d60c2c7f432375ff7ee4c5f1c10daa8b2ae19a97c3d4affe308c8360c1df + checksum: 57d43ad11eadc98cdfe7496612f6bbb5255ea69fe51ea431162db302c2a11011642f50cfad57288bd0aea78384a0612b16e131944ad8ecd09d619041c8531b54 languageName: node linkType: hard -"jest-util@npm:^29.6.1": - version: 29.6.1 - resolution: "jest-util@npm:29.6.1" +"jest-util@npm:^29.7.0": + version: 29.7.0 + resolution: "jest-util@npm:29.7.0" dependencies: - "@jest/types": ^29.6.1 + "@jest/types": ^29.6.3 "@types/node": "*" chalk: ^4.0.0 ci-info: ^3.2.0 graceful-fs: ^4.2.9 picomatch: ^2.2.3 - checksum: fc553556c1350c443449cadaba5fb9d604628e8b5ceb6ceaf4e7e08975b24277d0a14bf2e0f956024e03c23e556fcb074659423422a06fbedf2ab52978697ac7 + checksum: 042ab4980f4ccd4d50226e01e5c7376a8556b472442ca6091a8f102488c0f22e6e8b89ea874111d2328a2080083bf3225c86f3788c52af0bd0345a00eb57a3ca languageName: node linkType: hard @@ -10071,36 +10654,36 @@ __metadata: linkType: hard "jest-worker@npm:^29.1.2": - version: 29.6.1 - resolution: "jest-worker@npm:29.6.1" + version: 29.7.0 + resolution: "jest-worker@npm:29.7.0" dependencies: "@types/node": "*" - jest-util: ^29.6.1 + jest-util: ^29.7.0 merge-stream: ^2.0.0 supports-color: ^8.0.0 - checksum: 0af309ea4db17c4c47e84a9246f907960a15577683c005fdeafc8f3c06bc455136f95a6f28fa2a3e924b767eb4dacd9b40915a7707305f88586f099af3ac27a8 + checksum: 30fff60af49675273644d408b650fc2eb4b5dcafc5a0a455f238322a8f9d8a98d847baca9d51ff197b6747f54c7901daa2287799230b856a0f48287d131f8c13 languageName: node linkType: hard "jiti@npm:^1.18.2": - version: 1.19.1 - resolution: "jiti@npm:1.19.1" + version: 1.20.0 + resolution: "jiti@npm:1.20.0" bin: jiti: bin/jiti.js - checksum: fdf55e315f9e81c04ae902416642062851d92c6cdcc17a59d5d1d35e1a0842e4e79be38da86613c5776fa18c579954542a441b93d1c347a50137dee2e558cbd0 + checksum: 7924062b5675142e3e272a27735be84b7bfc0a0eb73217fc2dcafa034f37c4f7b4b9ffc07dd98bcff0f739a8811ce1544db205ae7e97b1c86f0df92c65ce3c72 languageName: node linkType: hard "joi@npm:^17.6.0": - version: 17.9.2 - resolution: "joi@npm:17.9.2" + version: 17.11.0 + resolution: "joi@npm:17.11.0" dependencies: "@hapi/hoek": ^9.0.0 "@hapi/topo": ^5.0.0 "@sideway/address": ^4.1.3 "@sideway/formula": ^3.0.1 "@sideway/pinpoint": ^2.0.0 - checksum: 8c3709849293411c524e5a679dba7b42598a29a663478941767b8d5b06288611dece58803c468a2c7320cc2429a3e71e3d94337fe47aefcf6c22174dbd90b601 + checksum: 3a4e9ecba345cdafe585e7ed8270a44b39718e11dff3749aa27e0001a63d578b75100c062be28e6f48f960b594864034e7a13833f33fbd7ad56d5ce6b617f9bf languageName: node linkType: hard @@ -10209,6 +10792,13 @@ __metadata: languageName: node linkType: hard +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + "json-parse-better-errors@npm:^1.0.0": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" @@ -10271,7 +10861,7 @@ __metadata: languageName: node linkType: hard -"json5@npm:^2.1.2, json5@npm:^2.2.2": +"json5@npm:^2.1.2, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: @@ -10280,6 +10870,13 @@ __metadata: languageName: node linkType: hard +"jsonc-parser@npm:^3.2.0": + version: 3.2.0 + resolution: "jsonc-parser@npm:3.2.0" + checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 + languageName: node + linkType: hard + "jsonc-parser@npm:~2.2.1": version: 2.2.1 resolution: "jsonc-parser@npm:2.2.1" @@ -10320,14 +10917,14 @@ __metadata: linkType: hard "jsx-ast-utils@npm:^2.4.1 || ^3.0.0": - version: 3.3.4 - resolution: "jsx-ast-utils@npm:3.3.4" + version: 3.3.5 + resolution: "jsx-ast-utils@npm:3.3.5" dependencies: array-includes: ^3.1.6 array.prototype.flat: ^1.3.1 object.assign: ^4.1.4 object.values: ^1.1.6 - checksum: a6a00d324e38f0d47e04f973d79670248a663422a4dccdc02efd6f1caf1c00042fb0aafcff1023707c85dea6f013d435b90db67c1c6841bf345628f0a720d8b3 + checksum: f4b05fa4d7b5234230c905cfa88d36dc8a58a6666975a3891429b1a8cdc8a140bca76c297225cb7a499fad25a2c052ac93934449a2c31a44fc9edd06c773780a languageName: node linkType: hard @@ -10340,6 +10937,22 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.5.3": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + +"khroma@npm:^2.0.0": + version: 2.1.0 + resolution: "khroma@npm:2.1.0" + checksum: b34ba39d3a9a52d388110bded8cb1c12272eb69c249d8eb26feab12d18a96a9bc4ceec4851d2afa43de4569f7d5ea78fa305965a3d0e96a38e02fe77c53677da + languageName: node + linkType: hard + "kind-of@npm:^6.0.0, kind-of@npm:^6.0.2": version: 6.0.3 resolution: "kind-of@npm:6.0.3" @@ -10380,12 +10993,26 @@ __metadata: linkType: hard "launch-editor@npm:^2.6.0": - version: 2.6.0 - resolution: "launch-editor@npm:2.6.0" + version: 2.6.1 + resolution: "launch-editor@npm:2.6.1" dependencies: picocolors: ^1.0.0 - shell-quote: ^1.7.3 - checksum: 48e4230643e8fdb5c14c11314706d58d9f3fbafe2606be3d6e37da1918ad8bfe39dd87875c726a1b59b9f4da99d87ec3e36d4c528464f0b820f9e91e5cb1c02d + shell-quote: ^1.8.1 + checksum: e06d193075ac09f7f8109f10cabe464a211bf7ed4cbe75f83348d6f67bf4d9f162f06e7a1ab3e1cd7fc250b5342c3b57080618aff2e646dc34248fe499227601 + languageName: node + linkType: hard + +"layout-base@npm:^1.0.0": + version: 1.0.2 + resolution: "layout-base@npm:1.0.2" + checksum: e4c312765ac4fa13b49c940e701461309c7a0aa07f784f81d31f626b945dced90a8abf83222388a5af16b7074271f745501a90ef5a3af676abb2e7eb16d55b2e + languageName: node + linkType: hard + +"layout-base@npm:^2.0.0": + version: 2.0.1 + resolution: "layout-base@npm:2.0.1" + checksum: ef93baf044f67c3680f4f3a6d628bf4c7faba0f70f3e0abb16e4811bed087045208560347ca749e123d169cbf872505ad84e11fb21b0be925997227e042c7f43 languageName: node linkType: hard @@ -10427,6 +11054,13 @@ __metadata: languageName: node linkType: hard +"load-script@npm:^1.0.0": + version: 1.0.0 + resolution: "load-script@npm:1.0.0" + checksum: 8458e3f07b4a86f8d9d66e47a987811491a5d013af23ba7b371c6d3c9dc899885b072ccf65abf7874c10cb197d4975eacd8a7a125bfb38dbbcb267539f5dc1e9 + languageName: node + linkType: hard + "loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" @@ -10501,6 +11135,20 @@ __metadata: languageName: node linkType: hard +"lodash.escape@npm:^4.0.1": + version: 4.0.1 + resolution: "lodash.escape@npm:4.0.1" + checksum: fcb54f457497256964d619d5cccbd80a961916fca60df3fe0fa3e7f052715c2944c0ed5aefb4f9e047d127d44aa2d55555f3350cb42c6549e9e293fb30b41e7f + languageName: node + linkType: hard + +"lodash.flatten@npm:^4.4.0": + version: 4.4.0 + resolution: "lodash.flatten@npm:4.4.0" + checksum: 0ac34a393d4b795d4b7421153d27c13ae67e08786c9cbb60ff5b732210d46f833598eee3fb3844bb10070e8488efe390ea53bb567377e0cb47e9e630bf0811cb + languageName: node + linkType: hard + "lodash.flow@npm:^3.3.0": version: 3.5.0 resolution: "lodash.flow@npm:3.5.0" @@ -10515,6 +11163,13 @@ __metadata: languageName: node linkType: hard +"lodash.invokemap@npm:^4.6.0": + version: 4.6.0 + resolution: "lodash.invokemap@npm:4.6.0" + checksum: 646ceebbefbcb6da301f8c2868254680fd0bcdc6ada470495d9ae49c9c32938829c1b38a38c95d0258409a9655f85db404b16e648381c7450b7ed3d9c52d8808 + languageName: node + linkType: hard + "lodash.memoize@npm:^4.1.2": version: 4.1.2 resolution: "lodash.memoize@npm:4.1.2" @@ -10529,6 +11184,13 @@ __metadata: languageName: node linkType: hard +"lodash.pullall@npm:^4.2.0": + version: 4.2.0 + resolution: "lodash.pullall@npm:4.2.0" + checksum: 7a5fbaedf186ec197ce1e0b9ba1d88a89773ebaf6a8291c7d273838cac59cb3b339cf36ef00e94172862ee84d2304c38face161846f08f5581d0553dcbdcd090 + languageName: node + linkType: hard + "lodash.uniq@npm:4.5.0, lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" @@ -10536,6 +11198,13 @@ __metadata: languageName: node linkType: hard +"lodash.uniqby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.uniqby@npm:4.7.0" + checksum: 659264545a95726d1493123345aad8cbf56e17810fa9a0b029852c6d42bc80517696af09d99b23bef1845d10d95e01b8b4a1da578f22aeba7a30d3e0022a4938 + languageName: node + linkType: hard + "lodash@npm:^4.17.12, lodash@npm:^4.17.15, lodash@npm:^4.17.19, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:^4.17.5": version: 4.17.21 resolution: "lodash@npm:4.17.21" @@ -10639,9 +11308,16 @@ __metadata: linkType: hard "lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.0.0 - resolution: "lru-cache@npm:10.0.0" - checksum: 18f101675fe283bc09cda0ef1e3cc83781aeb8373b439f086f758d1d91b28730950db785999cd060d3c825a8571c03073e8c14512b6655af2188d623031baf50 + version: 10.0.1 + resolution: "lru-cache@npm:10.0.1" + checksum: 06f8d0e1ceabd76bb6f644a26dbb0b4c471b79c7b514c13c6856113879b3bf369eb7b497dad4ff2b7e2636db202412394865b33c332100876d838ad1372f0181 + languageName: node + linkType: hard + +"lunr@npm:^2.3.9": + version: 2.3.9 + resolution: "lunr@npm:2.3.9" + checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8 languageName: node linkType: hard @@ -10737,12 +11413,21 @@ __metadata: languageName: node linkType: hard -"markdown-to-jsx@npm:^7.2.1": - version: 7.2.1 - resolution: "markdown-to-jsx@npm:7.2.1" +"markdown-to-jsx@npm:^7.3.2": + version: 7.3.2 + resolution: "markdown-to-jsx@npm:7.3.2" peerDependencies: react: ">= 0.14.0" - checksum: 0c8c715229044401ea48c2fc26c2554464100074959dafacdd9e4a0e849f0a190b02f39edb373bbdd95e38b8f910074b83b63d08752b8ae6be6ddcfb40ea50a0 + checksum: 8885c6343b71570b0a7ec16cd85a49b853a830234790ee7430e2517ea5d8d361ff138bd52147f650790f3e7b3a28a15c755fc16f8856dd01ddf09a6161782e06 + languageName: node + linkType: hard + +"marked@npm:^4.3.0": + version: 4.3.0 + resolution: "marked@npm:4.3.0" + bin: + marked: bin/marked.js + checksum: 0db6817893952c3ec710eb9ceafb8468bf5ae38cb0f92b7b083baa13d70b19774674be04db5b817681fa7c5c6a088f61300815e4dd75a59696f4716ad69f6260 languageName: node linkType: hard @@ -11007,6 +11692,13 @@ __metadata: languageName: node linkType: hard +"memoize-one@npm:^5.1.1": + version: 5.2.1 + resolution: "memoize-one@npm:5.2.1" + checksum: a3cba7b824ebcf24cdfcd234aa7f86f3ad6394b8d9be4c96ff756dafb8b51c7f71320785fbc2304f1af48a0467cbbd2a409efc9333025700ed523f254cb52e3d + languageName: node + linkType: hard + "merge-descriptors@npm:1.0.1": version: 1.0.1 resolution: "merge-descriptors@npm:1.0.1" @@ -11028,15 +11720,41 @@ __metadata: languageName: node linkType: hard +"mermaid@npm:^9.2.2": + version: 9.4.3 + resolution: "mermaid@npm:9.4.3" + dependencies: + "@braintree/sanitize-url": ^6.0.0 + cytoscape: ^3.23.0 + cytoscape-cose-bilkent: ^4.1.0 + cytoscape-fcose: ^2.1.0 + d3: ^7.4.0 + dagre-d3-es: 7.0.9 + dayjs: ^1.11.7 + dompurify: 2.4.3 + elkjs: ^0.8.2 + khroma: ^2.0.0 + lodash-es: ^4.17.21 + non-layered-tidy-tree-layout: ^2.0.2 + stylis: ^4.1.2 + ts-dedent: ^2.2.0 + uuid: ^9.0.0 + web-worker: ^1.2.0 + checksum: 9e29177f289cc268ea4a2ca7a45ec0ca06f678007eae15a7cd54c682148a71367e861d2c9c0afa9f7474da154d9920524e59722186820e9bc0d79989305a7064 + languageName: node + linkType: hard + "metamask-docs@workspace:.": version: 0.0.0-use.local resolution: "metamask-docs@workspace:." dependencies: - "@docusaurus/core": 2.4.1 - "@docusaurus/eslint-plugin": 2.4.1 - "@docusaurus/module-type-aliases": 2.4.1 - "@docusaurus/plugin-client-redirects": 2.4.1 - "@docusaurus/plugin-content-docs": 2.4.1 + "@docusaurus/core": 2.4.3 + "@docusaurus/eslint-plugin": 2.4.3 + "@docusaurus/module-type-aliases": 2.4.3 + "@docusaurus/plugin-client-redirects": 2.4.3 + "@docusaurus/plugin-content-docs": 2.4.3 + "@docusaurus/theme-common": ^2.4.3 + "@docusaurus/theme-mermaid": ^2.4.3 "@lavamoat/allow-scripts": ^2.3.0 "@mdx-js/react": ^1.6.22 "@metamask/design-tokens": ^1.11.1 @@ -11045,15 +11763,20 @@ __metadata: "@typescript-eslint/eslint-plugin": ^5.41.0 "@typescript-eslint/parser": ^5.41.0 clsx: ^1.2.1 + docusaurus-plugin-typedoc: 1.0.0-next.17 eslint: ^8.26.0 eslint-plugin-react: ^7.31.10 eslint-plugin-unused-imports: ^2.0.0 node-polyfill-webpack-plugin: ^2.0.1 + prettier: ^3.0.0 prism-react-renderer: ^1.3.5 react: ^17.0.2 react-dom: ^17.0.2 + react-player: ^2.13.0 remark-codesandbox: ^0.10.1 remark-docusaurus-tabs: ^0.2.0 + typedoc: ^0.25.1 + typedoc-plugin-markdown: 4.0.0-next.22 typescript: ^4.7.4 languageName: unknown linkType: soft @@ -11504,7 +12227,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.1": +"minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" dependencies: @@ -11530,17 +12253,17 @@ __metadata: linkType: hard "minipass-fetch@npm:^3.0.0": - version: 3.0.3 - resolution: "minipass-fetch@npm:3.0.3" + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" dependencies: encoding: ^0.1.13 - minipass: ^5.0.0 + minipass: ^7.0.3 minipass-sized: ^1.0.3 minizlib: ^2.1.2 dependenciesMeta: encoding: optional: true - checksum: af5ab2552a16fcf505d35fd7ffb84b57f4a0eeb269e6e1d9a2a75824dda48b36e527083250b7cca4a4def21d9544e2ade441e4730e233c0bc2133f6abda31e18 + checksum: af7aad15d5c128ab1ebe52e043bdf7d62c3c6f0cecb9285b40d7b395e1375b45dcdfd40e63e93d26a0e8249c9efd5c325c65575aceee192883970ff8cb11364a languageName: node linkType: hard @@ -11587,10 +12310,10 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0": - version: 7.0.2 - resolution: "minipass@npm:7.0.2" - checksum: 46776de732eb7cef2c7404a15fb28c41f5c54a22be50d47b03c605bf21f5c18d61a173c0a20b49a97e7a65f78d887245066410642551e45fffe04e9ac9e325bc +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 87585e258b9488caf2e7acea242fd7856bbe9a2c84a7807643513a338d66f368c7d518200ad7b70a508664d408aa000517647b2930c259a8b1f9f0984f344a21 languageName: node linkType: hard @@ -11839,8 +12562,8 @@ __metadata: linkType: hard "node-fetch@npm:^2.6.1, node-fetch@npm:^2.6.12": - version: 2.6.12 - resolution: "node-fetch@npm:2.6.12" + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" dependencies: whatwg-url: ^5.0.0 peerDependencies: @@ -11848,7 +12571,7 @@ __metadata: peerDependenciesMeta: encoding: optional: true - checksum: 3bc1655203d47ee8e313c0d96664b9673a3d4dd8002740318e9d27d14ef306693a4b2ef8d6525775056fd912a19e23f3ac0d7111ad8925877b7567b29a625592 + checksum: d76d2f5edb451a3f05b15115ec89fc6be39de37c6089f1b6368df03b91e1633fd379a7e01b7ab05089a25034b2023d959b47e59759cb38d88341b2459e89d6e5 languageName: node linkType: hard @@ -11915,13 +12638,20 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.12": +"node-releases@npm:^2.0.13": version: 2.0.13 resolution: "node-releases@npm:2.0.13" checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 languageName: node linkType: hard +"non-layered-tidy-tree-layout@npm:^2.0.2": + version: 2.0.2 + resolution: "non-layered-tidy-tree-layout@npm:2.0.2" + checksum: 5defc1c459001b22816a4fb8b86259b9b76e7f3090df576122a41c760133ab2061934cacd6f176c98c2ae4fee3879b97941e8897e8882985cbfe830f155cd158 + languageName: node + linkType: hard + "nopt@npm:^6.0.0": version: 6.0.0 resolution: "nopt@npm:6.0.0" @@ -12062,7 +12792,7 @@ __metadata: languageName: node linkType: hard -"object-is@npm:^1.0.1": +"object-is@npm:^1.1.5": version: 1.1.5 resolution: "object-is@npm:1.1.5" dependencies: @@ -12092,45 +12822,45 @@ __metadata: linkType: hard "object.entries@npm:^1.1.6": - version: 1.1.6 - resolution: "object.entries@npm:1.1.6" + version: 1.1.7 + resolution: "object.entries@npm:1.1.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 0f8c47517e6a9a980241eafe3b73de11e59511883173c2b93d67424a008e47e11b77c80e431ad1d8a806f6108b225a1cab9223e53e555776c612a24297117d28 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: da287d434e7e32989586cd734382364ba826a2527f2bc82e6acbf9f9bfafa35d51018b66ec02543ffdfa2a5ba4af2b6f1ca6e588c65030cb4fd9c67d6ced594c languageName: node linkType: hard "object.fromentries@npm:^2.0.6": - version: 2.0.6 - resolution: "object.fromentries@npm:2.0.6" + version: 2.0.7 + resolution: "object.fromentries@npm:2.0.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 453c6d694180c0c30df451b60eaf27a5b9bca3fb43c37908fd2b78af895803dc631242bcf05582173afa40d8d0e9c96e16e8874b39471aa53f3ac1f98a085d85 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 7341ce246e248b39a431b87a9ddd331ff52a454deb79afebc95609f94b1f8238966cf21f52188f2a353f0fdf83294f32f1ebf1f7826aae915ebad21fd0678065 languageName: node linkType: hard "object.hasown@npm:^1.1.2": - version: 1.1.2 - resolution: "object.hasown@npm:1.1.2" + version: 1.1.3 + resolution: "object.hasown@npm:1.1.3" dependencies: - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: b936572536db0cdf38eb30afd2f1026a8b6f2cc5d2c4497c9d9bbb01eaf3e980dead4fd07580cfdd098e6383e5a9db8212d3ea0c6bdd2b5e68c60aa7e3b45566 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 76bc17356f6124542fb47e5d0e78d531eafa4bba3fc2d6fc4b1a8ce8b6878912366c0d99f37ce5c84ada8fd79df7aa6ea1214fddf721f43e093ad2df51f27da1 languageName: node linkType: hard "object.values@npm:^1.1.6": - version: 1.1.6 - resolution: "object.values@npm:1.1.6" + version: 1.1.7 + resolution: "object.values@npm:1.1.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: f3e4ae4f21eb1cc7cebb6ce036d4c67b36e1c750428d7b7623c56a0db90edced63d08af8a316d81dfb7c41a3a5fa81b05b7cc9426e98d7da986b1682460f0777 languageName: node linkType: hard @@ -12445,7 +13175,7 @@ __metadata: languageName: node linkType: hard -"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.5": +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.6": version: 5.1.6 resolution: "parse-asn1@npm:5.1.6" dependencies: @@ -12493,7 +13223,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.0.0": +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -13154,13 +13884,13 @@ __metadata: linkType: hard "postcss@npm:^8.3.11, postcss@npm:^8.4.14, postcss@npm:^8.4.17, postcss@npm:^8.4.21": - version: 8.4.25 - resolution: "postcss@npm:8.4.25" + version: 8.4.31 + resolution: "postcss@npm:8.4.31" dependencies: nanoid: ^3.3.6 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 9ed3ab8af43ad5210c28f56f916fd9b8c9f94fbeaebbf645dcf579bc28bdd8056c2a7ecc934668d399b81fedb6128f0c4b299f931e50454964bc911c25a3a0a2 + checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea languageName: node linkType: hard @@ -13185,6 +13915,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.0.0": + version: 3.0.3 + resolution: "prettier@npm:3.0.3" + bin: + prettier: bin/prettier.cjs + checksum: e10b9af02b281f6c617362ebd2571b1d7fc9fb8a3bd17e371754428cda992e5e8d8b7a046e8f7d3e2da1dcd21aa001e2e3c797402ebb6111b5cd19609dd228e0 + languageName: node + linkType: hard + "pretty-error@npm:^4.0.0": version: 4.0.0 resolution: "pretty-error@npm:4.0.0" @@ -13306,9 +14045,9 @@ __metadata: linkType: hard "property-information@npm:^6.0.0": - version: 6.2.0 - resolution: "property-information@npm:6.2.0" - checksum: 23afce07ba821cbe7d926e63cdd680991961c82be4bbb6c0b17c47f48894359c1be6e51cd74485fc10a9d3fd361b475388e1e39311ed2b53127718f72aab1955 + version: 6.3.0 + resolution: "property-information@npm:6.3.0" + checksum: bf0a15dec097fd4324a42163cabd96b90819e48ef0d8d98756ef0420b2c579bf33646fe0b6e04aa9e79f5a2b5b5860ef11655a79cd8969d8eda58df23c4f96c9 languageName: node linkType: hard @@ -13432,7 +14171,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:^6.11.0, qs@npm:^6.11.1": +"qs@npm:^6.11.1, qs@npm:^6.11.2": version: 6.11.2 resolution: "qs@npm:6.11.2" dependencies: @@ -13596,7 +14335,7 @@ __metadata: languageName: node linkType: hard -"react-fast-compare@npm:^3.2.0": +"react-fast-compare@npm:^3.0.1, react-fast-compare@npm:^3.2.0": version: 3.2.2 resolution: "react-fast-compare@npm:3.2.2" checksum: 2071415b4f76a3e6b55c84611c4d24dcb12ffc85811a2840b5a3f1ff2d1a99be1020d9437ee7c6e024c9f4cbb84ceb35e48cf84f28fcb00265ad2dfdd3947704 @@ -13704,6 +14443,21 @@ __metadata: languageName: node linkType: hard +"react-player@npm:^2.13.0": + version: 2.13.0 + resolution: "react-player@npm:2.13.0" + dependencies: + deepmerge: ^4.0.0 + load-script: ^1.0.0 + memoize-one: ^5.1.1 + prop-types: ^15.7.2 + react-fast-compare: ^3.0.1 + peerDependencies: + react: ">=16.6.0" + checksum: 7e0e69e0ac37227ab5bfdda73991d4f5d4741585562f3ad9cfb787ae2c427510b69ddf6ef3f23f319d699b790af852fca57f3e9b1dae94f385d545a3db200d67 + languageName: node + linkType: hard + "react-router-config@npm:^5.1.1": version: 5.1.1 resolution: "react-router-config@npm:5.1.1" @@ -13768,15 +14522,15 @@ __metadata: linkType: hard "react-textarea-autosize@npm:^8.3.2": - version: 8.5.2 - resolution: "react-textarea-autosize@npm:8.5.2" + version: 8.5.3 + resolution: "react-textarea-autosize@npm:8.5.3" dependencies: "@babel/runtime": ^7.20.13 use-composed-ref: ^1.3.0 use-latest: ^1.2.1 peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 48504e1c7bea01ea9632a2f663271519693926bb4dbdba7f7353178078df95a877fb298ff56e8ba41a324b212da2b3df13524de54c6a32a2de8241e46dceba98 + checksum: b317c3763f37a89621bbafd0e6e2d068e7876790a5ae77f497adfd6ba9334ceea138c8a0b7d907bae0f79c765cb24e8b2ca2b8033b4144c0bce28571a3658921 languageName: node linkType: hard @@ -13857,7 +14611,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -13915,6 +14669,20 @@ __metadata: languageName: node linkType: hard +"reflect.getprototypeof@npm:^1.0.4": + version: 1.0.4 + resolution: "reflect.getprototypeof@npm:1.0.4" + dependencies: + call-bind: ^1.0.2 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 + globalthis: ^1.0.3 + which-builtin-type: ^1.1.3 + checksum: 16e2361988dbdd23274b53fb2b1b9cefeab876c3941a2543b4cadac6f989e3db3957b07a44aac46cfceb3e06e2871785ec2aac992d824f76292f3b5ee87f66f2 + languageName: node + linkType: hard + "refractor@npm:^3.6.0": version: 3.6.0 resolution: "refractor@npm:3.6.0" @@ -13927,11 +14695,11 @@ __metadata: linkType: hard "regenerate-unicode-properties@npm:^10.1.0": - version: 10.1.0 - resolution: "regenerate-unicode-properties@npm:10.1.0" + version: 10.1.1 + resolution: "regenerate-unicode-properties@npm:10.1.1" dependencies: regenerate: ^1.4.2 - checksum: b1a8929588433ab8b9dc1a34cf3665b3b472f79f2af6ceae00d905fc496b332b9af09c6718fb28c730918f19a00dc1d7310adbaa9b72a2ec7ad2f435da8ace17 + checksum: b80958ef40f125275824c2c47d5081dfaefebd80bff26c76761e9236767c748a4a95a69c053fe29d2df881177f2ca85df4a71fe70a82360388b31159ef19adcf languageName: node linkType: hard @@ -13942,30 +14710,30 @@ __metadata: languageName: node linkType: hard -"regenerator-runtime@npm:^0.13.11": - version: 0.13.11 - resolution: "regenerator-runtime@npm:0.13.11" - checksum: 27481628d22a1c4e3ff551096a683b424242a216fee44685467307f14d58020af1e19660bf2e26064de946bad7eff28950eae9f8209d55723e2d9351e632bbb4 +"regenerator-runtime@npm:^0.14.0": + version: 0.14.0 + resolution: "regenerator-runtime@npm:0.14.0" + checksum: 1c977ad82a82a4412e4f639d65d22be376d3ebdd30da2c003eeafdaaacd03fc00c2320f18120007ee700900979284fc78a9f00da7fb593f6e6eeebc673fba9a3 languageName: node linkType: hard -"regenerator-transform@npm:^0.15.1": - version: 0.15.1 - resolution: "regenerator-transform@npm:0.15.1" +"regenerator-transform@npm:^0.15.2": + version: 0.15.2 + resolution: "regenerator-transform@npm:0.15.2" dependencies: "@babel/runtime": ^7.8.4 - checksum: 2d15bdeadbbfb1d12c93f5775493d85874dbe1d405bec323da5c61ec6e701bc9eea36167483e1a5e752de9b2df59ab9a2dfff6bf3784f2b28af2279a673d29a4 + checksum: 20b6f9377d65954980fe044cfdd160de98df415b4bff38fbade67b3337efaf078308c4fed943067cd759827cc8cfeca9cb28ccda1f08333b85d6a2acbd022c27 languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3": - version: 1.5.0 - resolution: "regexp.prototype.flags@npm:1.5.0" +"regexp.prototype.flags@npm:^1.5.0, regexp.prototype.flags@npm:^1.5.1": + version: 1.5.1 + resolution: "regexp.prototype.flags@npm:1.5.1" dependencies: call-bind: ^1.0.2 define-properties: ^1.2.0 - functions-have-names: ^1.2.3 - checksum: c541687cdbdfff1b9a07f6e44879f82c66bbf07665f9a7544c5fd16acdb3ec8d1436caab01662d2fbcad403f3499d49ab0b77fbc7ef29ef961d98cc4bc9755b4 + set-function-name: ^2.0.0 + checksum: 869edff00288442f8d7fa4c9327f91d85f3b3acf8cbbef9ea7a220345cf23e9241b6def9263d2c1ebcf3a316b0aa52ad26a43a84aa02baca3381717b3e307f47 languageName: node linkType: hard @@ -14290,55 +15058,55 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.3.2": - version: 1.22.3 - resolution: "resolve@npm:1.22.3" +"resolve@npm:^1.1.6, resolve@npm:^1.10.0, resolve@npm:^1.14.2, resolve@npm:^1.22.3, resolve@npm:^1.3.2": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: - is-core-module: ^2.12.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: fb834b81348428cb545ff1b828a72ea28feb5a97c026a1cf40aa1008352c72811ff4d4e71f2035273dc536dcfcae20c13604ba6283c612d70fa0b6e44519c374 + checksum: f8a26958aa572c9b064562750b52131a37c29d072478ea32e129063e2da7f83e31f7f11e7087a18225a8561cfe8d2f0df9dbea7c9d331a897571c0a2527dbb4c languageName: node linkType: hard "resolve@npm:^2.0.0-next.4": - version: 2.0.0-next.4 - resolution: "resolve@npm:2.0.0-next.4" + version: 2.0.0-next.5 + resolution: "resolve@npm:2.0.0-next.5" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: c438ac9a650f2030fd074219d7f12ceb983b475da2d89ad3d6dd05fbf6b7a0a8cd37d4d10b43cb1f632bc19f22246ab7f36ebda54d84a29bfb2910a0680906d3 + checksum: a73ac69a1c4bd34c56b213d91f5b17ce390688fdb4a1a96ed3025cc7e08e7bfb90b3a06fcce461780cb0b589c958afcb0080ab802c71c01a7ecc8c64feafc89f languageName: node linkType: hard -"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.3.2#~builtin": - version: 1.22.3 - resolution: "resolve@patch:resolve@npm%3A1.22.3#~builtin::version=1.22.3&hash=c3c19d" +"resolve@patch:resolve@^1.1.6#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.22.3#~builtin, resolve@patch:resolve@^1.3.2#~builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: - is-core-module: ^2.12.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: ad59734723b596d0891321c951592ed9015a77ce84907f89c9d9307dd0c06e11a67906a3e628c4cae143d3e44898603478af0ddeb2bba3f229a9373efe342665 + checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 languageName: node linkType: hard "resolve@patch:resolve@^2.0.0-next.4#~builtin": - version: 2.0.0-next.4 - resolution: "resolve@patch:resolve@npm%3A2.0.0-next.4#~builtin::version=2.0.0-next.4&hash=c3c19d" + version: 2.0.0-next.5 + resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=c3c19d" dependencies: - is-core-module: ^2.9.0 + is-core-module: ^2.13.0 path-parse: ^1.0.7 supports-preserve-symlinks-flag: ^1.0.0 bin: resolve: bin/resolve - checksum: 4bf9f4f8a458607af90518ff73c67a4bc1a38b5a23fef2bb0ccbd45e8be89820a1639b637b0ba377eb2be9eedfb1739a84cde24fe4cd670c8207d8fea922b011 + checksum: 064d09c1808d0c51b3d90b5d27e198e6d0c5dad0eb57065fd40803d6a20553e5398b07f76739d69cbabc12547058bec6b32106ea66622375fb0d7e8fca6a846c languageName: node linkType: hard @@ -14421,6 +15189,13 @@ __metadata: languageName: node linkType: hard +"robust-predicates@npm:^3.0.0": + version: 3.0.2 + resolution: "robust-predicates@npm:3.0.2" + checksum: 36854c1321548ceca96d36ad9d6e0a5a512986029ec6929ad6ed3ec1612c22cc8b46cc72d2c5674af42e8074a119d793f6f0ea3a5b51373e3ab926c64b172d7a + languageName: node + linkType: hard + "rtl-css-js@npm:^1.14.0": version: 1.16.1 resolution: "rtl-css-js@npm:1.16.1" @@ -14476,6 +15251,13 @@ __metadata: languageName: node linkType: hard +"rw@npm:1": + version: 1.3.3 + resolution: "rw@npm:1.3.3" + checksum: c20d82421f5a71c86a13f76121b751553a99cd4a70ea27db86f9b23f33db941f3f06019c30f60d50c356d0bd674c8e74764ac146ea55e217c091bde6fba82aa3 + languageName: node + linkType: hard + "rxjs@npm:^6.4.0": version: 6.6.7 resolution: "rxjs@npm:6.6.7" @@ -14503,6 +15285,18 @@ __metadata: languageName: node linkType: hard +"safe-array-concat@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-array-concat@npm:1.0.1" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + has-symbols: ^1.0.3 + isarray: ^2.0.5 + checksum: 001ecf1d8af398251cbfabaf30ed66e3855127fbceee178179524b24160b49d15442f94ed6c0db0b2e796da76bb05b73bf3cc241490ec9c2b741b41d33058581 + languageName: node + linkType: hard + "safe-buffer@npm:5.1.2, safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -14510,7 +15304,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 @@ -14543,9 +15337,9 @@ __metadata: linkType: hard "sax@npm:^1.2.4": - version: 1.2.4 - resolution: "sax@npm:1.2.4" - checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe + version: 1.3.0 + resolution: "sax@npm:1.3.0" + checksum: 238ab3a9ba8c8f8aaf1c5ea9120386391f6ee0af52f1a6a40bbb6df78241dd05d782f2359d614ac6aae08c4c4125208b456548a6cf68625aa4fe178486e63ecd languageName: node linkType: hard @@ -14664,7 +15458,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^6.0.0, semver@npm:^6.2.0, semver@npm:^6.3.0": +"semver@npm:^6.0.0, semver@npm:^6.2.0, semver@npm:^6.3.0, semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" bin: @@ -14764,6 +15558,17 @@ __metadata: languageName: node linkType: hard +"set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": + version: 2.0.1 + resolution: "set-function-name@npm:2.0.1" + dependencies: + define-data-property: ^1.0.1 + functions-have-names: ^1.2.3 + has-property-descriptors: ^1.0.0 + checksum: 4975d17d90c40168eee2c7c9c59d023429f0a1690a89d75656306481ece0c3c1fb1ebcc0150ea546d1913e35fbd037bace91372c69e543e51fc5d1f31a9fa126 + languageName: node + linkType: hard + "set-harmonic-interval@npm:^1.0.1": version: 1.0.1 resolution: "set-harmonic-interval@npm:1.0.1" @@ -14852,7 +15657,7 @@ __metadata: languageName: node linkType: hard -"shell-quote@npm:^1.7.3": +"shell-quote@npm:^1.7.3, shell-quote@npm:^1.8.1": version: 1.8.1 resolution: "shell-quote@npm:1.8.1" checksum: 5f01201f4ef504d4c6a9d0d283fa17075f6770bfbe4c5850b074974c68062f37929ca61700d95ad2ac8822e14e8c4b990ca0e6e9272e64befd74ce5e19f0736b @@ -14872,6 +15677,18 @@ __metadata: languageName: node linkType: hard +"shiki@npm:^0.14.1": + version: 0.14.5 + resolution: "shiki@npm:0.14.5" + dependencies: + ansi-sequence-parser: ^1.1.0 + jsonc-parser: ^3.2.0 + vscode-oniguruma: ^1.7.0 + vscode-textmate: ^8.0.0 + checksum: 41d847817cfc9bb6d8bf190316896698d250303656546446659cc02caed8dcc171b10cd113bb5da82425b51d0032e87aafcdc36c3dd61dadc123170b438da736 + languageName: node + linkType: hard + "shortid@npm:^2.2.8": version: 2.2.16 resolution: "shortid@npm:2.2.16" @@ -14900,20 +15717,20 @@ __metadata: linkType: hard "signal-exit@npm:^4.0.1": - version: 4.0.2 - resolution: "signal-exit@npm:4.0.2" - checksum: 41f5928431cc6e91087bf0343db786a6313dd7c6fd7e551dbc141c95bb5fb26663444fd9df8ea47c5d7fc202f60aa7468c3162a9365cbb0615fc5e1b1328fe31 + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 64c757b498cb8629ffa5f75485340594d2f8189e9b08700e69199069c8e3070fb3e255f7ab873c05dc0b3cec412aea7402e10a5990cb6a050bd33ba062a6c549 languageName: node linkType: hard -"sirv@npm:^1.0.7": - version: 1.0.19 - resolution: "sirv@npm:1.0.19" +"sirv@npm:^2.0.3": + version: 2.0.3 + resolution: "sirv@npm:2.0.3" dependencies: "@polka/url": ^1.0.0-next.20 mrmime: ^1.0.0 - totalist: ^1.0.0 - checksum: c943cfc61baf85f05f125451796212ec35d4377af4da90ae8ec1fa23e6d7b0b4d9c74a8fbf65af83c94e669e88a09dc6451ba99154235eead4393c10dda5b07c + totalist: ^3.0.0 + checksum: e2dfd4c97735a6ad6d842d0eec2cd9e3919ff0e46f0d228248c5753ad4b70b832711e77e1259c031c439cdb08303cc54d923685c92b0e890145cc733af7c5568 languageName: node linkType: hard @@ -15112,9 +15929,9 @@ __metadata: linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.13 - resolution: "spdx-license-ids@npm:3.0.13" - checksum: 3469d85c65f3245a279fa11afc250c3dca96e9e847f2f79d57f466940c5bb8495da08a542646086d499b7f24a74b8d0b42f3fc0f95d50ff99af1f599f6360ad7 + version: 3.0.16 + resolution: "spdx-license-ids@npm:3.0.16" + checksum: 5cdaa85aaa24bd02f9353a2e357b4df0a4f205cb35655f3fd0a5674a4fb77081f28ffd425379214bc3be2c2b7593ce1215df6bcc75884aeee0a9811207feabe2 languageName: node linkType: hard @@ -15153,11 +15970,11 @@ __metadata: linkType: hard "ssri@npm:^10.0.0": - version: 10.0.4 - resolution: "ssri@npm:10.0.4" + version: 10.0.5 + resolution: "ssri@npm:10.0.5" dependencies: - minipass: ^5.0.0 - checksum: fb14da9f8a72b04eab163eb13a9dda11d5962cd2317f85457c4e0b575e9a6e0e3a6a87b5bf122c75cb36565830cd5f263fb457571bf6f1587eb5f95d095d6165 + minipass: ^7.0.3 + checksum: 0a31b65f21872dea1ed3f7c200d7bc1c1b91c15e419deca14f282508ba917cbb342c08a6814c7f68ca4ca4116dd1a85da2bbf39227480e50125a1ceffeecb750 languageName: node linkType: hard @@ -15245,9 +16062,9 @@ __metadata: linkType: hard "std-env@npm:^3.0.1": - version: 3.3.3 - resolution: "std-env@npm:3.3.3" - checksum: 6665f6d8bd63aae432d3eb9abbd7322847ad0d902603e6dce1e8051b4f42ceeb4f7f96a4faf70bb05ce65ceee2dc982502b701575c8a58b1bfad29f3dbb19f81 + version: 3.4.3 + resolution: "std-env@npm:3.4.3" + checksum: bef186fb2baddda31911234b1e58fa18f181eb6930616aaec3b54f6d5db65f2da5daaa5f3b326b98445a7d50ca81d6fe8809ab4ebab85ecbe4a802f1b40921bf languageName: node linkType: hard @@ -15323,51 +16140,52 @@ __metadata: linkType: hard "string.prototype.matchall@npm:^4.0.8": - version: 4.0.8 - resolution: "string.prototype.matchall@npm:4.0.8" + version: 4.0.10 + resolution: "string.prototype.matchall@npm:4.0.10" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.3 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + get-intrinsic: ^1.2.1 has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - regexp.prototype.flags: ^1.4.3 + internal-slot: ^1.0.5 + regexp.prototype.flags: ^1.5.0 + set-function-name: ^2.0.0 side-channel: ^1.0.4 - checksum: 952da3a818de42ad1c10b576140a5e05b4de7b34b8d9dbf00c3ac8c1293e9c0f533613a39c5cda53e0a8221f2e710bc2150e730b1c2278d60004a8a35726efb6 + checksum: 3c78bdeff39360c8e435d7c4c6ea19f454aa7a63eda95fa6fadc3a5b984446a2f9f2c02d5c94171ce22268a573524263fbd0c8edbe3ce2e9890d7cc036cdc3ed languageName: node linkType: hard -"string.prototype.trim@npm:^1.2.7": - version: 1.2.7 - resolution: "string.prototype.trim@npm:1.2.7" +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 05b7b2d6af63648e70e44c4a8d10d8cc457536df78b55b9d6230918bde75c5987f6b8604438c4c8652eb55e4fc9725d2912789eb4ec457d6995f3495af190c09 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 49eb1a862a53aba73c3fb6c2a53f5463173cb1f4512374b623bcd6b43ad49dd559a06fb5789bdec771a40fc4d2a564411c0a75d35fb27e76bbe738c211ecff07 languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimend@npm:1.0.6" +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 2375516272fd1ba75992f4c4aa88a7b5f3c7a9ca308d963bcd5645adf689eba6f8a04ebab80c33e30ec0aefc6554181a3a8416015c38da0aa118e60ec896310c languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimstart@npm:1.0.6" +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" dependencies: call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + define-properties: ^1.2.0 + es-abstract: ^1.22.1 + checksum: 13d0c2cb0d5ff9e926fa0bec559158b062eed2b68cd5be777ffba782c96b2b492944e47057274e064549b94dd27cf81f48b27a31fee8af5b574cff253e7eb613 languageName: node linkType: hard @@ -15457,7 +16275,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -15481,11 +16299,11 @@ __metadata: linkType: hard "style-to-object@npm:^0.4.0, style-to-object@npm:^0.4.1": - version: 0.4.1 - resolution: "style-to-object@npm:0.4.1" + version: 0.4.2 + resolution: "style-to-object@npm:0.4.2" dependencies: inline-style-parser: 0.1.1 - checksum: 2ea213e98eed21764ae1d1dc9359231a9f2d480d6ba55344c4c15eb275f0809f1845786e66d4caf62414a5cc8f112ce9425a58d251c77224060373e0db48f8c2 + checksum: 314a80bcfadde41c2b9c8d717a4b1f2220954561040c2c7740496715da5cb95f99920a8eeefe2d4a862149875f352a12eda9bbef5816d7e0a71910da00d1521f languageName: node linkType: hard @@ -15501,7 +16319,7 @@ __metadata: languageName: node linkType: hard -"stylis@npm:^4.0.6": +"stylis@npm:^4.0.6, stylis@npm:^4.1.2": version: 4.3.0 resolution: "stylis@npm:4.3.0" checksum: 6120de3f03eacf3b5adc8e7919c4cca991089156a6badc5248752a3088106afaaf74996211a6817a7760ebeadca09004048eea31875bd8d4df51386365c50025 @@ -15608,8 +16426,8 @@ __metadata: linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.15 - resolution: "tar@npm:6.1.15" + version: 6.2.0 + resolution: "tar@npm:6.2.0" dependencies: chownr: ^2.0.0 fs-minipass: ^2.0.0 @@ -15617,7 +16435,7 @@ __metadata: minizlib: ^2.1.1 mkdirp: ^1.0.3 yallist: ^4.0.0 - checksum: f23832fceeba7578bf31907aac744ae21e74a66f4a17a9e94507acf460e48f6db598c7023882db33bab75b80e027c21f276d405e4a0322d58f51c7088d428268 + checksum: db4d9fe74a2082c3a5016630092c54c8375ff3b280186938cfd104f2e089c4fd9bad58688ef6be9cf186a889671bf355c7cda38f09bbf60604b281715ca57f5c languageName: node linkType: hard @@ -15653,8 +16471,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.16.8": - version: 5.19.0 - resolution: "terser@npm:5.19.0" + version: 5.21.0 + resolution: "terser@npm:5.21.0" dependencies: "@jridgewell/source-map": ^0.3.3 acorn: ^8.8.2 @@ -15662,7 +16480,7 @@ __metadata: source-map-support: ~0.5.20 bin: terser: bin/terser - checksum: 31c937f1a30c03b68825df7803a3584b13616647438be6cbc0914b688f064a3f4f938d8182e476342ddd1675e84798393b076caeb549393f4df768aec9abd6bd + checksum: 130f1567af1ffa4ddb067651bb284a01b45b5c83e82b3a072a5ff94b0b00ac35090f89c8714631a4a45972f65187bc149fc7144380611f437e1e3d9e174b136b languageName: node linkType: hard @@ -15813,10 +16631,10 @@ __metadata: languageName: node linkType: hard -"totalist@npm:^1.0.0": - version: 1.1.0 - resolution: "totalist@npm:1.1.0" - checksum: dfab80c7104a1d170adc8c18782d6c04b7df08352dec452191208c66395f7ef2af7537ddfa2cf1decbdcfab1a47afbbf0dec6543ea191da98c1c6e1599f86adc +"totalist@npm:^3.0.0": + version: 3.0.1 + resolution: "totalist@npm:3.0.1" + checksum: 5132d562cf88ff93fd710770a92f31dbe67cc19b5c6ccae2efc0da327f0954d211bbfd9456389655d726c624f284b4a23112f56d1da931ca7cfabbe1f45e778a languageName: node linkType: hard @@ -15862,6 +16680,13 @@ __metadata: languageName: node linkType: hard +"ts-dedent@npm:^2.2.0": + version: 2.2.0 + resolution: "ts-dedent@npm:2.2.0" + checksum: 93ed8f7878b6d5ed3c08d99b740010eede6bccfe64bce61c5a4da06a2c17d6ddbb80a8c49c2d15251de7594a4f93ffa21dd10e7be75ef66a4dc9951b4a94e2af + languageName: node + linkType: hard + "ts-easing@npm:^0.2.0": version: 0.2.0 resolution: "ts-easing@npm:0.2.0" @@ -15884,9 +16709,9 @@ __metadata: linkType: hard "tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.2.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0": - version: 2.6.0 - resolution: "tslib@npm:2.6.0" - checksum: c01066038f950016a18106ddeca4649b4d76caa76ec5a31e2a26e10586a59fceb4ee45e96719bf6c715648e7c14085a81fee5c62f7e9ebee68e77a5396e5538f + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: 329ea56123005922f39642318e3d1f0f8265d1e7fcb92c633e0809521da75eeaca28d2cf96d7248229deb40e5c19adf408259f4b9640afd20d13aecc1430f3ad languageName: node linkType: hard @@ -15941,6 +16766,42 @@ __metadata: languageName: node linkType: hard +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + get-intrinsic: ^1.2.1 + is-typed-array: ^1.1.10 + checksum: 3e0281c79b2a40cd97fe715db803884301993f4e8c18e8d79d75fd18f796e8cd203310fec8c7fdb5e6c09bedf0af4f6ab8b75eb3d3a85da69328f28a80456bd3 + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: b03db16458322b263d87a702ff25388293f1356326c8a678d7515767ef563ef80e1e67ce648b821ec13178dd628eb2afdc19f97001ceae7a31acf674c849af94 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: ^1.0.5 + call-bind: ^1.0.2 + for-each: ^0.3.3 + has-proto: ^1.0.1 + is-typed-array: ^1.1.10 + checksum: 04f6f02d0e9a948a95fbfe0d5a70b002191fae0b8fe0fe3130a9b2336f043daf7a3dda56a31333c35a067a97e13f539949ab261ca0f3692c41603a46a94e960b + languageName: node + linkType: hard + "typed-array-length@npm:^1.0.4": version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" @@ -15968,6 +16829,31 @@ __metadata: languageName: node linkType: hard +"typedoc-plugin-markdown@npm:4.0.0-next.22": + version: 4.0.0-next.22 + resolution: "typedoc-plugin-markdown@npm:4.0.0-next.22" + peerDependencies: + typedoc: ">=0.25.0" + checksum: a27a76ee7c7ef1a46fad0177159c067bb7890bc293fcf207110d2b8354aeba337ada6d9a99cec68ba3745807ab64581282acf8a21532b4d4f4748a6a644501b2 + languageName: node + linkType: hard + +"typedoc@npm:^0.25.1": + version: 0.25.2 + resolution: "typedoc@npm:0.25.2" + dependencies: + lunr: ^2.3.9 + marked: ^4.3.0 + minimatch: ^9.0.3 + shiki: ^0.14.1 + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x + bin: + typedoc: bin/typedoc + checksum: 5b6e24bae7498bb542aaba495378ed5a3e13c76eb04a1ae95b506f76bda4d517847101fb05a7eab3f6b79357d1e2ac6f4747d39792395329b72e463f7effda65 + languageName: node + linkType: hard + "typescript@npm:^4.7.4": version: 4.9.5 resolution: "typescript@npm:4.9.5" @@ -15989,9 +16875,9 @@ __metadata: linkType: hard "ua-parser-js@npm:^1.0.35": - version: 1.0.35 - resolution: "ua-parser-js@npm:1.0.35" - checksum: 02370d38a0c8b586f2503d1c3bbba5cbc0b97d407282f9023201a99e4c03eae4357a2800fdf50cf80d73ec25c0b0cc5bfbaa03975b0add4043d6e4c86712c9c1 + version: 1.0.36 + resolution: "ua-parser-js@npm:1.0.36" + checksum: 5b2c8a5e3443dfbba7624421805de946457c26ae167cb2275781a2729d1518f7067c9d5c74c3b0acac4b9ff3278cae4eace08ca6eecb63848bc3b2f6a63cc975 languageName: node linkType: hard @@ -16007,6 +16893,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~5.25.1": + version: 5.25.3 + resolution: "undici-types@npm:5.25.3" + checksum: ec9d2cc36520cbd9fbe3b3b6c682a87fe5be214699e1f57d1e3d9a2cb5be422e62735f06e0067dc325fd3dd7404c697e4d479f9147dc8a804e049e29f357f2ff + languageName: node + linkType: hard + "unherit@npm:^1.0.4": version: 1.1.3 resolution: "unherit@npm:1.1.3" @@ -16346,9 +17239,9 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.11": - version: 1.0.11 - resolution: "update-browserslist-db@npm:1.0.11" +"update-browserslist-db@npm:^1.0.13": + version: 1.0.13 + resolution: "update-browserslist-db@npm:1.0.13" dependencies: escalade: ^3.1.1 picocolors: ^1.0.0 @@ -16356,7 +17249,7 @@ __metadata: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: b98327518f9a345c7cad5437afae4d2ae7d865f9779554baf2a200fdf4bac4969076b679b1115434bd6557376bdd37ca7583d0f9b8f8e302d7d4cc1e91b5f231 + checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 languageName: node linkType: hard @@ -16445,12 +17338,12 @@ __metadata: linkType: hard "url@npm:^0.11.0": - version: 0.11.1 - resolution: "url@npm:0.11.1" + version: 0.11.3 + resolution: "url@npm:0.11.3" dependencies: punycode: ^1.4.1 - qs: ^6.11.0 - checksum: a7de4b37bbcbe60ef199acda4ce437ef843c0ef3a4b34ec3e3d97e0446a5f50dc7bfeafbe33ad118cf4e5aa04805e1328f0d0126e254f2b77bb8498fa395c596 + qs: ^6.11.2 + checksum: f9e7886f46a16f96d2e42fbcc5d682c231c55ef5442c1ff66150c0f6556f6e3a97d094a84f51be15ec2432711d212eb60426659ce418f5fcadeaa3f601532c4e languageName: node linkType: hard @@ -16517,7 +17410,7 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.0, util@npm:^0.12.4": +"util@npm:^0.12.4, util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -16560,6 +17453,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^9.0.0": + version: 9.0.1 + resolution: "uuid@npm:9.0.1" + bin: + uuid: dist/bin/uuid + checksum: 39931f6da74e307f51c0fb463dc2462807531dc80760a9bff1e35af4316131b4fc3203d16da60ae33f07fdca5b56f3f1dd662da0c99fea9aaeab2004780cc5f4 + languageName: node + linkType: hard + "uvu@npm:^0.5.0": version: 0.5.6 resolution: "uvu@npm:0.5.6" @@ -16715,6 +17617,20 @@ __metadata: languageName: node linkType: hard +"vscode-oniguruma@npm:^1.7.0": + version: 1.7.0 + resolution: "vscode-oniguruma@npm:1.7.0" + checksum: 53519d91d90593e6fb080260892e87d447e9b200c4964d766772b5053f5699066539d92100f77f1302c91e8fc5d9c772fbe40fe4c90f3d411a96d5a9b1e63f42 + languageName: node + linkType: hard + +"vscode-textmate@npm:^8.0.0": + version: 8.0.0 + resolution: "vscode-textmate@npm:8.0.0" + checksum: 127780dfea89559d70b8326df6ec344cfd701312dd7f3f591a718693812b7852c30b6715e3cfc8b3200a4e2515b4c96f0843c0eacc0a3020969b5de262c2a4bb + languageName: node + linkType: hard + "wait-on@npm:^6.0.1": version: 6.0.1 resolution: "wait-on@npm:6.0.1" @@ -16763,6 +17679,13 @@ __metadata: languageName: node linkType: hard +"web-worker@npm:^1.2.0": + version: 1.2.0 + resolution: "web-worker@npm:1.2.0" + checksum: 1bb28348ddcf9b2e7c62c5fd02e49a84098795856cd905456de957271bba288e9618941cf69d8960f0a7ae81f5dfb74b427c0634be47ec69e3e955c4ec5213be + languageName: node + linkType: hard + "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" @@ -16771,22 +17694,29 @@ __metadata: linkType: hard "webpack-bundle-analyzer@npm:^4.5.0": - version: 4.9.0 - resolution: "webpack-bundle-analyzer@npm:4.9.0" + version: 4.9.1 + resolution: "webpack-bundle-analyzer@npm:4.9.1" dependencies: "@discoveryjs/json-ext": 0.5.7 acorn: ^8.0.4 acorn-walk: ^8.0.0 - chalk: ^4.1.0 commander: ^7.2.0 + escape-string-regexp: ^4.0.0 gzip-size: ^6.0.0 - lodash: ^4.17.20 + is-plain-object: ^5.0.0 + lodash.debounce: ^4.0.8 + lodash.escape: ^4.0.1 + lodash.flatten: ^4.4.0 + lodash.invokemap: ^4.6.0 + lodash.pullall: ^4.2.0 + lodash.uniqby: ^4.7.0 opener: ^1.5.2 - sirv: ^1.0.7 + picocolors: ^1.0.0 + sirv: ^2.0.3 ws: ^7.3.1 bin: webpack-bundle-analyzer: lib/bin/analyzer.js - checksum: e439aea4e88e18bfdc16eb69782c1bb17b2e581905a5cfa8d34058dc6677f6e202f896189268e58b49fa14ae12f5ef4c25cdca9f98f3de7e6699ac62def2f0af + checksum: 7e891c28d5a903242893e55ecc714fa01d7ad6bedade143235c07091b235915349812fa048968462781d59187507962f38b6c61ed7d25fb836ba0ac0ee919a39 languageName: node linkType: hard @@ -16870,8 +17800,8 @@ __metadata: linkType: hard "webpack@npm:^5.73.0": - version: 5.88.1 - resolution: "webpack@npm:5.88.1" + version: 5.88.2 + resolution: "webpack@npm:5.88.2" dependencies: "@types/eslint-scope": ^3.7.3 "@types/estree": ^1.0.0 @@ -16902,7 +17832,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: 726e7e05ab2e7c142609a673dd6aa1a711ed97f349418a2a393d650c5ddad172d191257f60e1e37f6b2a77261571c202aabd5ce9240791a686774f0801cf5ec2 + checksum: 79476a782da31a21f6dd38fbbd06b68da93baf6a62f0d08ca99222367f3b8668f5a1f2086b7bb78e23172e31fa6df6fa7ab09b25e827866c4fc4dc2b30443ce2 languageName: node linkType: hard @@ -16939,9 +17869,9 @@ __metadata: linkType: hard "whatwg-fetch@npm:>=0.10.0, whatwg-fetch@npm:^3.4.1": - version: 3.6.2 - resolution: "whatwg-fetch@npm:3.6.2" - checksum: ee976b7249e7791edb0d0a62cd806b29006ad7ec3a3d89145921ad8c00a3a67e4be8f3fb3ec6bc7b58498724fd568d11aeeeea1f7827e7e1e5eae6c8a275afed + version: 3.6.19 + resolution: "whatwg-fetch@npm:3.6.19" + checksum: 2896bc9ca867ea514392c73e2a272f65d5c4916248fe0837a9df5b1b92f247047bc76cf7c29c28a01ac6c5fb4314021d2718958c8a08292a96d56f72b2f56806 languageName: node linkType: hard @@ -16968,17 +17898,48 @@ __metadata: languageName: node linkType: hard -"which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": - version: 1.1.10 - resolution: "which-typed-array@npm:1.1.10" +"which-builtin-type@npm:^1.1.3": + version: 1.1.3 + resolution: "which-builtin-type@npm:1.1.3" + dependencies: + function.prototype.name: ^1.1.5 + has-tostringtag: ^1.0.0 + is-async-function: ^2.0.0 + is-date-object: ^1.0.5 + is-finalizationregistry: ^1.0.2 + is-generator-function: ^1.0.10 + is-regex: ^1.1.4 + is-weakref: ^1.0.2 + isarray: ^2.0.5 + which-boxed-primitive: ^1.0.2 + which-collection: ^1.0.1 + which-typed-array: ^1.1.9 + checksum: 43730f7d8660ff9e33d1d3f9f9451c4784265ee7bf222babc35e61674a11a08e1c2925019d6c03154fcaaca4541df43abe35d2720843b9b4cbcebdcc31408f36 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.1": + version: 1.0.1 + resolution: "which-collection@npm:1.0.1" + dependencies: + is-map: ^2.0.1 + is-set: ^2.0.1 + is-weakmap: ^2.0.1 + is-weakset: ^2.0.1 + checksum: c815bbd163107ef9cb84f135e6f34453eaf4cca994e7ba85ddb0d27cea724c623fae2a473ceccfd5549c53cc65a5d82692de418166df3f858e1e5dc60818581c + languageName: node + linkType: hard + +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.2, which-typed-array@npm:^1.1.9": + version: 1.1.11 + resolution: "which-typed-array@npm:1.1.11" dependencies: available-typed-arrays: ^1.0.5 call-bind: ^1.0.2 for-each: ^0.3.3 gopd: ^1.0.1 has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.10 - checksum: 149f54f5d11773ce938c60a2c36306720a1824eccb62bda0620170932c2783fa50ad0226254c5741a962e35c7ccba5f4e4c402b8618cb3b4f2cf47bf5e6ade31 + checksum: 711ffc8ef891ca6597b19539075ec3e08bb9b4c2ca1f78887e3c07a977ab91ac1421940505a197758fb5939aa9524976d0a5bbcac34d07ed6faa75cedbb17206 languageName: node linkType: hard @@ -17143,8 +18104,8 @@ __metadata: linkType: hard "ws@npm:^8.13.0": - version: 8.13.0 - resolution: "ws@npm:8.13.0" + version: 8.14.2 + resolution: "ws@npm:8.14.2" peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ">=5.0.2" @@ -17153,7 +18114,7 @@ __metadata: optional: true utf-8-validate: optional: true - checksum: 53e991bbf928faf5dc6efac9b8eb9ab6497c69feeb94f963d648b7a3530a720b19ec2e0ec037344257e05a4f35bd9ad04d9de6f289615ffb133282031b18c61c + checksum: 3ca0dad26e8cc6515ff392b622a1467430814c463b3368b0258e33696b1d4bed7510bc7030f7b72838b9fdeb8dbd8839cbf808367d6aae2e1d668ce741d4308b languageName: node linkType: hard