diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 3d7f2589..00000000 --- a/Dockerfile +++ /dev/null @@ -1,50 +0,0 @@ -## Base ######################################################################## -# Use a larger node image to do the build for native deps (e.g., gcc, python) -FROM node:lts-bookworm@sha256:f4698d49371c8a9fa7dd78b97fb2a532213903066e47966542b3b1d403449da4 as base - -# Reduce npm log spam and colour during install within Docker -ENV NPM_CONFIG_LOGLEVEL=warn -ENV NPM_CONFIG_COLOR=false - -# Switch to the node user vs. root -USER node - -RUN mkdir /home/node/app - -# We'll run the app as the `node` user, so put it in their home directory -WORKDIR /home/node/app - -# Install dependencies -COPY --chown=node:node package.json /home/node/app/ -COPY --chown=node:node package-lock.json /home/node/app/ -COPY --chown=node:node yarn.lock /home/node/app/ -RUN npm install - - -# Copy the source code over -COPY --chown=node:node . /home/node/app/ - -## Development ################################################################# -# Define a development target that installs devDeps and runs in dev mode -FROM base as development -WORKDIR /home/node/app -COPY --chown=node:node --from=base /home/node/app/node_modules /home/node/app/node_modules -# Expose port 3000 -EXPOSE 3000 -# Start the app in debug mode so we can attach the debugger -CMD ["npm", "start"] - -## Production ################################################################## -# Also define a production target which doesn't use devDeps -FROM base as production -WORKDIR /home/node/app -COPY --chown=node:node --from=development /home/node/app/node_modules /home/node/app/node_modules -# Build the Docusaurus app -RUN npm run build - -## Deploy ###################################################################### -# Use a stable nginx image -FROM nginx:bookworm@sha256:08bc36ad52474e528cc1ea3426b5e3f4bad8a130318e3140d6cfe29c8892c7ef as deploy -WORKDIR /home/node/app -# Copy what we've installed/built from production -COPY --chown=node:node --from=production /home/node/app/build /usr/share/nginx/html/ diff --git a/Makefile b/Makefile deleted file mode 100644 index 53dd04c7..00000000 --- a/Makefile +++ /dev/null @@ -1,26 +0,0 @@ -ifeq ($(shell uname -s), Darwin) -BUILD_COMMAND = buildx build --load -else -BUILD_COMMAND = build -endif - -# Lists all make commands in a Makefile -.PHONY: list -list: - @LC_ALL=C $(MAKE) -pRrq -f $(firstword $(MAKEFILE_LIST)) : 2>/dev/null | awk -v RS= -F: '/(^|\n)# Files(\n|$$)/,/(^|\n)# Finished Make data base/ {if ($$1 !~ "^[#.]") {print $$1}}' | sort | egrep -v -e '^[^[:alnum:]]' -e '^$@$$' - -.PHONY: image -image: - docker $(BUILD_COMMAND) -t tkhq/docs --target production . - -.PHONY: dev-image -dev-image: Dockerfile - docker $(BUILD_COMMAND) -t tkhq/docs:dev --target development . - -.PHONY: run-dev -run-dev: dev-image - docker run -p 3000:3000 -v $(PWD):/home/node/app/ tkhq/docs:dev - -.PHONY: stop-dev -stop-dev: - docker stop $(shell docker ps -a -q --filter ancestor=tkhq/docs:dev) diff --git a/README.md b/README.md index 1a828aca..d6210daf 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,56 @@ This repo hosts the documentation hosted at https://docs.turnkey.com. -It's built with [Docusaurus](https://docusaurus.io/). +## Development + +### Prerequisites + +To work with this documentation locally, you'll need: + +- Node.js (see `.nvmrc` for the recommended version) +- npm or yarn + +### Local Development + +Install the [Mintlify CLI](https://www.npmjs.com/package/mintlify) to preview documentation changes locally: + +```sh +# Install Mintlify CLI globally +npm i -g mintlify + +# Start the local development server +mintlify dev +``` + +This will start a local development server where you can preview your changes in real-time. + +If you encounter any issues with the development server: -## Algolia +- Run `mintlify install` to reinstall dependencies +- Ensure you're running the command in a folder with `docs.json` (Mintlify's configuration file) + +> **Important:** If you previously worked with the Docusaurus version of this site, make sure to delete the `build` and `.docusaurus` folders before running the Mintlify docs site locally. Otherwise, you may experience style conflicts. + +### Deployment + +Changes to the documentation are automatically deployed when merged to the main branch through our CI/CD pipeline. + +### Mintlify Dashboard + +You can access the Mintlify dashboard for this project at: +[dashboard.mintlify.com](https://dashboard.mintlify.com/turnkey-0e7c1f5b/turnkey-0e7c1f5b) + +## The dashboard provides analytics, deployment status, and other management features for our documentation. + +## Legacy Documentation + +The following information pertains to the previous Docusaurus-based documentation setup. + +### Algolia We use the Algolia plugin for Docusaurus to manage search on our docs page. The primary dashboard can be accessed via https://dashboard.algolia.com/apps/89KSB43UFT/dashboard. Reach out to Jack, Arnaud, or Andrew for access. -### Crawling +#### Crawling Our crawler settings can be found at https://crawler.algolia.com/admin/crawlers/15584ae7-61de-4f26-af35-4bc55d0de0b5/overview. Algolia crawls our docs site once a week on Monday at 12:31 (UTC). This is simply the default behavior. There are cases where we may want to forcefully trigger Algolia to crawl/index our site, i.e. when we do a big refactor or otherwise reorganize the structure of our docs significantly. @@ -18,8 +61,6 @@ In order to manually trigger a new crawl, use the `Restart crawling` button: Our docs site is small, so each crawl is quick (~30-60s). -## Development - ### Vercel Each push to Github will trigger a Vercel build: @@ -28,7 +69,7 @@ Each push to Github will trigger a Vercel build: This is a convenient way to view changes, add feedback, and collaborate overall. Any build can also be promoted to production, if need be. -### Local Development +### Legacy Local Development #### With yarn diff --git a/api-overview.mdx b/api-overview.mdx new file mode 100644 index 00000000..42506559 --- /dev/null +++ b/api-overview.mdx @@ -0,0 +1,27 @@ +--- +title: API Overview +mode: wide +sidebarTitle: Overview +--- + + + + Getting started with the Turnkey API + + + + Creating your first signed request + + + + Fetching data from Turnkey + + + + Secure execution with Turnkey + + + + Enumerating all errors received using the Turnkey API + + diff --git a/api-reference/activities/get-activity.mdx b/api-reference/activities/get-activity.mdx new file mode 100644 index 00000000..494b42a8 --- /dev/null +++ b/api-reference/activities/get-activity.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_activity +--- \ No newline at end of file diff --git a/api-reference/activities/list-activities.mdx b/api-reference/activities/list-activities.mdx new file mode 100644 index 00000000..447585d2 --- /dev/null +++ b/api-reference/activities/list-activities.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_activities +--- \ No newline at end of file diff --git a/api-reference/activities/overview.mdx b/api-reference/activities/overview.mdx new file mode 100644 index 00000000..cf9a3ec1 --- /dev/null +++ b/api-reference/activities/overview.mdx @@ -0,0 +1,7 @@ +--- +title: "Activities" +description: "Activities encapsulate all the possible actions that can be taken with Turnkey. Some examples include adding a new user, creating a private key, and signing a transaction." +sidebarTitle: "Overview" +mode: wide +--- +Activities that modify your Organization are processed asynchronously. To confirm processing is complete and retrieve the Activity results, these activities must be polled until that status has been updated to a finalized state: `COMPLETED` when the activity is successful or `FAILED` when the activity has failed diff --git a/api-reference/api-keys/create-api-keys.mdx b/api-reference/api-keys/create-api-keys.mdx new file mode 100644 index 00000000..e21db99e --- /dev/null +++ b/api-reference/api-keys/create-api-keys.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_api_keys +--- \ No newline at end of file diff --git a/api-reference/api-keys/delete-api-keys.mdx b/api-reference/api-keys/delete-api-keys.mdx new file mode 100644 index 00000000..8452cade --- /dev/null +++ b/api-reference/api-keys/delete-api-keys.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_api_keys +--- \ No newline at end of file diff --git a/api-reference/api-keys/get-api-key-1.mdx b/api-reference/api-keys/get-api-key-1.mdx new file mode 100644 index 00000000..88804c22 --- /dev/null +++ b/api-reference/api-keys/get-api-key-1.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_api_keys +--- \ No newline at end of file diff --git a/api-reference/api-keys/get-api-key.mdx b/api-reference/api-keys/get-api-key.mdx new file mode 100644 index 00000000..6a8aea69 --- /dev/null +++ b/api-reference/api-keys/get-api-key.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_api_key +--- \ No newline at end of file diff --git a/api-reference/api-keys/overview.mdx b/api-reference/api-keys/overview.mdx new file mode 100644 index 00000000..c18500a4 --- /dev/null +++ b/api-reference/api-keys/overview.mdx @@ -0,0 +1,7 @@ +--- +title: "API Keys" +description: "API Keys are used to authenticate requests" +sidebarTitle: "Overview" +mode: wide +--- +See our [CLI](https://github.com/tkhq/tkcli) for instructions on generating API Keys diff --git a/api-reference/authenticators/create-authenticators.mdx b/api-reference/authenticators/create-authenticators.mdx new file mode 100644 index 00000000..e193d22c --- /dev/null +++ b/api-reference/authenticators/create-authenticators.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_authenticators +--- \ No newline at end of file diff --git a/api-reference/authenticators/delete-authenticators.mdx b/api-reference/authenticators/delete-authenticators.mdx new file mode 100644 index 00000000..0800be70 --- /dev/null +++ b/api-reference/authenticators/delete-authenticators.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_authenticators +--- \ No newline at end of file diff --git a/api-reference/authenticators/get-authenticator.mdx b/api-reference/authenticators/get-authenticator.mdx new file mode 100644 index 00000000..784e5624 --- /dev/null +++ b/api-reference/authenticators/get-authenticator.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_authenticator +--- \ No newline at end of file diff --git a/api-reference/authenticators/get-authenticators.mdx b/api-reference/authenticators/get-authenticators.mdx new file mode 100644 index 00000000..65dde603 --- /dev/null +++ b/api-reference/authenticators/get-authenticators.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_authenticators +--- \ No newline at end of file diff --git a/api-reference/authenticators/overview.mdx b/api-reference/authenticators/overview.mdx new file mode 100644 index 00000000..ab43e076 --- /dev/null +++ b/api-reference/authenticators/overview.mdx @@ -0,0 +1,6 @@ +--- +title: "Authenticators" +description: "Authenticators are WebAuthN hardware devices, such as a Macbook TouchID or Yubikey, that can be used to authenticate requests." +sidebarTitle: "Overview" +mode: wide +--- diff --git a/api-reference/consensus/approve-activity.mdx b/api-reference/consensus/approve-activity.mdx new file mode 100644 index 00000000..2e3163b0 --- /dev/null +++ b/api-reference/consensus/approve-activity.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/approve_activity +--- \ No newline at end of file diff --git a/api-reference/consensus/overview.mdx b/api-reference/consensus/overview.mdx new file mode 100644 index 00000000..a851322d --- /dev/null +++ b/api-reference/consensus/overview.mdx @@ -0,0 +1,8 @@ +--- +title: "Consensus" +description: "Policies can enforce consensus requirements for Activities. For example, adding a new user requires two admins to approve the request." +sidebarTitle: "Overview" +mode: wide +--- + +Activities that have been proposed, but don't yet meet the Consesnsus requirements will have the status: `REQUIRES_CONSENSUS`. Activities in this state can be approved or rejected using the unique fingerprint generated when an Activity is created. diff --git a/api-reference/consensus/reject-activity.mdx b/api-reference/consensus/reject-activity.mdx new file mode 100644 index 00000000..ddeae665 --- /dev/null +++ b/api-reference/consensus/reject-activity.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/reject_activity +--- \ No newline at end of file diff --git a/api-reference/features/remove-organization-feature.mdx b/api-reference/features/remove-organization-feature.mdx new file mode 100644 index 00000000..b5089a6a --- /dev/null +++ b/api-reference/features/remove-organization-feature.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/remove_organization_feature +--- \ No newline at end of file diff --git a/api-reference/features/set-organization-feature.mdx b/api-reference/features/set-organization-feature.mdx new file mode 100644 index 00000000..49ad2190 --- /dev/null +++ b/api-reference/features/set-organization-feature.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/set_organization_feature +--- \ No newline at end of file diff --git a/api-reference/invitations/create-invitations.mdx b/api-reference/invitations/create-invitations.mdx new file mode 100644 index 00000000..8ae62b8a --- /dev/null +++ b/api-reference/invitations/create-invitations.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_invitations +--- \ No newline at end of file diff --git a/api-reference/invitations/delete-invitation.mdx b/api-reference/invitations/delete-invitation.mdx new file mode 100644 index 00000000..aecf0889 --- /dev/null +++ b/api-reference/invitations/delete-invitation.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_invitation +--- \ No newline at end of file diff --git a/api-reference/invitations/overview.mdx b/api-reference/invitations/overview.mdx new file mode 100644 index 00000000..2124b85b --- /dev/null +++ b/api-reference/invitations/overview.mdx @@ -0,0 +1,8 @@ +--- +title: "Invitations" +description: "Invitations allow you to invite Users into your Organization via email. Alternatively, Users can be added directly without an Invitation if their ApiKey or Authenticator credentials are known ahead of time." +sidebarTitle: "Overview" +mode: wide +--- + +See [Users](/api-reference/users/overview) for more information diff --git a/api-reference/organizations/create-sub-organization.mdx b/api-reference/organizations/create-sub-organization.mdx new file mode 100644 index 00000000..f409d60e --- /dev/null +++ b/api-reference/organizations/create-sub-organization.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_sub_organization +--- \ No newline at end of file diff --git a/api-reference/organizations/delete-sub-organization.mdx b/api-reference/organizations/delete-sub-organization.mdx new file mode 100644 index 00000000..e7608f9c --- /dev/null +++ b/api-reference/organizations/delete-sub-organization.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_sub_organization +--- \ No newline at end of file diff --git a/api-reference/organizations/get-configs.mdx b/api-reference/organizations/get-configs.mdx new file mode 100644 index 00000000..468afbcb --- /dev/null +++ b/api-reference/organizations/get-configs.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_organization_configs +--- \ No newline at end of file diff --git a/api-reference/organizations/get-suborgs.mdx b/api-reference/organizations/get-suborgs.mdx new file mode 100644 index 00000000..5da7d699 --- /dev/null +++ b/api-reference/organizations/get-suborgs.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_suborgs +--- \ No newline at end of file diff --git a/api-reference/organizations/get-verified-suborgs.mdx b/api-reference/organizations/get-verified-suborgs.mdx new file mode 100644 index 00000000..c7c78d70 --- /dev/null +++ b/api-reference/organizations/get-verified-suborgs.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_verified_suborgs +--- \ No newline at end of file diff --git a/api-reference/organizations/overview.mdx b/api-reference/organizations/overview.mdx new file mode 100644 index 00000000..74da18da --- /dev/null +++ b/api-reference/organizations/overview.mdx @@ -0,0 +1,8 @@ +--- +title: "Organizations" +description: "An Organization is the highest level of hierarchy in Turnkey. It can contain many Users, Private Keys, and Policies managed by a Root Quorum. The Root Quorum consists of a set of Users with a consensus threshold. This consensus threshold must be reached by Quorum members in order for any actions to take place." +sidebarTitle: "Overview" +mode: wide +--- + +See [Root Quorum](/concepts/users/root-quorum) for more information diff --git a/api-reference/organizations/update-root-quorum.mdx b/api-reference/organizations/update-root-quorum.mdx new file mode 100644 index 00000000..7b922125 --- /dev/null +++ b/api-reference/organizations/update-root-quorum.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/update_root_quorum +--- \ No newline at end of file diff --git a/api-reference/overview.mdx b/api-reference/overview.mdx new file mode 100644 index 00000000..c6c017c9 --- /dev/null +++ b/api-reference/overview.mdx @@ -0,0 +1,7 @@ +--- +title: "API Reference" +description: "Review our [API Introduction](/developer-reference/api-overview/intro) to get started." +sidebarTitle: "Overview" +mode: wide +--- + diff --git a/api-reference/policies/create-policies.mdx b/api-reference/policies/create-policies.mdx new file mode 100644 index 00000000..ac23d384 --- /dev/null +++ b/api-reference/policies/create-policies.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_policies +--- \ No newline at end of file diff --git a/api-reference/policies/create-policy.mdx b/api-reference/policies/create-policy.mdx new file mode 100644 index 00000000..047f3aac --- /dev/null +++ b/api-reference/policies/create-policy.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_policy +--- \ No newline at end of file diff --git a/api-reference/policies/delete-policy.mdx b/api-reference/policies/delete-policy.mdx new file mode 100644 index 00000000..5138f9ca --- /dev/null +++ b/api-reference/policies/delete-policy.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_policy +--- \ No newline at end of file diff --git a/api-reference/policies/get-policy.mdx b/api-reference/policies/get-policy.mdx new file mode 100644 index 00000000..5f5a1b67 --- /dev/null +++ b/api-reference/policies/get-policy.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_policy +--- \ No newline at end of file diff --git a/api-reference/policies/list-policies.mdx b/api-reference/policies/list-policies.mdx new file mode 100644 index 00000000..68e83ce4 --- /dev/null +++ b/api-reference/policies/list-policies.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_policies +--- \ No newline at end of file diff --git a/api-reference/policies/overview.mdx b/api-reference/policies/overview.mdx new file mode 100644 index 00000000..57ec8b79 --- /dev/null +++ b/api-reference/policies/overview.mdx @@ -0,0 +1,7 @@ +--- +title: "Policies" +description: "Policies allow for deep customization of the security of your Organization. They can be used to grant permissions or restrict usage of Users and Private Keys. The Policy Engine analyzes all of your Policies on each request to determine whether an Activity is allowed." +sidebarTitle: "Overview" +mode: wide +--- +See [Policy Overview](/concepts/policies/overview) for more information diff --git a/api-reference/policies/update-policy.mdx b/api-reference/policies/update-policy.mdx new file mode 100644 index 00000000..83b6dafd --- /dev/null +++ b/api-reference/policies/update-policy.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/update_policy +--- \ No newline at end of file diff --git a/api-reference/private-key-tags/create-private-key-tag.mdx b/api-reference/private-key-tags/create-private-key-tag.mdx new file mode 100644 index 00000000..b87c4d9a --- /dev/null +++ b/api-reference/private-key-tags/create-private-key-tag.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_private_key_tag +--- \ No newline at end of file diff --git a/api-reference/private-key-tags/delete-private-key-tags.mdx b/api-reference/private-key-tags/delete-private-key-tags.mdx new file mode 100644 index 00000000..e122dabb --- /dev/null +++ b/api-reference/private-key-tags/delete-private-key-tags.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_private_key_tags +--- \ No newline at end of file diff --git a/api-reference/private-key-tags/list-private-key-tags.mdx b/api-reference/private-key-tags/list-private-key-tags.mdx new file mode 100644 index 00000000..864e8820 --- /dev/null +++ b/api-reference/private-key-tags/list-private-key-tags.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_private_key_tags +--- \ No newline at end of file diff --git a/api-reference/private-key-tags/overview.mdx b/api-reference/private-key-tags/overview.mdx new file mode 100644 index 00000000..933b1a76 --- /dev/null +++ b/api-reference/private-key-tags/overview.mdx @@ -0,0 +1,6 @@ +--- +title: "Private Key Tags" +description: "Private Key Tags allow you to easily group and permission Private Keys through Policies." +sidebarTitle: "Overview" +mode: wide +--- diff --git a/api-reference/private-key-tags/update-private-key-tag.mdx b/api-reference/private-key-tags/update-private-key-tag.mdx new file mode 100644 index 00000000..1f10b26f --- /dev/null +++ b/api-reference/private-key-tags/update-private-key-tag.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/update_private_key_tag +--- \ No newline at end of file diff --git a/api-reference/private-keys/create-private-keys.mdx b/api-reference/private-keys/create-private-keys.mdx new file mode 100644 index 00000000..888fd6bc --- /dev/null +++ b/api-reference/private-keys/create-private-keys.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_private_keys +--- \ No newline at end of file diff --git a/api-reference/private-keys/delete-private-keys.mdx b/api-reference/private-keys/delete-private-keys.mdx new file mode 100644 index 00000000..1fb3aaef --- /dev/null +++ b/api-reference/private-keys/delete-private-keys.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_private_keys +--- \ No newline at end of file diff --git a/api-reference/private-keys/export-private-key.mdx b/api-reference/private-keys/export-private-key.mdx new file mode 100644 index 00000000..b201ce92 --- /dev/null +++ b/api-reference/private-keys/export-private-key.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/export_private_key +--- \ No newline at end of file diff --git a/api-reference/private-keys/get-private-key.mdx b/api-reference/private-keys/get-private-key.mdx new file mode 100644 index 00000000..39a4ec54 --- /dev/null +++ b/api-reference/private-keys/get-private-key.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_private_key +--- \ No newline at end of file diff --git a/api-reference/private-keys/import-private-key.mdx b/api-reference/private-keys/import-private-key.mdx new file mode 100644 index 00000000..38205427 --- /dev/null +++ b/api-reference/private-keys/import-private-key.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/import_private_key +--- \ No newline at end of file diff --git a/api-reference/private-keys/init-import-private-key.mdx b/api-reference/private-keys/init-import-private-key.mdx new file mode 100644 index 00000000..ec5d5863 --- /dev/null +++ b/api-reference/private-keys/init-import-private-key.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/init_import_private_key +--- \ No newline at end of file diff --git a/api-reference/private-keys/list-private-keys.mdx b/api-reference/private-keys/list-private-keys.mdx new file mode 100644 index 00000000..f68b663e --- /dev/null +++ b/api-reference/private-keys/list-private-keys.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_private_keys +--- \ No newline at end of file diff --git a/api-reference/private-keys/overview.mdx b/api-reference/private-keys/overview.mdx new file mode 100644 index 00000000..30e60cd3 --- /dev/null +++ b/api-reference/private-keys/overview.mdx @@ -0,0 +1,8 @@ +--- +title: "Private Keys" +description: "Private Keys are cryptographic public / private key pairs that can be used for cryptocurrency needs or more generalized encryption. Turnkey securely holds all private key materials for you, but only you can access them." +sidebarTitle: "Overview" +mode: wide +--- + +The Private Key ID or any derived address can be used to create digital signatures. See [Signing](/api-reference/signing/overview) for more information diff --git a/api-reference/sessions/create-read-only-session.mdx b/api-reference/sessions/create-read-only-session.mdx new file mode 100644 index 00000000..addda1aa --- /dev/null +++ b/api-reference/sessions/create-read-only-session.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_read_only_session +--- \ No newline at end of file diff --git a/api-reference/sessions/create-read-write-session.mdx b/api-reference/sessions/create-read-write-session.mdx new file mode 100644 index 00000000..e72d96fa --- /dev/null +++ b/api-reference/sessions/create-read-write-session.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_read_write_session +--- \ No newline at end of file diff --git a/api-reference/sessions/who-am-i.mdx b/api-reference/sessions/who-am-i.mdx new file mode 100644 index 00000000..edee15c2 --- /dev/null +++ b/api-reference/sessions/who-am-i.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/whoami +--- \ No newline at end of file diff --git a/api-reference/signing/overview.mdx b/api-reference/signing/overview.mdx new file mode 100644 index 00000000..2e23e8e4 --- /dev/null +++ b/api-reference/signing/overview.mdx @@ -0,0 +1,6 @@ +--- +title: "Signing" +description: "Signers allow you to create digital signatures. Signatures are used to validate the authenticity and integrity of a digital message. Turnkey makes it easy to produce signatures by allowing you to sign with an address. If Turnkey doesn't yet support an address format you need, you can generate and sign with the public key instead by using the address format `ADDRESS_FORMAT_COMPRESSED`." +sidebarTitle: "Overview" +mode: wide +--- diff --git a/api-reference/signing/sign-raw-payload.mdx b/api-reference/signing/sign-raw-payload.mdx new file mode 100644 index 00000000..1036e977 --- /dev/null +++ b/api-reference/signing/sign-raw-payload.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/sign_raw_payload +--- \ No newline at end of file diff --git a/api-reference/signing/sign-raw-payloads.mdx b/api-reference/signing/sign-raw-payloads.mdx new file mode 100644 index 00000000..f4fe4382 --- /dev/null +++ b/api-reference/signing/sign-raw-payloads.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/sign_raw_payloads +--- \ No newline at end of file diff --git a/api-reference/signing/sign-transaction.mdx b/api-reference/signing/sign-transaction.mdx new file mode 100644 index 00000000..4b4725ef --- /dev/null +++ b/api-reference/signing/sign-transaction.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/sign_transaction +--- \ No newline at end of file diff --git a/api-reference/user-auth/create-oauth-providers.mdx b/api-reference/user-auth/create-oauth-providers.mdx new file mode 100644 index 00000000..aa8b098d --- /dev/null +++ b/api-reference/user-auth/create-oauth-providers.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_oauth_providers +--- \ No newline at end of file diff --git a/api-reference/user-auth/delete-oauth-providers.mdx b/api-reference/user-auth/delete-oauth-providers.mdx new file mode 100644 index 00000000..28ba9c50 --- /dev/null +++ b/api-reference/user-auth/delete-oauth-providers.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_oauth_providers +--- \ No newline at end of file diff --git a/api-reference/user-auth/get-oauth-providers.mdx b/api-reference/user-auth/get-oauth-providers.mdx new file mode 100644 index 00000000..d06346e6 --- /dev/null +++ b/api-reference/user-auth/get-oauth-providers.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_oauth_providers +--- \ No newline at end of file diff --git a/api-reference/user-auth/init-otp-auth.mdx b/api-reference/user-auth/init-otp-auth.mdx new file mode 100644 index 00000000..8a5b0140 --- /dev/null +++ b/api-reference/user-auth/init-otp-auth.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/init_otp_auth +--- \ No newline at end of file diff --git a/api-reference/user-auth/oauth.mdx b/api-reference/user-auth/oauth.mdx new file mode 100644 index 00000000..a713e955 --- /dev/null +++ b/api-reference/user-auth/oauth.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/oauth +--- \ No newline at end of file diff --git a/api-reference/user-auth/otp-auth.mdx b/api-reference/user-auth/otp-auth.mdx new file mode 100644 index 00000000..8a04906c --- /dev/null +++ b/api-reference/user-auth/otp-auth.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/otp_auth +--- \ No newline at end of file diff --git a/api-reference/user-auth/perform-email-auth.mdx b/api-reference/user-auth/perform-email-auth.mdx new file mode 100644 index 00000000..f749244f --- /dev/null +++ b/api-reference/user-auth/perform-email-auth.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/email_auth +--- \ No newline at end of file diff --git a/api-reference/user-recovery/init-email-recovery.mdx b/api-reference/user-recovery/init-email-recovery.mdx new file mode 100644 index 00000000..904e49ea --- /dev/null +++ b/api-reference/user-recovery/init-email-recovery.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/init_user_email_recovery +--- \ No newline at end of file diff --git a/api-reference/user-recovery/recover-a-user.mdx b/api-reference/user-recovery/recover-a-user.mdx new file mode 100644 index 00000000..e953fcb5 --- /dev/null +++ b/api-reference/user-recovery/recover-a-user.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/recover_user +--- \ No newline at end of file diff --git a/api-reference/user-tags/create-user-tag.mdx b/api-reference/user-tags/create-user-tag.mdx new file mode 100644 index 00000000..71be3653 --- /dev/null +++ b/api-reference/user-tags/create-user-tag.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_user_tag +--- \ No newline at end of file diff --git a/api-reference/user-tags/delete-user-tags.mdx b/api-reference/user-tags/delete-user-tags.mdx new file mode 100644 index 00000000..1f5b95cd --- /dev/null +++ b/api-reference/user-tags/delete-user-tags.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_user_tags +--- \ No newline at end of file diff --git a/api-reference/user-tags/list-user-tags.mdx b/api-reference/user-tags/list-user-tags.mdx new file mode 100644 index 00000000..7745eb91 --- /dev/null +++ b/api-reference/user-tags/list-user-tags.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_user_tags +--- \ No newline at end of file diff --git a/api-reference/user-tags/overview.mdx b/api-reference/user-tags/overview.mdx new file mode 100644 index 00000000..e0839796 --- /dev/null +++ b/api-reference/user-tags/overview.mdx @@ -0,0 +1,6 @@ +--- +title: "User Tags" +description: "User Key Tags allow you to easily group and permission Users through Policies." +sidebarTitle: "Overview" +mode: wide +--- diff --git a/api-reference/user-tags/update-user-tag.mdx b/api-reference/user-tags/update-user-tag.mdx new file mode 100644 index 00000000..6400b249 --- /dev/null +++ b/api-reference/user-tags/update-user-tag.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/update_user_tag +--- \ No newline at end of file diff --git a/api-reference/users/create-users.mdx b/api-reference/users/create-users.mdx new file mode 100644 index 00000000..3a3d9528 --- /dev/null +++ b/api-reference/users/create-users.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_users +--- \ No newline at end of file diff --git a/api-reference/users/delete-users.mdx b/api-reference/users/delete-users.mdx new file mode 100644 index 00000000..fffbf8b3 --- /dev/null +++ b/api-reference/users/delete-users.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_users +--- \ No newline at end of file diff --git a/api-reference/users/get-user.mdx b/api-reference/users/get-user.mdx new file mode 100644 index 00000000..93080224 --- /dev/null +++ b/api-reference/users/get-user.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_user +--- \ No newline at end of file diff --git a/api-reference/users/list-users.mdx b/api-reference/users/list-users.mdx new file mode 100644 index 00000000..dc557c94 --- /dev/null +++ b/api-reference/users/list-users.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_users +--- \ No newline at end of file diff --git a/api-reference/users/overview.mdx b/api-reference/users/overview.mdx new file mode 100644 index 00000000..dd1783d0 --- /dev/null +++ b/api-reference/users/overview.mdx @@ -0,0 +1,6 @@ +--- +title: "Users" +description: "Users are responsible for any action taken within an Organization. They can have ApiKey or Auuthenticator credentials, allowing you to onboard teammates to the Organization, or create API-only Users to run as part of your infrastructure." +sidebarTitle: "Overview" +mode: wide +--- diff --git a/api-reference/users/update-user.mdx b/api-reference/users/update-user.mdx new file mode 100644 index 00000000..b73a3a15 --- /dev/null +++ b/api-reference/users/update-user.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/update_user +--- \ No newline at end of file diff --git a/api-reference/wallets/create-wallet-accounts.mdx b/api-reference/wallets/create-wallet-accounts.mdx new file mode 100644 index 00000000..891e3fe9 --- /dev/null +++ b/api-reference/wallets/create-wallet-accounts.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_wallet_accounts +--- \ No newline at end of file diff --git a/api-reference/wallets/create-wallet.mdx b/api-reference/wallets/create-wallet.mdx new file mode 100644 index 00000000..370d7710 --- /dev/null +++ b/api-reference/wallets/create-wallet.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/create_wallet +--- \ No newline at end of file diff --git a/api-reference/wallets/delete-wallets.mdx b/api-reference/wallets/delete-wallets.mdx new file mode 100644 index 00000000..d7b4f7cb --- /dev/null +++ b/api-reference/wallets/delete-wallets.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/delete_wallets +--- \ No newline at end of file diff --git a/api-reference/wallets/export-wallet-account.mdx b/api-reference/wallets/export-wallet-account.mdx new file mode 100644 index 00000000..cbb9545a --- /dev/null +++ b/api-reference/wallets/export-wallet-account.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/export_wallet_account +--- \ No newline at end of file diff --git a/api-reference/wallets/export-wallet.mdx b/api-reference/wallets/export-wallet.mdx new file mode 100644 index 00000000..f1aded9b --- /dev/null +++ b/api-reference/wallets/export-wallet.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/export_wallet +--- \ No newline at end of file diff --git a/api-reference/wallets/get-wallet-account.mdx b/api-reference/wallets/get-wallet-account.mdx new file mode 100644 index 00000000..fab095e0 --- /dev/null +++ b/api-reference/wallets/get-wallet-account.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_wallet_account +--- \ No newline at end of file diff --git a/api-reference/wallets/get-wallet.mdx b/api-reference/wallets/get-wallet.mdx new file mode 100644 index 00000000..4d6125f5 --- /dev/null +++ b/api-reference/wallets/get-wallet.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/get_wallet +--- \ No newline at end of file diff --git a/api-reference/wallets/import-wallet.mdx b/api-reference/wallets/import-wallet.mdx new file mode 100644 index 00000000..14ff050b --- /dev/null +++ b/api-reference/wallets/import-wallet.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/import_wallet +--- \ No newline at end of file diff --git a/api-reference/wallets/init-import-wallet.mdx b/api-reference/wallets/init-import-wallet.mdx new file mode 100644 index 00000000..68a49619 --- /dev/null +++ b/api-reference/wallets/init-import-wallet.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/init_import_wallet +--- \ No newline at end of file diff --git a/api-reference/wallets/list-wallets-accounts.mdx b/api-reference/wallets/list-wallets-accounts.mdx new file mode 100644 index 00000000..38722a0c --- /dev/null +++ b/api-reference/wallets/list-wallets-accounts.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_wallet_accounts +--- \ No newline at end of file diff --git a/api-reference/wallets/list-wallets.mdx b/api-reference/wallets/list-wallets.mdx new file mode 100644 index 00000000..5f709253 --- /dev/null +++ b/api-reference/wallets/list-wallets.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/query/list_wallets +--- \ No newline at end of file diff --git a/api-reference/wallets/overview.mdx b/api-reference/wallets/overview.mdx new file mode 100644 index 00000000..8ec536c7 --- /dev/null +++ b/api-reference/wallets/overview.mdx @@ -0,0 +1,9 @@ +--- +title: "Wallets" +description: "Wallets contain collections of deterministically generated cryptographic public / private key pairs that share a common seed. Turnkey securely holds the common seed, but only you can access it. In most cases, Wallets should be preferred over Private Keys since they can be represented by a mnemonic phrase, used across a variety of cryptographic curves, and can derive many addresses." +sidebarTitle: "Overview" +mode: wide +--- + + +Derived addresses can be used to create digital signatures using the corresponding underlying private key. See [Signing](/api-reference/signing/overview) for more information diff --git a/api-reference/wallets/update-wallet.mdx b/api-reference/wallets/update-wallet.mdx new file mode 100644 index 00000000..1b365629 --- /dev/null +++ b/api-reference/wallets/update-wallet.mdx @@ -0,0 +1,3 @@ +--- +openapi: post /public/v1/submit/update_wallet +--- \ No newline at end of file diff --git a/api/public_api.swagger.json b/api/public_api.swagger.json deleted file mode 100644 index f8c70dcd..00000000 --- a/api/public_api.swagger.json +++ /dev/null @@ -1,8322 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "API Reference", - "description": "Review our [API Introduction](../api-introduction) to get started.", - "version": "1.0", - "contact": {} - }, - "tags": [ - { - "name": "Organizations", - "description": "An Organization is the highest level of hierarchy in Turnkey. It can contain many Users, Private Keys, and Policies managed by a Root Quorum. The Root Quorum consists of a set of Users with a consensus threshold. This consensus threshold must be reached by Quorum members in order for any actions to take place.\n\nSee [Root Quorum](../concepts/users/root-quorum) for more information" - }, - { - "name": "Invitations", - "description": "Invitations allow you to invite Users into your Organization via email. Alternatively, Users can be added directly without an Invitation if their ApiKey or Authenticator credentials are known ahead of time.\n\nSee [Users](./api#tag/Users) for more information" - }, - { - "name": "Policies", - "description": "Policies allow for deep customization of the security of your Organization. They can be used to grant permissions or restrict usage of Users and Private Keys. The Policy Engine analyzes all of your Policies on each request to determine whether an Activity is allowed.\n\nSee [Policy Overview](../managing-policies/overview) for more information" - }, - { - "name": "Wallets", - "description": "Wallets contain collections of deterministically generated cryptographic public / private key pairs that share a common seed. Turnkey securely holds the common seed, but only you can access it. In most cases, Wallets should be preferred over Private Keys since they can be represented by a mnemonic phrase, used across a variety of cryptographic curves, and can derive many addresses.\n\nDerived addresses can be used to create digital signatures using the corresponding underlying private key. See [Signing](./api#tag/Signing) for more information" - }, - { - "name": "Signing", - "description": "Signers allow you to create digital signatures. Signatures are used to validate the authenticity and integrity of a digital message. Turnkey makes it easy to produce signatures by allowing you to sign with an address. If Turnkey doesn't yet support an address format you need, you can generate and sign with the public key instead by using the address format `ADDRESS_FORMAT_COMPRESSED`." - }, - { - "name": "Private Keys", - "description": "Private Keys are cryptographic public / private key pairs that can be used for cryptocurrency needs or more generalized encryption. Turnkey securely holds all private key materials for you, but only you can access them.\n\nThe Private Key ID or any derived address can be used to create digital signatures. See [Signing](./api#tag/Signing) for more information" - }, - { - "name": "Private Key Tags", - "description": "Private Key Tags allow you to easily group and permission Private Keys through Policies." - }, - { - "name": "Users", - "description": "Users are responsible for any action taken within an Organization. They can have ApiKey or Auuthenticator credentials, allowing you to onboard teammates to the Organization, or create API-only Users to run as part of your infrastructure." - }, - { - "name": "User Tags", - "description": "User Key Tags allow you to easily group and permission Users through Policies." - }, - { - "name": "Authenticators", - "description": "Authenticators are WebAuthN hardware devices, such as a Macbook TouchID or Yubikey, that can be used to authenticate requests." - }, - { - "name": "API Keys", - "description": "API Keys are used to authenticate requests\n\nSee our [CLI](https://github.com/tkhq/tkcli) for instructions on generating API Keys" - }, - { - "name": "Activities", - "description": "Activities encapsulate all the possible actions that can be taken with Turnkey. Some examples include adding a new user, creating a private key, and signing a transaction.\n\nActivities that modify your Organization are processed asynchronously. To confirm processing is complete and retrieve the Activity results, these activities must be polled until that status has been updated to a finalized state: `COMPLETED` when the activity is successful or `FAILED` when the activity has failed" - }, - { - "name": "Consensus", - "description": "Policies can enforce consensus requirements for Activities. For example, adding a new user requires two admins to approve the request.\n\nActivities that have been proposed, but don't yet meet the Consesnsus requirements will have the status: `REQUIRES_CONSENSUS`. Activities in this state can be approved or rejected using the unique fingerprint generated when an Activity is created." - } - ], - "host": "api.turnkey.com", - "schemes": ["https"], - "consumes": ["application/json"], - "produces": ["application/json"], - "paths": { - "/public/v1/query/get_activity": { - "post": { - "summary": "Get Activity", - "description": "Get details about an Activity", - "operationId": "GetActivity", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetActivityRequest" - } - } - ], - "tags": ["Activities"] - } - }, - "/public/v1/query/get_api_key": { - "post": { - "summary": "Get API key", - "description": "Get details about an API key", - "operationId": "GetApiKey", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetApiKeyResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetApiKeyRequest" - } - } - ], - "tags": ["API keys"] - } - }, - "/public/v1/query/get_api_keys": { - "post": { - "summary": "Get API key", - "description": "Get details about API keys for a user", - "operationId": "GetApiKeys", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetApiKeysResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetApiKeysRequest" - } - } - ], - "tags": ["API keys"] - } - }, - "/public/v1/query/get_authenticator": { - "post": { - "summary": "Get Authenticator", - "description": "Get details about an authenticator", - "operationId": "GetAuthenticator", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetAuthenticatorResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetAuthenticatorRequest" - } - } - ], - "tags": ["Authenticators"] - } - }, - "/public/v1/query/get_authenticators": { - "post": { - "summary": "Get Authenticators", - "description": "Get details about authenticators for a user", - "operationId": "GetAuthenticators", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetAuthenticatorsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetAuthenticatorsRequest" - } - } - ], - "tags": ["Authenticators"] - } - }, - "/public/v1/query/get_oauth_providers": { - "post": { - "summary": "Get Oauth providers", - "description": "Get details about Oauth providers for a user", - "operationId": "GetOauthProviders", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetOauthProvidersResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetOauthProvidersRequest" - } - } - ], - "tags": ["User Auth"] - } - }, - "/public/v1/query/get_organization_configs": { - "post": { - "summary": "Get Configs", - "description": "Get quorum settings and features for an organization", - "operationId": "GetOrganizationConfigs", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetOrganizationConfigsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetOrganizationConfigsRequest" - } - } - ], - "tags": ["Organizations"] - } - }, - "/public/v1/query/get_policy": { - "post": { - "summary": "Get Policy", - "description": "Get details about a Policy", - "operationId": "GetPolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetPolicyResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetPolicyRequest" - } - } - ], - "tags": ["Policies"] - } - }, - "/public/v1/query/get_private_key": { - "post": { - "summary": "Get Private Key", - "description": "Get details about a Private Key", - "operationId": "GetPrivateKey", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetPrivateKeyResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetPrivateKeyRequest" - } - } - ], - "tags": ["Private Keys"] - } - }, - "/public/v1/query/get_user": { - "post": { - "summary": "Get User", - "description": "Get details about a User", - "operationId": "GetUser", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetUserResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetUserRequest" - } - } - ], - "tags": ["Users"] - } - }, - "/public/v1/query/get_wallet": { - "post": { - "summary": "Get Wallet", - "description": "Get details about a Wallet", - "operationId": "GetWallet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetWalletResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetWalletRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/query/get_wallet_account": { - "post": { - "summary": "Get Wallet Account", - "description": "Get a single wallet account", - "operationId": "GetWalletAccount", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetWalletAccountResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetWalletAccountRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/query/list_activities": { - "post": { - "summary": "List Activities", - "description": "List all Activities within an Organization", - "operationId": "GetActivities", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetActivitiesResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetActivitiesRequest" - } - } - ], - "tags": ["Activities"] - } - }, - "/public/v1/query/list_policies": { - "post": { - "summary": "List Policies", - "description": "List all Policies within an Organization", - "operationId": "GetPolicies", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetPoliciesResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetPoliciesRequest" - } - } - ], - "tags": ["Policies"] - } - }, - "/public/v1/query/list_private_key_tags": { - "post": { - "summary": "List Private Key Tags", - "description": "List all Private Key Tags within an Organization", - "operationId": "ListPrivateKeyTags", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ListPrivateKeyTagsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ListPrivateKeyTagsRequest" - } - } - ], - "tags": ["Private Key Tags"] - } - }, - "/public/v1/query/list_private_keys": { - "post": { - "summary": "List Private Keys", - "description": "List all Private Keys within an Organization", - "operationId": "GetPrivateKeys", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetPrivateKeysResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetPrivateKeysRequest" - } - } - ], - "tags": ["Private Keys"] - } - }, - "/public/v1/query/list_suborgs": { - "post": { - "summary": "Get Suborgs", - "description": "Get all suborg IDs associated given a parent org ID and an optional filter.", - "operationId": "GetSubOrgIds", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetSubOrgIdsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetSubOrgIdsRequest" - } - } - ], - "tags": ["Organizations"] - } - }, - "/public/v1/query/list_user_tags": { - "post": { - "summary": "List User Tags", - "description": "List all User Tags within an Organization", - "operationId": "ListUserTags", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ListUserTagsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ListUserTagsRequest" - } - } - ], - "tags": ["User Tags"] - } - }, - "/public/v1/query/list_users": { - "post": { - "summary": "List Users", - "description": "List all Users within an Organization", - "operationId": "GetUsers", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetUsersResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetUsersRequest" - } - } - ], - "tags": ["Users"] - } - }, - "/public/v1/query/list_verified_suborgs": { - "post": { - "summary": "Get Verified Suborgs", - "description": "Get all email or phone verified suborg IDs associated given a parent org ID.", - "operationId": "GetVerifiedSubOrgIds", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetVerifiedSubOrgIdsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetVerifiedSubOrgIdsRequest" - } - } - ], - "tags": ["Organizations"] - } - }, - "/public/v1/query/list_wallet_accounts": { - "post": { - "summary": "List Wallets Accounts", - "description": "List all Accounts within a Wallet", - "operationId": "GetWalletAccounts", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetWalletAccountsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetWalletAccountsRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/query/list_wallets": { - "post": { - "summary": "List Wallets", - "description": "List all Wallets within an Organization", - "operationId": "GetWallets", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetWalletsResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetWalletsRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/query/whoami": { - "post": { - "summary": "Who am I?", - "description": "Get basic information about your current API or WebAuthN user and their organization. Affords Sub-Organization look ups via Parent Organization for WebAuthN or API key users.", - "operationId": "GetWhoami", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/GetWhoamiResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/GetWhoamiRequest" - } - } - ], - "tags": ["Sessions"] - } - }, - "/public/v1/submit/approve_activity": { - "post": { - "summary": "Approve Activity", - "description": "Approve an Activity", - "operationId": "ApproveActivity", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ApproveActivityRequest" - } - } - ], - "tags": ["Consensus"] - } - }, - "/public/v1/submit/create_api_keys": { - "post": { - "summary": "Create API Keys", - "description": "Add api keys to an existing User", - "operationId": "CreateApiKeys", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateApiKeysRequest" - } - } - ], - "tags": ["API Keys"] - } - }, - "/public/v1/submit/create_authenticators": { - "post": { - "summary": "Create Authenticators", - "description": "Create Authenticators to authenticate requests to Turnkey", - "operationId": "CreateAuthenticators", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateAuthenticatorsRequest" - } - } - ], - "tags": ["Authenticators"] - } - }, - "/public/v1/submit/create_invitations": { - "post": { - "summary": "Create Invitations", - "description": "Create Invitations to join an existing Organization", - "operationId": "CreateInvitations", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateInvitationsRequest" - } - } - ], - "tags": ["Invitations"] - } - }, - "/public/v1/submit/create_oauth_providers": { - "post": { - "summary": "Create Oauth Providers", - "description": "Creates Oauth providers for a specified user - BETA", - "operationId": "CreateOauthProviders", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateOauthProvidersRequest" - } - } - ], - "tags": ["User Auth"] - } - }, - "/public/v1/submit/create_policies": { - "post": { - "summary": "Create Policies", - "description": "Create new Policies", - "operationId": "CreatePolicies", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreatePoliciesRequest" - } - } - ], - "tags": ["Policies"] - } - }, - "/public/v1/submit/create_policy": { - "post": { - "summary": "Create Policy", - "description": "Create a new Policy", - "operationId": "CreatePolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreatePolicyRequest" - } - } - ], - "tags": ["Policies"] - } - }, - "/public/v1/submit/create_private_key_tag": { - "post": { - "summary": "Create Private Key Tag", - "description": "Create a private key tag and add it to private keys.", - "operationId": "CreatePrivateKeyTag", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreatePrivateKeyTagRequest" - } - } - ], - "tags": ["Private Key Tags"] - } - }, - "/public/v1/submit/create_private_keys": { - "post": { - "summary": "Create Private Keys", - "description": "Create new Private Keys", - "operationId": "CreatePrivateKeys", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreatePrivateKeysRequest" - } - } - ], - "tags": ["Private Keys"] - } - }, - "/public/v1/submit/create_read_only_session": { - "post": { - "summary": "Create Read Only Session", - "description": "Create a read only session for a user (valid for 1 hour)", - "operationId": "CreateReadOnlySession", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateReadOnlySessionRequest" - } - } - ], - "tags": ["Sessions"] - } - }, - "/public/v1/submit/create_read_write_session": { - "post": { - "summary": "Create Read Write Session", - "description": "Create a read write session for a user", - "operationId": "CreateReadWriteSession", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateReadWriteSessionRequest" - } - } - ], - "tags": ["Sessions"] - } - }, - "/public/v1/submit/create_sub_organization": { - "post": { - "summary": "Create Sub-Organization", - "description": "Create a new Sub-Organization", - "operationId": "CreateSubOrganization", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateSubOrganizationRequest" - } - } - ], - "tags": ["Organizations"] - } - }, - "/public/v1/submit/create_user_tag": { - "post": { - "summary": "Create User Tag", - "description": "Create a user tag and add it to users.", - "operationId": "CreateUserTag", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateUserTagRequest" - } - } - ], - "tags": ["User Tags"] - } - }, - "/public/v1/submit/create_users": { - "post": { - "summary": "Create Users", - "description": "Create Users in an existing Organization", - "operationId": "CreateUsers", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateUsersRequest" - } - } - ], - "tags": ["Users"] - } - }, - "/public/v1/submit/create_wallet": { - "post": { - "summary": "Create Wallet", - "description": "Create a Wallet and derive addresses", - "operationId": "CreateWallet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateWalletRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/submit/create_wallet_accounts": { - "post": { - "summary": "Create Wallet Accounts", - "description": "Derive additional addresses using an existing wallet", - "operationId": "CreateWalletAccounts", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/CreateWalletAccountsRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/submit/delete_api_keys": { - "post": { - "summary": "Delete API Keys", - "description": "Remove api keys from a User", - "operationId": "DeleteApiKeys", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteApiKeysRequest" - } - } - ], - "tags": ["API Keys"] - } - }, - "/public/v1/submit/delete_authenticators": { - "post": { - "summary": "Delete Authenticators", - "description": "Remove authenticators from a User", - "operationId": "DeleteAuthenticators", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteAuthenticatorsRequest" - } - } - ], - "tags": ["Authenticators"] - } - }, - "/public/v1/submit/delete_invitation": { - "post": { - "summary": "Delete Invitation", - "description": "Delete an existing Invitation", - "operationId": "DeleteInvitation", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteInvitationRequest" - } - } - ], - "tags": ["Invitations"] - } - }, - "/public/v1/submit/delete_oauth_providers": { - "post": { - "summary": "Delete Oauth Providers", - "description": "Removes Oauth providers for a specified user - BETA", - "operationId": "DeleteOauthProviders", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteOauthProvidersRequest" - } - } - ], - "tags": ["User Auth"] - } - }, - "/public/v1/submit/delete_policy": { - "post": { - "summary": "Delete Policy", - "description": "Delete an existing Policy", - "operationId": "DeletePolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeletePolicyRequest" - } - } - ], - "tags": ["Policies"] - } - }, - "/public/v1/submit/delete_private_key_tags": { - "post": { - "summary": "Delete Private Key Tags", - "description": "Delete Private Key Tags within an Organization", - "operationId": "DeletePrivateKeyTags", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeletePrivateKeyTagsRequest" - } - } - ], - "tags": ["Private Key Tags"] - } - }, - "/public/v1/submit/delete_private_keys": { - "post": { - "summary": "Delete Private Keys", - "description": "Deletes private keys for an organization", - "operationId": "DeletePrivateKeys", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeletePrivateKeysRequest" - } - } - ], - "tags": ["Private Keys"] - } - }, - "/public/v1/submit/delete_sub_organization": { - "post": { - "summary": "Delete Sub Organization", - "description": "Deletes a sub organization", - "operationId": "DeleteSubOrganization", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteSubOrganizationRequest" - } - } - ], - "tags": ["Organizations"] - } - }, - "/public/v1/submit/delete_user_tags": { - "post": { - "summary": "Delete User Tags", - "description": "Delete User Tags within an Organization", - "operationId": "DeleteUserTags", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteUserTagsRequest" - } - } - ], - "tags": ["User Tags"] - } - }, - "/public/v1/submit/delete_users": { - "post": { - "summary": "Delete Users", - "description": "Delete Users within an Organization", - "operationId": "DeleteUsers", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteUsersRequest" - } - } - ], - "tags": ["Users"] - } - }, - "/public/v1/submit/delete_wallets": { - "post": { - "summary": "Delete Wallets", - "description": "Deletes wallets for an organization", - "operationId": "DeleteWallets", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/DeleteWalletsRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/submit/email_auth": { - "post": { - "summary": "Perform Email Auth", - "description": "Authenticate a user via Email", - "operationId": "EmailAuth", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/EmailAuthRequest" - } - } - ], - "tags": ["User Auth"] - } - }, - "/public/v1/submit/export_private_key": { - "post": { - "summary": "Export Private Key", - "description": "Exports a Private Key", - "operationId": "ExportPrivateKey", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ExportPrivateKeyRequest" - } - } - ], - "tags": ["Private Keys"] - } - }, - "/public/v1/submit/export_wallet": { - "post": { - "summary": "Export Wallet", - "description": "Exports a Wallet", - "operationId": "ExportWallet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ExportWalletRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/submit/export_wallet_account": { - "post": { - "summary": "Export Wallet Account", - "description": "Exports a Wallet Account", - "operationId": "ExportWalletAccount", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ExportWalletAccountRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/submit/import_private_key": { - "post": { - "summary": "Import Private Key", - "description": "Imports a private key", - "operationId": "ImportPrivateKey", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ImportPrivateKeyRequest" - } - } - ], - "tags": ["Private Keys"] - } - }, - "/public/v1/submit/import_wallet": { - "post": { - "summary": "Import Wallet", - "description": "Imports a wallet", - "operationId": "ImportWallet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/ImportWalletRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/submit/init_import_private_key": { - "post": { - "summary": "Init Import Private Key", - "description": "Initializes a new private key import", - "operationId": "InitImportPrivateKey", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/InitImportPrivateKeyRequest" - } - } - ], - "tags": ["Private Keys"] - } - }, - "/public/v1/submit/init_import_wallet": { - "post": { - "summary": "Init Import Wallet", - "description": "Initializes a new wallet import", - "operationId": "InitImportWallet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/InitImportWalletRequest" - } - } - ], - "tags": ["Wallets"] - } - }, - "/public/v1/submit/init_otp_auth": { - "post": { - "summary": "Init OTP auth", - "description": "Initiate an OTP auth activity", - "operationId": "InitOtpAuth", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/InitOtpAuthRequest" - } - } - ], - "tags": ["User Auth"] - } - }, - "/public/v1/submit/init_user_email_recovery": { - "post": { - "summary": "Init Email Recovery", - "description": "Initializes a new email recovery", - "operationId": "InitUserEmailRecovery", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/InitUserEmailRecoveryRequest" - } - } - ], - "tags": ["User Recovery"] - } - }, - "/public/v1/submit/oauth": { - "post": { - "summary": "Oauth", - "description": "Authenticate a user with an Oidc token (Oauth) - BETA", - "operationId": "Oauth", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/OauthRequest" - } - } - ], - "tags": ["User Auth"] - } - }, - "/public/v1/submit/otp_auth": { - "post": { - "summary": "OTP auth", - "description": "Authenticate a user with an OTP code sent via email or SMS", - "operationId": "OtpAuth", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/OtpAuthRequest" - } - } - ], - "tags": ["User Auth"] - } - }, - "/public/v1/submit/recover_user": { - "post": { - "summary": "Recover a user", - "description": "Completes the process of recovering a user by adding an authenticator", - "operationId": "RecoverUser", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/RecoverUserRequest" - } - } - ], - "tags": ["User Recovery"] - } - }, - "/public/v1/submit/reject_activity": { - "post": { - "summary": "Reject Activity", - "description": "Reject an Activity", - "operationId": "RejectActivity", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/RejectActivityRequest" - } - } - ], - "tags": ["Consensus"] - } - }, - "/public/v1/submit/remove_organization_feature": { - "post": { - "summary": "Remove Organization Feature", - "description": "Removes an organization feature. This activity must be approved by the current root quorum.", - "operationId": "RemoveOrganizationFeature", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/RemoveOrganizationFeatureRequest" - } - } - ], - "tags": ["Features"] - } - }, - "/public/v1/submit/set_organization_feature": { - "post": { - "summary": "Set Organization Feature", - "description": "Sets an organization feature. This activity must be approved by the current root quorum.", - "operationId": "SetOrganizationFeature", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/SetOrganizationFeatureRequest" - } - } - ], - "tags": ["Features"] - } - }, - "/public/v1/submit/sign_raw_payload": { - "post": { - "summary": "Sign Raw Payload", - "description": "Sign a raw payload", - "operationId": "SignRawPayload", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/SignRawPayloadRequest" - } - } - ], - "tags": ["Signing"] - } - }, - "/public/v1/submit/sign_raw_payloads": { - "post": { - "summary": "Sign Raw Payloads", - "description": "Sign multiple raw payloads with the same signing parameters", - "operationId": "SignRawPayloads", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/SignRawPayloadsRequest" - } - } - ], - "tags": ["Signing"] - } - }, - "/public/v1/submit/sign_transaction": { - "post": { - "summary": "Sign Transaction", - "description": "Sign a transaction", - "operationId": "SignTransaction", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/SignTransactionRequest" - } - } - ], - "tags": ["Signing"] - } - }, - "/public/v1/submit/update_policy": { - "post": { - "summary": "Update Policy", - "description": "Update an existing Policy", - "operationId": "UpdatePolicy", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdatePolicyRequest" - } - } - ], - "tags": ["Policies"] - } - }, - "/public/v1/submit/update_private_key_tag": { - "post": { - "summary": "Update Private Key Tag", - "description": "Update human-readable name or associated private keys. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail.", - "operationId": "UpdatePrivateKeyTag", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdatePrivateKeyTagRequest" - } - } - ], - "tags": ["Private Key Tags"] - } - }, - "/public/v1/submit/update_root_quorum": { - "post": { - "summary": "Update Root Quorum", - "description": "Set the threshold and members of the root quorum. This activity must be approved by the current root quorum.", - "operationId": "UpdateRootQuorum", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateRootQuorumRequest" - } - } - ], - "tags": ["Organizations"] - } - }, - "/public/v1/submit/update_user": { - "post": { - "summary": "Update User", - "description": "Update a User in an existing Organization", - "operationId": "UpdateUser", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateUserRequest" - } - } - ], - "tags": ["Users"] - } - }, - "/public/v1/submit/update_user_tag": { - "post": { - "summary": "Update User Tag", - "description": "Update human-readable name or associated users. Note that this activity is atomic: all of the updates will succeed at once, or all of them will fail.", - "operationId": "UpdateUserTag", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateUserTagRequest" - } - } - ], - "tags": ["User Tags"] - } - }, - "/public/v1/submit/update_wallet": { - "post": { - "summary": "Update Wallet", - "description": "Update a wallet for an organization", - "operationId": "UpdateWallet", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/ActivityResponse" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/UpdateWalletRequest" - } - } - ], - "tags": ["Wallets"] - } - } - }, - "definitions": { - "AcceptInvitationIntent": { - "type": "object", - "properties": { - "invitationId": { - "type": "string", - "description": "Unique identifier for a given Invitation object." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "authenticator": { - "$ref": "#/definitions/AuthenticatorParams", - "description": "WebAuthN hardware devices that can be used to log in to the Turnkey web app." - } - }, - "required": ["invitationId", "userId", "authenticator"] - }, - "AcceptInvitationIntentV2": { - "type": "object", - "properties": { - "invitationId": { - "type": "string", - "description": "Unique identifier for a given Invitation object." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "authenticator": { - "$ref": "#/definitions/AuthenticatorParamsV2", - "description": "WebAuthN hardware devices that can be used to log in to the Turnkey web app." - } - }, - "required": ["invitationId", "userId", "authenticator"] - }, - "AcceptInvitationResult": { - "type": "object", - "properties": { - "invitationId": { - "type": "string", - "description": "Unique identifier for a given Invitation." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["invitationId", "userId"] - }, - "AccessType": { - "type": "string", - "enum": ["ACCESS_TYPE_WEB", "ACCESS_TYPE_API", "ACCESS_TYPE_ALL"] - }, - "ActivateBillingTierIntent": { - "type": "object", - "properties": { - "productId": { - "type": "string", - "description": "The product that the customer wants to subscribe to." - } - }, - "required": ["productId"] - }, - "ActivateBillingTierResult": { - "type": "object", - "properties": { - "productId": { - "type": "string", - "description": "The id of the product being subscribed to." - } - }, - "required": ["productId"] - }, - "Activity": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique identifier for a given Activity object." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "status": { - "$ref": "#/definitions/ActivityStatus", - "description": "The current processing status of a specified Activity." - }, - "type": { - "$ref": "#/definitions/ActivityType", - "description": "Type of Activity, such as Add User, or Sign Transaction." - }, - "intent": { - "$ref": "#/definitions/Intent", - "description": "Intent object crafted by Turnkey based on the user request, used to assess the permissibility of an action." - }, - "result": { - "$ref": "#/definitions/Result", - "description": "Result of the intended action." - }, - "votes": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Vote" - }, - "description": "A list of objects representing a particular User's approval or rejection of a Consensus request, including all relevant metadata." - }, - "fingerprint": { - "type": "string", - "description": "An artifact verifying a User's action." - }, - "canApprove": { - "type": "boolean" - }, - "canReject": { - "type": "boolean" - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "failure": { - "$ref": "#/definitions/Status", - "description": "Failure reason of the intended action." - } - }, - "required": [ - "id", - "organizationId", - "status", - "type", - "intent", - "result", - "votes", - "fingerprint", - "canApprove", - "canReject", - "createdAt", - "updatedAt" - ] - }, - "ActivityResponse": { - "type": "object", - "properties": { - "activity": { - "$ref": "#/definitions/Activity", - "description": "An action that can that can be taken within the Turnkey infrastructure." - } - }, - "required": ["activity"] - }, - "ActivityStatus": { - "type": "string", - "enum": [ - "ACTIVITY_STATUS_CREATED", - "ACTIVITY_STATUS_PENDING", - "ACTIVITY_STATUS_COMPLETED", - "ACTIVITY_STATUS_FAILED", - "ACTIVITY_STATUS_CONSENSUS_NEEDED", - "ACTIVITY_STATUS_REJECTED" - ] - }, - "ActivityType": { - "type": "string", - "enum": [ - "ACTIVITY_TYPE_CREATE_API_KEYS", - "ACTIVITY_TYPE_CREATE_USERS", - "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS", - "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD", - "ACTIVITY_TYPE_CREATE_INVITATIONS", - "ACTIVITY_TYPE_ACCEPT_INVITATION", - "ACTIVITY_TYPE_CREATE_POLICY", - "ACTIVITY_TYPE_DISABLE_PRIVATE_KEY", - "ACTIVITY_TYPE_DELETE_USERS", - "ACTIVITY_TYPE_DELETE_API_KEYS", - "ACTIVITY_TYPE_DELETE_INVITATION", - "ACTIVITY_TYPE_DELETE_ORGANIZATION", - "ACTIVITY_TYPE_DELETE_POLICY", - "ACTIVITY_TYPE_CREATE_USER_TAG", - "ACTIVITY_TYPE_DELETE_USER_TAGS", - "ACTIVITY_TYPE_CREATE_ORGANIZATION", - "ACTIVITY_TYPE_SIGN_TRANSACTION", - "ACTIVITY_TYPE_APPROVE_ACTIVITY", - "ACTIVITY_TYPE_REJECT_ACTIVITY", - "ACTIVITY_TYPE_DELETE_AUTHENTICATORS", - "ACTIVITY_TYPE_CREATE_AUTHENTICATORS", - "ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG", - "ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS", - "ACTIVITY_TYPE_SET_PAYMENT_METHOD", - "ACTIVITY_TYPE_ACTIVATE_BILLING_TIER", - "ACTIVITY_TYPE_DELETE_PAYMENT_METHOD", - "ACTIVITY_TYPE_CREATE_POLICY_V2", - "ACTIVITY_TYPE_CREATE_POLICY_V3", - "ACTIVITY_TYPE_CREATE_API_ONLY_USERS", - "ACTIVITY_TYPE_UPDATE_ROOT_QUORUM", - "ACTIVITY_TYPE_UPDATE_USER_TAG", - "ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG", - "ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2", - "ACTIVITY_TYPE_CREATE_ORGANIZATION_V2", - "ACTIVITY_TYPE_CREATE_USERS_V2", - "ACTIVITY_TYPE_ACCEPT_INVITATION_V2", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V2", - "ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS", - "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", - "ACTIVITY_TYPE_UPDATE_USER", - "ACTIVITY_TYPE_UPDATE_POLICY", - "ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V3", - "ACTIVITY_TYPE_CREATE_WALLET", - "ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS", - "ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY", - "ACTIVITY_TYPE_RECOVER_USER", - "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", - "ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE", - "ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2", - "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", - "ACTIVITY_TYPE_EXPORT_PRIVATE_KEY", - "ACTIVITY_TYPE_EXPORT_WALLET", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V4", - "ACTIVITY_TYPE_EMAIL_AUTH", - "ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT", - "ACTIVITY_TYPE_INIT_IMPORT_WALLET", - "ACTIVITY_TYPE_IMPORT_WALLET", - "ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY", - "ACTIVITY_TYPE_IMPORT_PRIVATE_KEY", - "ACTIVITY_TYPE_CREATE_POLICIES", - "ACTIVITY_TYPE_SIGN_RAW_PAYLOADS", - "ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION", - "ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS", - "ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V5", - "ACTIVITY_TYPE_OAUTH", - "ACTIVITY_TYPE_CREATE_API_KEYS_V2", - "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION", - "ACTIVITY_TYPE_EMAIL_AUTH_V2", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V6", - "ACTIVITY_TYPE_DELETE_PRIVATE_KEYS", - "ACTIVITY_TYPE_DELETE_WALLETS", - "ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2", - "ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION", - "ACTIVITY_TYPE_INIT_OTP_AUTH", - "ACTIVITY_TYPE_OTP_AUTH", - "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", - "ACTIVITY_TYPE_UPDATE_WALLET" - ] - }, - "AddressFormat": { - "type": "string", - "enum": [ - "ADDRESS_FORMAT_UNCOMPRESSED", - "ADDRESS_FORMAT_COMPRESSED", - "ADDRESS_FORMAT_ETHEREUM", - "ADDRESS_FORMAT_SOLANA", - "ADDRESS_FORMAT_COSMOS", - "ADDRESS_FORMAT_TRON", - "ADDRESS_FORMAT_SUI", - "ADDRESS_FORMAT_APTOS", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH", - "ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH", - "ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH", - "ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH", - "ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR", - "ADDRESS_FORMAT_SEI", - "ADDRESS_FORMAT_XLM", - "ADDRESS_FORMAT_DOGE_MAINNET", - "ADDRESS_FORMAT_DOGE_TESTNET", - "ADDRESS_FORMAT_TON_V3R2", - "ADDRESS_FORMAT_TON_V4R2", - "ADDRESS_FORMAT_XRP" - ] - }, - "Any": { - "type": "object", - "properties": { - "@type": { - "type": "string" - } - }, - "additionalProperties": {} - }, - "ApiKey": { - "type": "object", - "properties": { - "credential": { - "$ref": "#/definitions/external.data.v1.Credential", - "description": "A User credential that can be used to authenticate to Turnkey." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for a given API Key." - }, - "apiKeyName": { - "type": "string", - "description": "Human-readable name for an API Key." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "expirationSeconds": { - "type": "string", - "format": "uint64", - "description": "Optional window (in seconds) indicating how long the API Key should last." - } - }, - "required": [ - "credential", - "apiKeyId", - "apiKeyName", - "createdAt", - "updatedAt" - ] - }, - "ApiKeyCurve": { - "type": "string", - "enum": [ - "API_KEY_CURVE_P256", - "API_KEY_CURVE_SECP256K1", - "API_KEY_CURVE_ED25519" - ] - }, - "ApiKeyParams": { - "type": "object", - "properties": { - "apiKeyName": { - "type": "string", - "description": "Human-readable name for an API Key." - }, - "publicKey": { - "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." - }, - "expirationSeconds": { - "type": "string", - "description": "Optional window (in seconds) indicating how long the API Key should last." - } - }, - "required": ["apiKeyName", "publicKey"] - }, - "ApiKeyParamsV2": { - "type": "object", - "properties": { - "apiKeyName": { - "type": "string", - "description": "Human-readable name for an API Key." - }, - "publicKey": { - "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." - }, - "curveType": { - "$ref": "#/definitions/ApiKeyCurve", - "description": "The curve type to be used for processing API key signatures." - }, - "expirationSeconds": { - "type": "string", - "description": "Optional window (in seconds) indicating how long the API Key should last." - } - }, - "required": ["apiKeyName", "publicKey", "curveType"] - }, - "ApiOnlyUserParams": { - "type": "object", - "properties": { - "userName": { - "type": "string", - "description": "The name of the new API-only User." - }, - "userEmail": { - "type": "string", - "description": "The email address for this API-only User (optional)." - }, - "userTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of tags assigned to the new API-only User. This field, if not needed, should be an empty array in your request body." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParams" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - } - }, - "required": ["userName", "userTags", "apiKeys"] - }, - "ApproveActivityIntent": { - "type": "object", - "properties": { - "fingerprint": { - "type": "string", - "description": "An artifact verifying a User's action." - } - }, - "required": ["fingerprint"] - }, - "ApproveActivityRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_APPROVE_ACTIVITY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/ApproveActivityIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "Attestation": { - "type": "object", - "properties": { - "credentialId": { - "type": "string", - "description": "The cbor encoded then base64 url encoded id of the credential." - }, - "clientDataJson": { - "type": "string", - "description": "A base64 url encoded payload containing metadata about the signing context and the challenge." - }, - "attestationObject": { - "type": "string", - "description": "A base64 url encoded payload containing authenticator data and any attestation the webauthn provider chooses." - }, - "transports": { - "type": "array", - "items": { - "$ref": "#/definitions/AuthenticatorTransport" - }, - "description": "The type of authenticator transports." - } - }, - "required": [ - "credentialId", - "clientDataJson", - "attestationObject", - "transports" - ] - }, - "Authenticator": { - "type": "object", - "properties": { - "transports": { - "type": "array", - "items": { - "$ref": "#/definitions/AuthenticatorTransport" - }, - "description": "Types of transports that may be used by an Authenticator (e.g., USB, NFC, BLE)." - }, - "attestationType": { - "type": "string" - }, - "aaguid": { - "type": "string", - "description": "Identifier indicating the type of the Security Key." - }, - "credentialId": { - "type": "string", - "description": "Unique identifier for a WebAuthn credential." - }, - "model": { - "type": "string", - "description": "The type of Authenticator device." - }, - "credential": { - "$ref": "#/definitions/external.data.v1.Credential", - "description": "A User credential that can be used to authenticate to Turnkey." - }, - "authenticatorId": { - "type": "string", - "description": "Unique identifier for a given Authenticator." - }, - "authenticatorName": { - "type": "string", - "description": "Human-readable name for an Authenticator." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - } - }, - "required": [ - "transports", - "attestationType", - "aaguid", - "credentialId", - "model", - "credential", - "authenticatorId", - "authenticatorName", - "createdAt", - "updatedAt" - ] - }, - "AuthenticatorAttestationResponse": { - "type": "object", - "properties": { - "clientDataJson": { - "type": "string" - }, - "attestationObject": { - "type": "string" - }, - "transports": { - "type": "array", - "items": { - "$ref": "#/definitions/AuthenticatorTransport" - } - }, - "authenticatorAttachment": { - "type": "string", - "enum": ["cross-platform", "platform"], - "x-nullable": true - } - }, - "required": ["clientDataJson", "attestationObject"] - }, - "AuthenticatorParams": { - "type": "object", - "properties": { - "authenticatorName": { - "type": "string", - "description": "Human-readable name for an Authenticator." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "attestation": { - "$ref": "#/definitions/PublicKeyCredentialWithAttestation" - }, - "challenge": { - "type": "string", - "description": "Challenge presented for authentication purposes." - } - }, - "required": ["authenticatorName", "userId", "attestation", "challenge"] - }, - "AuthenticatorParamsV2": { - "type": "object", - "properties": { - "authenticatorName": { - "type": "string", - "description": "Human-readable name for an Authenticator." - }, - "challenge": { - "type": "string", - "description": "Challenge presented for authentication purposes." - }, - "attestation": { - "$ref": "#/definitions/Attestation", - "description": "The attestation that proves custody of the authenticator and provides metadata about it." - } - }, - "required": ["authenticatorName", "challenge", "attestation"] - }, - "AuthenticatorTransport": { - "type": "string", - "enum": [ - "AUTHENTICATOR_TRANSPORT_BLE", - "AUTHENTICATOR_TRANSPORT_INTERNAL", - "AUTHENTICATOR_TRANSPORT_NFC", - "AUTHENTICATOR_TRANSPORT_USB", - "AUTHENTICATOR_TRANSPORT_HYBRID" - ] - }, - "Config": { - "type": "object", - "properties": { - "features": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Feature" - } - }, - "quorum": { - "$ref": "#/definitions/external.data.v1.Quorum" - } - } - }, - "CreateApiKeysIntent": { - "type": "object", - "properties": { - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParams" - }, - "description": "A list of API Keys." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["apiKeys", "userId"] - }, - "CreateApiKeysIntentV2": { - "type": "object", - "properties": { - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParamsV2" - }, - "description": "A list of API Keys." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["apiKeys", "userId"] - }, - "CreateApiKeysRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_API_KEYS_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateApiKeysIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateApiKeysResult": { - "type": "object", - "properties": { - "apiKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of API Key IDs." - } - }, - "required": ["apiKeyIds"] - }, - "CreateApiOnlyUsersIntent": { - "type": "object", - "properties": { - "apiOnlyUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiOnlyUserParams" - }, - "description": "A list of API-only Users to create." - } - }, - "required": ["apiOnlyUsers"] - }, - "CreateApiOnlyUsersResult": { - "type": "object", - "properties": { - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of API-only User IDs." - } - }, - "required": ["userIds"] - }, - "CreateAuthenticatorsIntent": { - "type": "object", - "properties": { - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParams" - }, - "description": "A list of Authenticators." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["authenticators", "userId"] - }, - "CreateAuthenticatorsIntentV2": { - "type": "object", - "properties": { - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParamsV2" - }, - "description": "A list of Authenticators." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["authenticators", "userId"] - }, - "CreateAuthenticatorsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateAuthenticatorsIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateAuthenticatorsResult": { - "type": "object", - "properties": { - "authenticatorIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Authenticator IDs." - } - }, - "required": ["authenticatorIds"] - }, - "CreateInvitationsIntent": { - "type": "object", - "properties": { - "invitations": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/InvitationParams" - }, - "description": "A list of Invitations." - } - }, - "required": ["invitations"] - }, - "CreateInvitationsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_INVITATIONS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateInvitationsIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateInvitationsResult": { - "type": "object", - "properties": { - "invitationIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Invitation IDs" - } - }, - "required": ["invitationIds"] - }, - "CreateOauthProvidersIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "The ID of the User to add an Oauth provider to" - }, - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/OauthProviderParams" - }, - "description": "A list of Oauth providers." - } - }, - "required": ["userId", "oauthProviders"] - }, - "CreateOauthProvidersRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateOauthProvidersIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateOauthProvidersResult": { - "type": "object", - "properties": { - "providerIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of unique identifiers for Oauth Providers" - } - }, - "required": ["providerIds"] - }, - "CreateOrganizationIntent": { - "type": "object", - "properties": { - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "rootEmail": { - "type": "string", - "description": "The root user's email address." - }, - "rootAuthenticator": { - "$ref": "#/definitions/AuthenticatorParams", - "description": "The root user's Authenticator." - }, - "rootUserId": { - "type": "string", - "description": "Unique identifier for the root user object." - } - }, - "required": ["organizationName", "rootEmail", "rootAuthenticator"] - }, - "CreateOrganizationIntentV2": { - "type": "object", - "properties": { - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "rootEmail": { - "type": "string", - "description": "The root user's email address." - }, - "rootAuthenticator": { - "$ref": "#/definitions/AuthenticatorParamsV2", - "description": "The root user's Authenticator." - }, - "rootUserId": { - "type": "string", - "description": "Unique identifier for the root user object." - } - }, - "required": ["organizationName", "rootEmail", "rootAuthenticator"] - }, - "CreateOrganizationResult": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "CreatePoliciesIntent": { - "type": "object", - "properties": { - "policies": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/CreatePolicyIntentV3" - }, - "description": "An array of policy intents to be created." - } - }, - "required": ["policies"] - }, - "CreatePoliciesRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_POLICIES"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreatePoliciesIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreatePoliciesResult": { - "type": "object", - "properties": { - "policyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of unique identifiers for the created policies." - } - }, - "required": ["policyIds"] - }, - "CreatePolicyIntent": { - "type": "object", - "properties": { - "policyName": { - "type": "string", - "description": "Human-readable name for a Policy." - }, - "selectors": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Selector" - }, - "description": "A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details." - }, - "effect": { - "$ref": "#/definitions/Effect", - "description": "The instruction to DENY or ALLOW a particular activity following policy selector(s)." - }, - "notes": { - "type": "string" - } - }, - "required": ["policyName", "selectors", "effect"] - }, - "CreatePolicyIntentV2": { - "type": "object", - "properties": { - "policyName": { - "type": "string", - "description": "Human-readable name for a Policy." - }, - "selectors": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/SelectorV2" - }, - "description": "A list of simple functions each including a subject, target and boolean. See Policy Engine Language section for additional details." - }, - "effect": { - "$ref": "#/definitions/Effect", - "description": "Whether to ALLOW or DENY requests that match the condition and consensus requirements." - }, - "notes": { - "type": "string" - } - }, - "required": ["policyName", "selectors", "effect"] - }, - "CreatePolicyIntentV3": { - "type": "object", - "properties": { - "policyName": { - "type": "string", - "description": "Human-readable name for a Policy." - }, - "effect": { - "$ref": "#/definitions/Effect", - "description": "The instruction to DENY or ALLOW an activity." - }, - "condition": { - "type": "string", - "description": "The condition expression that triggers the Effect" - }, - "consensus": { - "type": "string", - "description": "The consensus expression that triggers the Effect" - }, - "notes": { - "type": "string" - } - }, - "required": ["policyName", "effect"] - }, - "CreatePolicyRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_POLICY_V3"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreatePolicyIntentV3" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreatePolicyResult": { - "type": "object", - "properties": { - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - } - }, - "required": ["policyId"] - }, - "CreatePrivateKeyTagIntent": { - "type": "object", - "properties": { - "privateKeyTagName": { - "type": "string", - "description": "Human-readable name for a Private Key Tag." - }, - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." - } - }, - "required": ["privateKeyTagName", "privateKeyIds"] - }, - "CreatePrivateKeyTagRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreatePrivateKeyTagIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreatePrivateKeyTagResult": { - "type": "object", - "properties": { - "privateKeyTagId": { - "type": "string", - "description": "Unique identifier for a given Private Key Tag." - }, - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." - } - }, - "required": ["privateKeyTagId", "privateKeyIds"] - }, - "CreatePrivateKeysIntent": { - "type": "object", - "properties": { - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/PrivateKeyParams" - }, - "description": "A list of Private Keys." - } - }, - "required": ["privateKeys"] - }, - "CreatePrivateKeysIntentV2": { - "type": "object", - "properties": { - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/PrivateKeyParams" - }, - "description": "A list of Private Keys." - } - }, - "required": ["privateKeys"] - }, - "CreatePrivateKeysRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreatePrivateKeysIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreatePrivateKeysResult": { - "type": "object", - "properties": { - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." - } - }, - "required": ["privateKeyIds"] - }, - "CreatePrivateKeysResultV2": { - "type": "object", - "properties": { - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/PrivateKeyResult" - }, - "description": "A list of Private Key IDs and addresses." - } - }, - "required": ["privateKeys"] - }, - "CreateReadOnlySessionIntent": { - "type": "object" - }, - "CreateReadOnlySessionRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_READ_ONLY_SESSION"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateReadOnlySessionIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateReadOnlySessionResult": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." - }, - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "username": { - "type": "string", - "description": "Human-readable name for a User." - }, - "session": { - "type": "string", - "description": "String representing a read only session" - }, - "sessionExpiry": { - "type": "string", - "format": "uint64", - "description": "UTC timestamp in seconds representing the expiry time for the read only session." - } - }, - "required": [ - "organizationId", - "organizationName", - "userId", - "username", - "session", - "sessionExpiry" - ] - }, - "CreateReadWriteSessionIntent": { - "type": "object", - "properties": { - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." - }, - "email": { - "type": "string", - "description": "Email of the user to create a read write session for" - }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Read Write Session - \u003cTimestamp\u003e" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid. If not provided, a default of 15 minutes will be used." - } - }, - "required": ["targetPublicKey", "email"] - }, - "CreateReadWriteSessionIntentV2": { - "type": "object", - "properties": { - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the read write session bundle (credentials) will be encrypted." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Read Write Session - \u003cTimestamp\u003e" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid. If not provided, a default of 15 minutes will be used." - } - }, - "required": ["targetPublicKey"] - }, - "CreateReadWriteSessionRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateReadWriteSessionIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateReadWriteSessionResult": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." - }, - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "username": { - "type": "string", - "description": "Human-readable name for a User." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - }, - "credentialBundle": { - "type": "string", - "description": "HPKE encrypted credential bundle" - } - }, - "required": [ - "organizationId", - "organizationName", - "userId", - "username", - "apiKeyId", - "credentialBundle" - ] - }, - "CreateReadWriteSessionResultV2": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization. If the request is being made by a user and their Sub-Organization ID is unknown, this can be the Parent Organization ID. However, using the Sub-Organization ID is preferred due to performance reasons." - }, - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "username": { - "type": "string", - "description": "Human-readable name for a User." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - }, - "credentialBundle": { - "type": "string", - "description": "HPKE encrypted credential bundle" - } - }, - "required": [ - "organizationId", - "organizationName", - "userId", - "username", - "apiKeyId", - "credentialBundle" - ] - }, - "CreateSubOrganizationIntent": { - "type": "object", - "properties": { - "name": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootAuthenticator": { - "$ref": "#/definitions/AuthenticatorParamsV2", - "description": "Root User authenticator for this new sub-organization" - } - }, - "required": ["name", "rootAuthenticator"] - }, - "CreateSubOrganizationIntentV2": { - "type": "object", - "properties": { - "subOrganizationName": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/RootUserParams" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - } - }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] - }, - "CreateSubOrganizationIntentV3": { - "type": "object", - "properties": { - "subOrganizationName": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/RootUserParams" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/PrivateKeyParams" - }, - "description": "A list of Private Keys." - } - }, - "required": [ - "subOrganizationName", - "rootUsers", - "rootQuorumThreshold", - "privateKeys" - ] - }, - "CreateSubOrganizationIntentV4": { - "type": "object", - "properties": { - "subOrganizationName": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/RootUserParams" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" - }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" - } - }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] - }, - "CreateSubOrganizationIntentV5": { - "type": "object", - "properties": { - "subOrganizationName": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/RootUserParamsV2" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" - }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" - } - }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] - }, - "CreateSubOrganizationIntentV6": { - "type": "object", - "properties": { - "subOrganizationName": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/RootUserParamsV3" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" - }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" - } - }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] - }, - "CreateSubOrganizationIntentV7": { - "type": "object", - "properties": { - "subOrganizationName": { - "type": "string", - "description": "Name for this sub-organization" - }, - "rootUsers": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/RootUserParamsV4" - }, - "description": "Root users to create within this sub-organization" - }, - "rootQuorumThreshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach root quorum. This value must be less than or equal to the number of root users" - }, - "wallet": { - "$ref": "#/definitions/WalletParams", - "description": "The wallet to create for the sub-organization" - }, - "disableEmailRecovery": { - "type": "boolean", - "description": "Disable email recovery for the sub-organization" - }, - "disableEmailAuth": { - "type": "boolean", - "description": "Disable email auth for the sub-organization" - }, - "disableSmsAuth": { - "type": "boolean", - "description": "Disable OTP SMS auth for the sub-organization" - }, - "disableOtpEmailAuth": { - "type": "boolean", - "description": "Disable OTP email auth for the sub-organization" - } - }, - "required": ["subOrganizationName", "rootUsers", "rootQuorumThreshold"] - }, - "CreateSubOrganizationRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateSubOrganizationIntentV7" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateSubOrganizationResult": { - "type": "object", - "properties": { - "subOrganizationId": { - "type": "string" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["subOrganizationId"] - }, - "CreateSubOrganizationResultV3": { - "type": "object", - "properties": { - "subOrganizationId": { - "type": "string" - }, - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/PrivateKeyResult" - }, - "description": "A list of Private Key IDs and addresses." - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["subOrganizationId", "privateKeys"] - }, - "CreateSubOrganizationResultV4": { - "type": "object", - "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/WalletResult" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["subOrganizationId"] - }, - "CreateSubOrganizationResultV5": { - "type": "object", - "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/WalletResult" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["subOrganizationId"] - }, - "CreateSubOrganizationResultV6": { - "type": "object", - "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/WalletResult" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["subOrganizationId"] - }, - "CreateSubOrganizationResultV7": { - "type": "object", - "properties": { - "subOrganizationId": { - "type": "string" - }, - "wallet": { - "$ref": "#/definitions/WalletResult" - }, - "rootUserIds": { - "type": "array", - "items": { - "type": "string" - } - } - }, - "required": ["subOrganizationId"] - }, - "CreateUserTagIntent": { - "type": "object", - "properties": { - "userTagName": { - "type": "string", - "description": "Human-readable name for a User Tag." - }, - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." - } - }, - "required": ["userTagName", "userIds"] - }, - "CreateUserTagRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_USER_TAG"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateUserTagIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateUserTagResult": { - "type": "object", - "properties": { - "userTagId": { - "type": "string", - "description": "Unique identifier for a given User Tag." - }, - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." - } - }, - "required": ["userTagId", "userIds"] - }, - "CreateUsersIntent": { - "type": "object", - "properties": { - "users": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/UserParams" - }, - "description": "A list of Users." - } - }, - "required": ["users"] - }, - "CreateUsersIntentV2": { - "type": "object", - "properties": { - "users": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/UserParamsV2" - }, - "description": "A list of Users." - } - }, - "required": ["users"] - }, - "CreateUsersRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_USERS_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateUsersIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateUsersResult": { - "type": "object", - "properties": { - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." - } - }, - "required": ["userIds"] - }, - "CreateWalletAccountsIntent": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - }, - "accounts": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/WalletAccountParams" - }, - "description": "A list of wallet Accounts." - } - }, - "required": ["walletId", "accounts"] - }, - "CreateWalletAccountsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateWalletAccountsIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateWalletAccountsResult": { - "type": "object", - "properties": { - "addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of derived addresses." - } - }, - "required": ["addresses"] - }, - "CreateWalletIntent": { - "type": "object", - "properties": { - "walletName": { - "type": "string", - "description": "Human-readable name for a Wallet." - }, - "accounts": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/WalletAccountParams" - }, - "description": "A list of wallet Accounts. This field, if not needed, should be an empty array in your request body." - }, - "mnemonicLength": { - "type": "integer", - "format": "int32", - "description": "Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24." - } - }, - "required": ["walletName", "accounts"] - }, - "CreateWalletRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_CREATE_WALLET"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/CreateWalletIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "CreateWalletResult": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a Wallet." - }, - "addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of account addresses." - } - }, - "required": ["walletId", "addresses"] - }, - "CredPropsAuthenticationExtensionsClientOutputs": { - "type": "object", - "properties": { - "rk": { - "type": "boolean" - } - }, - "required": ["rk"] - }, - "CredentialType": { - "type": "string", - "enum": [ - "CREDENTIAL_TYPE_WEBAUTHN_AUTHENTICATOR", - "CREDENTIAL_TYPE_API_KEY_P256", - "CREDENTIAL_TYPE_RECOVER_USER_KEY_P256", - "CREDENTIAL_TYPE_API_KEY_SECP256K1", - "CREDENTIAL_TYPE_EMAIL_AUTH_KEY_P256", - "CREDENTIAL_TYPE_API_KEY_ED25519", - "CREDENTIAL_TYPE_OTP_AUTH_KEY_P256" - ] - }, - "Curve": { - "type": "string", - "enum": ["CURVE_SECP256K1", "CURVE_ED25519"] - }, - "DeleteApiKeysIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "apiKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of API Key IDs." - } - }, - "required": ["userId", "apiKeyIds"] - }, - "DeleteApiKeysRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_API_KEYS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteApiKeysIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteApiKeysResult": { - "type": "object", - "properties": { - "apiKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of API Key IDs." - } - }, - "required": ["apiKeyIds"] - }, - "DeleteAuthenticatorsIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "authenticatorIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Authenticator IDs." - } - }, - "required": ["userId", "authenticatorIds"] - }, - "DeleteAuthenticatorsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_AUTHENTICATORS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteAuthenticatorsIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteAuthenticatorsResult": { - "type": "object", - "properties": { - "authenticatorIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Unique identifier for a given Authenticator." - } - }, - "required": ["authenticatorIds"] - }, - "DeleteInvitationIntent": { - "type": "object", - "properties": { - "invitationId": { - "type": "string", - "description": "Unique identifier for a given Invitation object." - } - }, - "required": ["invitationId"] - }, - "DeleteInvitationRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_INVITATION"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteInvitationIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteInvitationResult": { - "type": "object", - "properties": { - "invitationId": { - "type": "string", - "description": "Unique identifier for a given Invitation." - } - }, - "required": ["invitationId"] - }, - "DeleteOauthProvidersIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "The ID of the User to remove an Oauth provider from" - }, - "providerIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Unique identifier for a given Provider." - } - }, - "required": ["userId", "providerIds"] - }, - "DeleteOauthProvidersRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteOauthProvidersIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteOauthProvidersResult": { - "type": "object", - "properties": { - "providerIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of unique identifiers for Oauth Providers" - } - }, - "required": ["providerIds"] - }, - "DeleteOrganizationIntent": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "DeleteOrganizationResult": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "DeletePaymentMethodIntent": { - "type": "object", - "properties": { - "paymentMethodId": { - "type": "string", - "description": "The payment method that the customer wants to remove." - } - }, - "required": ["paymentMethodId"] - }, - "DeletePaymentMethodResult": { - "type": "object", - "properties": { - "paymentMethodId": { - "type": "string", - "description": "The payment method that was removed." - } - }, - "required": ["paymentMethodId"] - }, - "DeletePolicyIntent": { - "type": "object", - "properties": { - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - } - }, - "required": ["policyId"] - }, - "DeletePolicyRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_POLICY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeletePolicyIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeletePolicyResult": { - "type": "object", - "properties": { - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - } - }, - "required": ["policyId"] - }, - "DeletePrivateKeyTagsIntent": { - "type": "object", - "properties": { - "privateKeyTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key Tag IDs." - } - }, - "required": ["privateKeyTagIds"] - }, - "DeletePrivateKeyTagsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeletePrivateKeyTagsIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeletePrivateKeyTagsResult": { - "type": "object", - "properties": { - "privateKeyTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key Tag IDs." - }, - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs." - } - }, - "required": ["privateKeyTagIds", "privateKeyIds"] - }, - "DeletePrivateKeysIntent": { - "type": "object", - "properties": { - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for private keys within an organization" - }, - "deleteWithoutExport": { - "type": "boolean", - "description": "Optional parameter for deleting the private keys, even if any have not been previously exported. If they have been exported, this field is ignored." - } - }, - "required": ["privateKeyIds"] - }, - "DeletePrivateKeysRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_PRIVATE_KEYS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeletePrivateKeysIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeletePrivateKeysResult": { - "type": "object", - "properties": { - "privateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of private key unique identifiers that were removed" - } - }, - "required": ["privateKeyIds"] - }, - "DeleteSubOrganizationIntent": { - "type": "object", - "properties": { - "deleteWithoutExport": { - "type": "boolean", - "description": "Sub-organization deletion, by default, requires associated wallets and private keys to be exported for security reasons. Set this boolean to true to force sub-organization deletion even if some wallets or private keys within it have not been exported yet. Default: false." - } - } - }, - "DeleteSubOrganizationRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteSubOrganizationIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteSubOrganizationResult": { - "type": "object", - "properties": { - "subOrganizationUuid": { - "type": "string", - "description": "Unique identifier of the sub organization that was removed" - } - }, - "required": ["subOrganizationUuid"] - }, - "DeleteUserTagsIntent": { - "type": "object", - "properties": { - "userTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User Tag IDs." - } - }, - "required": ["userTagIds"] - }, - "DeleteUserTagsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_USER_TAGS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteUserTagsIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteUserTagsResult": { - "type": "object", - "properties": { - "userTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User Tag IDs." - }, - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." - } - }, - "required": ["userTagIds", "userIds"] - }, - "DeleteUsersIntent": { - "type": "object", - "properties": { - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." - } - }, - "required": ["userIds"] - }, - "DeleteUsersRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_USERS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteUsersIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteUsersResult": { - "type": "object", - "properties": { - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs." - } - }, - "required": ["userIds"] - }, - "DeleteWalletsIntent": { - "type": "object", - "properties": { - "walletIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for wallets within an organization" - }, - "deleteWithoutExport": { - "type": "boolean", - "description": "Optional parameter for deleting the wallets, even if any have not been previously exported. If they have been exported, this field is ignored." - } - }, - "required": ["walletIds"] - }, - "DeleteWalletsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_DELETE_WALLETS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/DeleteWalletsIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "DeleteWalletsResult": { - "type": "object", - "properties": { - "walletIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of wallet unique identifiers that were removed" - } - }, - "required": ["walletIds"] - }, - "DisablePrivateKeyIntent": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - } - }, - "required": ["privateKeyId"] - }, - "DisablePrivateKeyResult": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - } - }, - "required": ["privateKeyId"] - }, - "Effect": { - "type": "string", - "enum": ["EFFECT_ALLOW", "EFFECT_DENY"] - }, - "EmailAuthIntent": { - "type": "object", - "properties": { - "email": { - "type": "string", - "description": "Email of the authenticating user." - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." - }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid. If not provided, a default of 15 minutes will be used." - }, - "emailCustomization": { - "$ref": "#/definitions/EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." - }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Email Auth API keys" - }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the email" - } - }, - "required": ["email", "targetPublicKey"] - }, - "EmailAuthIntentV2": { - "type": "object", - "properties": { - "email": { - "type": "string", - "description": "Email of the authenticating user." - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the email auth bundle (credentials) will be encrypted." - }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Email Auth - \u003cTimestamp\u003e" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid. If not provided, a default of 15 minutes will be used." - }, - "emailCustomization": { - "$ref": "#/definitions/EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." - }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated Email Auth API keys" - }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the email" - } - }, - "required": ["email", "targetPublicKey"] - }, - "EmailAuthRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EMAIL_AUTH_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/EmailAuthIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "EmailAuthResult": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for the authenticating User." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - } - }, - "required": ["userId", "apiKeyId"] - }, - "EmailCustomizationParams": { - "type": "object", - "properties": { - "appName": { - "type": "string", - "description": "The name of the application." - }, - "logoUrl": { - "type": "string", - "description": "A URL pointing to a logo in PNG format. Note this logo will be resized to fit into 340px x 124px." - }, - "magicLinkTemplate": { - "type": "string", - "description": "A template for the URL to be used in a magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s`." - }, - "templateVariables": { - "type": "string", - "description": "JSON object containing key/value pairs to be used with custom templates." - }, - "templateId": { - "type": "string", - "description": "Unique identifier for a given Email Template. If not specified, the default is the most recent Email Template." - } - } - }, - "ExportPrivateKeyIntent": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." - } - }, - "required": ["privateKeyId", "targetPublicKey"] - }, - "ExportPrivateKeyRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EXPORT_PRIVATE_KEY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/ExportPrivateKeyIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "ExportPrivateKeyResult": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - }, - "exportBundle": { - "type": "string", - "description": "Export bundle containing a private key encrypted to the client's target public key." - } - }, - "required": ["privateKeyId", "exportBundle"] - }, - "ExportWalletAccountIntent": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Address to identify Wallet Account." - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." - } - }, - "required": ["address", "targetPublicKey"] - }, - "ExportWalletAccountRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/ExportWalletAccountIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "ExportWalletAccountResult": { - "type": "object", - "properties": { - "address": { - "type": "string", - "description": "Address to identify Wallet Account." - }, - "exportBundle": { - "type": "string", - "description": "Export bundle containing a private key encrypted by the client's target public key." - } - }, - "required": ["address", "exportBundle"] - }, - "ExportWalletIntent": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the export bundle will be encrypted." - }, - "language": { - "$ref": "#/definitions/MnemonicLanguage", - "description": "The language of the mnemonic to export. Defaults to English." - } - }, - "required": ["walletId", "targetPublicKey"] - }, - "ExportWalletRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_EXPORT_WALLET"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/ExportWalletIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "ExportWalletResult": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - }, - "exportBundle": { - "type": "string", - "description": "Export bundle containing a wallet mnemonic + optional newline passphrase encrypted by the client's target public key." - } - }, - "required": ["walletId", "exportBundle"] - }, - "Feature": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/FeatureName" - }, - "value": { - "type": "string" - } - } - }, - "FeatureName": { - "type": "string", - "enum": [ - "FEATURE_NAME_ROOT_USER_EMAIL_RECOVERY", - "FEATURE_NAME_WEBAUTHN_ORIGINS", - "FEATURE_NAME_EMAIL_AUTH", - "FEATURE_NAME_EMAIL_RECOVERY", - "FEATURE_NAME_WEBHOOK", - "FEATURE_NAME_SMS_AUTH", - "FEATURE_NAME_OTP_EMAIL_AUTH" - ] - }, - "GetActivitiesRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "filterByStatus": { - "type": "array", - "items": { - "$ref": "#/definitions/ActivityStatus" - }, - "description": "Array of Activity Statuses filtering which Activities will be listed in the response." - }, - "paginationOptions": { - "$ref": "#/definitions/Pagination", - "description": "Parameters used for cursor-based pagination." - }, - "filterByType": { - "type": "array", - "items": { - "$ref": "#/definitions/ActivityType" - }, - "description": "Array of Activity Types filtering which Activities will be listed in the response." - } - }, - "required": ["organizationId"] - }, - "GetActivitiesResponse": { - "type": "object", - "properties": { - "activities": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Activity" - }, - "description": "A list of Activities." - } - }, - "required": ["activities"] - }, - "GetActivityRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "activityId": { - "type": "string", - "description": "Unique identifier for a given Activity object." - } - }, - "required": ["organizationId", "activityId"] - }, - "GetApiKeyRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for a given API key." - } - }, - "required": ["organizationId", "apiKeyId"] - }, - "GetApiKeyResponse": { - "type": "object", - "properties": { - "apiKey": { - "$ref": "#/definitions/ApiKey", - "description": "An API key." - } - }, - "required": ["apiKey"] - }, - "GetApiKeysRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["organizationId"] - }, - "GetApiKeysResponse": { - "type": "object", - "properties": { - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKey" - }, - "description": "A list of API keys." - } - }, - "required": ["apiKeys"] - }, - "GetAuthenticatorRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "authenticatorId": { - "type": "string", - "description": "Unique identifier for a given Authenticator." - } - }, - "required": ["organizationId", "authenticatorId"] - }, - "GetAuthenticatorResponse": { - "type": "object", - "properties": { - "authenticator": { - "$ref": "#/definitions/Authenticator", - "description": "An authenticator." - } - }, - "required": ["authenticator"] - }, - "GetAuthenticatorsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["organizationId", "userId"] - }, - "GetAuthenticatorsResponse": { - "type": "object", - "properties": { - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Authenticator" - }, - "description": "A list of authenticators." - } - }, - "required": ["authenticators"] - }, - "GetOauthProvidersRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["organizationId"] - }, - "GetOauthProvidersResponse": { - "type": "object", - "properties": { - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/OauthProvider" - }, - "description": "A list of Oauth Providers" - } - }, - "required": ["oauthProviders"] - }, - "GetOrganizationConfigsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "GetOrganizationConfigsResponse": { - "type": "object", - "properties": { - "configs": { - "$ref": "#/definitions/Config", - "description": "Organization configs including quorum settings and organization features" - } - }, - "required": ["configs"] - }, - "GetPoliciesRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "GetPoliciesResponse": { - "type": "object", - "properties": { - "policies": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Policy" - }, - "description": "A list of Policies." - } - }, - "required": ["policies"] - }, - "GetPolicyRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - } - }, - "required": ["organizationId", "policyId"] - }, - "GetPolicyResponse": { - "type": "object", - "properties": { - "policy": { - "$ref": "#/definitions/Policy", - "description": "Object that codifies rules defining the actions that are permissible within an Organization." - } - }, - "required": ["policy"] - }, - "GetPrivateKeyRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - } - }, - "required": ["organizationId", "privateKeyId"] - }, - "GetPrivateKeyResponse": { - "type": "object", - "properties": { - "privateKey": { - "$ref": "#/definitions/PrivateKey", - "description": "Cryptographic public/private key pair that can be used for cryptocurrency needs or more generalized encryption." - } - }, - "required": ["privateKey"] - }, - "GetPrivateKeysRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "GetPrivateKeysResponse": { - "type": "object", - "properties": { - "privateKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/PrivateKey" - }, - "description": "A list of Private Keys." - } - }, - "required": ["privateKeys"] - }, - "GetSubOrgIdsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for the parent Organization. This is used to find sub-organizations within it." - }, - "filterType": { - "type": "string", - "description": "Specifies the type of filter to apply, i.e 'CREDENTIAL_ID', 'NAME', 'USERNAME', 'EMAIL', 'PHONE_NUMBER', 'OIDC_TOKEN' or 'PUBLIC_KEY'" - }, - "filterValue": { - "type": "string", - "description": "The value of the filter to apply for the specified type. For example, a specific email or name string." - }, - "paginationOptions": { - "$ref": "#/definitions/Pagination", - "description": "Parameters used for cursor-based pagination." - } - }, - "required": ["organizationId"] - }, - "GetSubOrgIdsResponse": { - "type": "object", - "properties": { - "organizationIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for the matching sub-organizations." - } - }, - "required": ["organizationIds"] - }, - "GetUserRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - } - }, - "required": ["organizationId", "userId"] - }, - "GetUserResponse": { - "type": "object", - "properties": { - "user": { - "$ref": "#/definitions/User", - "description": "Web and/or API user within your Organization." - } - }, - "required": ["user"] - }, - "GetUsersRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "GetUsersResponse": { - "type": "object", - "properties": { - "users": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/User" - }, - "description": "A list of Users." - } - }, - "required": ["users"] - }, - "GetVerifiedSubOrgIdsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for the parent Organization. This is used to find sub-organizations within it." - }, - "filterType": { - "type": "string", - "description": "Specifies the type of filter to apply, i.e 'EMAIL', 'PHONE_NUMBER'" - }, - "filterValue": { - "type": "string", - "description": "The value of the filter to apply for the specified type. For example, a specific email or phone number string." - }, - "paginationOptions": { - "$ref": "#/definitions/Pagination", - "description": "Parameters used for cursor-based pagination." - } - }, - "required": ["organizationId"] - }, - "GetVerifiedSubOrgIdsResponse": { - "type": "object", - "properties": { - "organizationIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "List of unique identifiers for the matching sub-organizations." - } - }, - "required": ["organizationIds"] - }, - "GetWalletAccountRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - }, - "address": { - "type": "string", - "description": "Address corresponding to a Wallet Account." - }, - "path": { - "type": "string", - "description": "Path corresponding to a Wallet Account." - } - }, - "required": ["organizationId", "walletId"] - }, - "GetWalletAccountResponse": { - "type": "object", - "properties": { - "account": { - "$ref": "#/definitions/WalletAccount", - "description": "The resulting Wallet Account." - } - }, - "required": ["account"] - }, - "GetWalletAccountsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - }, - "paginationOptions": { - "$ref": "#/definitions/Pagination", - "description": "Parameters used for cursor-based pagination." - } - }, - "required": ["organizationId", "walletId"] - }, - "GetWalletAccountsResponse": { - "type": "object", - "properties": { - "accounts": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/WalletAccount" - }, - "description": "A list of Accounts generated from a Wallet that share a common seed." - } - }, - "required": ["accounts"] - }, - "GetWalletRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - } - }, - "required": ["organizationId", "walletId"] - }, - "GetWalletResponse": { - "type": "object", - "properties": { - "wallet": { - "$ref": "#/definitions/Wallet", - "description": "A collection of deterministically generated cryptographic public / private key pairs that share a common seed" - } - }, - "required": ["wallet"] - }, - "GetWalletsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "GetWalletsResponse": { - "type": "object", - "properties": { - "wallets": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Wallet" - }, - "description": "A list of Wallets." - } - }, - "required": ["wallets"] - }, - "GetWhoamiRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization. If the request is being made by a WebAuthN user and their Sub-Organization ID is unknown, this can be the Parent Organization ID; using the Sub-Organization ID when possible is preferred due to performance reasons." - } - }, - "required": ["organizationId"] - }, - "GetWhoamiResponse": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "organizationName": { - "type": "string", - "description": "Human-readable name for an Organization." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "username": { - "type": "string", - "description": "Human-readable name for a User." - } - }, - "required": ["organizationId", "organizationName", "userId", "username"] - }, - "HashFunction": { - "type": "string", - "enum": [ - "HASH_FUNCTION_NO_OP", - "HASH_FUNCTION_SHA256", - "HASH_FUNCTION_KECCAK256", - "HASH_FUNCTION_NOT_APPLICABLE" - ] - }, - "ImportPrivateKeyIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "The ID of the User importing a Private Key." - }, - "privateKeyName": { - "type": "string", - "description": "Human-readable name for a Private Key." - }, - "encryptedBundle": { - "type": "string", - "description": "Bundle containing a raw private key encrypted to the enclave's target public key." - }, - "curve": { - "$ref": "#/definitions/Curve", - "description": "Cryptographic Curve used to generate a given Private Key." - }, - "addressFormats": { - "type": "array", - "items": { - "$ref": "#/definitions/AddressFormat" - }, - "description": "Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." - } - }, - "required": [ - "userId", - "privateKeyName", - "encryptedBundle", - "curve", - "addressFormats" - ] - }, - "ImportPrivateKeyRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_IMPORT_PRIVATE_KEY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/ImportPrivateKeyIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "ImportPrivateKeyResult": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a Private Key." - }, - "addresses": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/activity.v1.Address" - }, - "description": "A list of addresses." - } - }, - "required": ["privateKeyId", "addresses"] - }, - "ImportWalletIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "The ID of the User importing a Wallet." - }, - "walletName": { - "type": "string", - "description": "Human-readable name for a Wallet." - }, - "encryptedBundle": { - "type": "string", - "description": "Bundle containing a wallet mnemonic encrypted to the enclave's target public key." - }, - "accounts": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/WalletAccountParams" - }, - "description": "A list of wallet Accounts." - } - }, - "required": ["userId", "walletName", "encryptedBundle", "accounts"] - }, - "ImportWalletRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_IMPORT_WALLET"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/ImportWalletIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "ImportWalletResult": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a Wallet." - }, - "addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of account addresses." - } - }, - "required": ["walletId", "addresses"] - }, - "InitImportPrivateKeyIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "The ID of the User importing a Private Key." - } - }, - "required": ["userId"] - }, - "InitImportPrivateKeyRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/InitImportPrivateKeyIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "InitImportPrivateKeyResult": { - "type": "object", - "properties": { - "importBundle": { - "type": "string", - "description": "Import bundle containing a public key and signature to use for importing client data." - } - }, - "required": ["importBundle"] - }, - "InitImportWalletIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "The ID of the User importing a Wallet." - } - }, - "required": ["userId"] - }, - "InitImportWalletRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_IMPORT_WALLET"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/InitImportWalletIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "InitImportWalletResult": { - "type": "object", - "properties": { - "importBundle": { - "type": "string", - "description": "Import bundle containing a public key and signature to use for importing client data." - } - }, - "required": ["importBundle"] - }, - "InitOtpAuthIntent": { - "type": "object", - "properties": { - "otpType": { - "type": "string", - "description": "Enum to specifiy whether to send OTP via SMS or email" - }, - "contact": { - "type": "string", - "description": "Email or phone number to send the OTP code to" - }, - "emailCustomization": { - "$ref": "#/definitions/EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." - }, - "smsCustomization": { - "$ref": "#/definitions/SmsCustomizationParams", - "description": "Optional parameters for customizing SMS message. If not provided, the default sms message will be used." - }, - "userIdentifier": { - "type": "string", - "description": "Optional client-generated user identifier to enable per-user rate limiting for SMS auth. We recommend using a hash of the client-side IP address." - }, - "sendFromEmailAddress": { - "type": "string", - "description": "Optional custom email address from which to send the OTP email" - } - }, - "required": ["otpType", "contact"] - }, - "InitOtpAuthRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_OTP_AUTH"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/InitOtpAuthIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "InitOtpAuthResult": { - "type": "object", - "properties": { - "otpId": { - "type": "string", - "description": "Unique identifier for an OTP authentication" - } - }, - "required": ["otpId"] - }, - "InitUserEmailRecoveryIntent": { - "type": "object", - "properties": { - "email": { - "type": "string", - "description": "Email of the user starting recovery" - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the recovery bundle will be encrypted." - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the recovery credential is valid. If not provided, a default of 15 minutes will be used." - }, - "emailCustomization": { - "$ref": "#/definitions/EmailCustomizationParams", - "description": "Optional parameters for customizing emails. If not provided, the default email will be used." - } - }, - "required": ["email", "targetPublicKey"] - }, - "InitUserEmailRecoveryRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/InitUserEmailRecoveryIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "InitUserEmailRecoveryResult": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for the user being recovered." - } - }, - "required": ["userId"] - }, - "Intent": { - "type": "object", - "properties": { - "createOrganizationIntent": { - "$ref": "#/definitions/CreateOrganizationIntent" - }, - "createAuthenticatorsIntent": { - "$ref": "#/definitions/CreateAuthenticatorsIntent" - }, - "createUsersIntent": { - "$ref": "#/definitions/CreateUsersIntent" - }, - "createPrivateKeysIntent": { - "$ref": "#/definitions/CreatePrivateKeysIntent" - }, - "signRawPayloadIntent": { - "$ref": "#/definitions/SignRawPayloadIntent" - }, - "createInvitationsIntent": { - "$ref": "#/definitions/CreateInvitationsIntent" - }, - "acceptInvitationIntent": { - "$ref": "#/definitions/AcceptInvitationIntent" - }, - "createPolicyIntent": { - "$ref": "#/definitions/CreatePolicyIntent" - }, - "disablePrivateKeyIntent": { - "$ref": "#/definitions/DisablePrivateKeyIntent" - }, - "deleteUsersIntent": { - "$ref": "#/definitions/DeleteUsersIntent" - }, - "deleteAuthenticatorsIntent": { - "$ref": "#/definitions/DeleteAuthenticatorsIntent" - }, - "deleteInvitationIntent": { - "$ref": "#/definitions/DeleteInvitationIntent" - }, - "deleteOrganizationIntent": { - "$ref": "#/definitions/DeleteOrganizationIntent" - }, - "deletePolicyIntent": { - "$ref": "#/definitions/DeletePolicyIntent" - }, - "createUserTagIntent": { - "$ref": "#/definitions/CreateUserTagIntent" - }, - "deleteUserTagsIntent": { - "$ref": "#/definitions/DeleteUserTagsIntent" - }, - "signTransactionIntent": { - "$ref": "#/definitions/SignTransactionIntent" - }, - "createApiKeysIntent": { - "$ref": "#/definitions/CreateApiKeysIntent" - }, - "deleteApiKeysIntent": { - "$ref": "#/definitions/DeleteApiKeysIntent" - }, - "approveActivityIntent": { - "$ref": "#/definitions/ApproveActivityIntent" - }, - "rejectActivityIntent": { - "$ref": "#/definitions/RejectActivityIntent" - }, - "createPrivateKeyTagIntent": { - "$ref": "#/definitions/CreatePrivateKeyTagIntent" - }, - "deletePrivateKeyTagsIntent": { - "$ref": "#/definitions/DeletePrivateKeyTagsIntent" - }, - "createPolicyIntentV2": { - "$ref": "#/definitions/CreatePolicyIntentV2" - }, - "setPaymentMethodIntent": { - "$ref": "#/definitions/SetPaymentMethodIntent" - }, - "activateBillingTierIntent": { - "$ref": "#/definitions/ActivateBillingTierIntent" - }, - "deletePaymentMethodIntent": { - "$ref": "#/definitions/DeletePaymentMethodIntent" - }, - "createPolicyIntentV3": { - "$ref": "#/definitions/CreatePolicyIntentV3" - }, - "createApiOnlyUsersIntent": { - "$ref": "#/definitions/CreateApiOnlyUsersIntent" - }, - "updateRootQuorumIntent": { - "$ref": "#/definitions/UpdateRootQuorumIntent" - }, - "updateUserTagIntent": { - "$ref": "#/definitions/UpdateUserTagIntent" - }, - "updatePrivateKeyTagIntent": { - "$ref": "#/definitions/UpdatePrivateKeyTagIntent" - }, - "createAuthenticatorsIntentV2": { - "$ref": "#/definitions/CreateAuthenticatorsIntentV2" - }, - "acceptInvitationIntentV2": { - "$ref": "#/definitions/AcceptInvitationIntentV2" - }, - "createOrganizationIntentV2": { - "$ref": "#/definitions/CreateOrganizationIntentV2" - }, - "createUsersIntentV2": { - "$ref": "#/definitions/CreateUsersIntentV2" - }, - "createSubOrganizationIntent": { - "$ref": "#/definitions/CreateSubOrganizationIntent" - }, - "createSubOrganizationIntentV2": { - "$ref": "#/definitions/CreateSubOrganizationIntentV2" - }, - "updateAllowedOriginsIntent": { - "$ref": "#/definitions/UpdateAllowedOriginsIntent" - }, - "createPrivateKeysIntentV2": { - "$ref": "#/definitions/CreatePrivateKeysIntentV2" - }, - "updateUserIntent": { - "$ref": "#/definitions/UpdateUserIntent" - }, - "updatePolicyIntent": { - "$ref": "#/definitions/UpdatePolicyIntent" - }, - "setPaymentMethodIntentV2": { - "$ref": "#/definitions/SetPaymentMethodIntentV2" - }, - "createSubOrganizationIntentV3": { - "$ref": "#/definitions/CreateSubOrganizationIntentV3" - }, - "createWalletIntent": { - "$ref": "#/definitions/CreateWalletIntent" - }, - "createWalletAccountsIntent": { - "$ref": "#/definitions/CreateWalletAccountsIntent" - }, - "initUserEmailRecoveryIntent": { - "$ref": "#/definitions/InitUserEmailRecoveryIntent" - }, - "recoverUserIntent": { - "$ref": "#/definitions/RecoverUserIntent" - }, - "setOrganizationFeatureIntent": { - "$ref": "#/definitions/SetOrganizationFeatureIntent" - }, - "removeOrganizationFeatureIntent": { - "$ref": "#/definitions/RemoveOrganizationFeatureIntent" - }, - "signRawPayloadIntentV2": { - "$ref": "#/definitions/SignRawPayloadIntentV2" - }, - "signTransactionIntentV2": { - "$ref": "#/definitions/SignTransactionIntentV2" - }, - "exportPrivateKeyIntent": { - "$ref": "#/definitions/ExportPrivateKeyIntent" - }, - "exportWalletIntent": { - "$ref": "#/definitions/ExportWalletIntent" - }, - "createSubOrganizationIntentV4": { - "$ref": "#/definitions/CreateSubOrganizationIntentV4" - }, - "emailAuthIntent": { - "$ref": "#/definitions/EmailAuthIntent" - }, - "exportWalletAccountIntent": { - "$ref": "#/definitions/ExportWalletAccountIntent" - }, - "initImportWalletIntent": { - "$ref": "#/definitions/InitImportWalletIntent" - }, - "importWalletIntent": { - "$ref": "#/definitions/ImportWalletIntent" - }, - "initImportPrivateKeyIntent": { - "$ref": "#/definitions/InitImportPrivateKeyIntent" - }, - "importPrivateKeyIntent": { - "$ref": "#/definitions/ImportPrivateKeyIntent" - }, - "createPoliciesIntent": { - "$ref": "#/definitions/CreatePoliciesIntent" - }, - "signRawPayloadsIntent": { - "$ref": "#/definitions/SignRawPayloadsIntent" - }, - "createReadOnlySessionIntent": { - "$ref": "#/definitions/CreateReadOnlySessionIntent" - }, - "createOauthProvidersIntent": { - "$ref": "#/definitions/CreateOauthProvidersIntent" - }, - "deleteOauthProvidersIntent": { - "$ref": "#/definitions/DeleteOauthProvidersIntent" - }, - "createSubOrganizationIntentV5": { - "$ref": "#/definitions/CreateSubOrganizationIntentV5" - }, - "oauthIntent": { - "$ref": "#/definitions/OauthIntent" - }, - "createApiKeysIntentV2": { - "$ref": "#/definitions/CreateApiKeysIntentV2" - }, - "createReadWriteSessionIntent": { - "$ref": "#/definitions/CreateReadWriteSessionIntent" - }, - "emailAuthIntentV2": { - "$ref": "#/definitions/EmailAuthIntentV2" - }, - "createSubOrganizationIntentV6": { - "$ref": "#/definitions/CreateSubOrganizationIntentV6" - }, - "deletePrivateKeysIntent": { - "$ref": "#/definitions/DeletePrivateKeysIntent" - }, - "deleteWalletsIntent": { - "$ref": "#/definitions/DeleteWalletsIntent" - }, - "createReadWriteSessionIntentV2": { - "$ref": "#/definitions/CreateReadWriteSessionIntentV2" - }, - "deleteSubOrganizationIntent": { - "$ref": "#/definitions/DeleteSubOrganizationIntent" - }, - "initOtpAuthIntent": { - "$ref": "#/definitions/InitOtpAuthIntent" - }, - "otpAuthIntent": { - "$ref": "#/definitions/OtpAuthIntent" - }, - "createSubOrganizationIntentV7": { - "$ref": "#/definitions/CreateSubOrganizationIntentV7" - }, - "updateWalletIntent": { - "$ref": "#/definitions/UpdateWalletIntent" - } - } - }, - "InvitationParams": { - "type": "object", - "properties": { - "receiverUserName": { - "type": "string", - "description": "The name of the intended Invitation recipient." - }, - "receiverUserEmail": { - "type": "string", - "description": "The email address of the intended Invitation recipient." - }, - "receiverUserTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of tags assigned to the Invitation recipient. This field, if not needed, should be an empty array in your request body." - }, - "accessType": { - "$ref": "#/definitions/AccessType", - "description": "The User's permissible access method(s)." - }, - "senderUserId": { - "type": "string", - "description": "Unique identifier for the Sender of an Invitation." - } - }, - "required": [ - "receiverUserName", - "receiverUserEmail", - "receiverUserTags", - "accessType", - "senderUserId" - ] - }, - "ListPrivateKeyTagsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "ListPrivateKeyTagsResponse": { - "type": "object", - "properties": { - "privateKeyTags": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1.Tag" - }, - "description": "A list of Private Key Tags" - } - }, - "required": ["privateKeyTags"] - }, - "ListUserTagsRequest": { - "type": "object", - "properties": { - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - } - }, - "required": ["organizationId"] - }, - "ListUserTagsResponse": { - "type": "object", - "properties": { - "userTags": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/v1.Tag" - }, - "description": "A list of User Tags" - } - }, - "required": ["userTags"] - }, - "MnemonicLanguage": { - "type": "string", - "enum": [ - "MNEMONIC_LANGUAGE_ENGLISH", - "MNEMONIC_LANGUAGE_SIMPLIFIED_CHINESE", - "MNEMONIC_LANGUAGE_TRADITIONAL_CHINESE", - "MNEMONIC_LANGUAGE_CZECH", - "MNEMONIC_LANGUAGE_FRENCH", - "MNEMONIC_LANGUAGE_ITALIAN", - "MNEMONIC_LANGUAGE_JAPANESE", - "MNEMONIC_LANGUAGE_KOREAN", - "MNEMONIC_LANGUAGE_SPANISH" - ] - }, - "OauthIntent": { - "type": "object", - "properties": { - "oidcToken": { - "type": "string", - "description": "Base64 encoded OIDC token" - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the oauth bundle (credentials) will be encrypted." - }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to Oauth - \u003cTimestamp\u003e" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid. If not provided, a default of 15 minutes will be used." - } - }, - "required": ["oidcToken", "targetPublicKey"] - }, - "OauthProvider": { - "type": "object", - "properties": { - "providerId": { - "type": "string", - "description": "Unique identifier for an OAuth Provider" - }, - "providerName": { - "type": "string", - "description": "Human-readable name to identify a Provider." - }, - "issuer": { - "type": "string", - "description": "The issuer of the token, typically a URL indicating the authentication server, e.g https://accounts.google.com" - }, - "audience": { - "type": "string", - "description": "Expected audience ('aud' attribute of the signed token) which represents the app ID" - }, - "subject": { - "type": "string", - "description": "Expected subject ('sub' attribute of the signed token) which represents the user ID" - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - } - }, - "required": [ - "providerId", - "providerName", - "issuer", - "audience", - "subject", - "createdAt", - "updatedAt" - ] - }, - "OauthProviderParams": { - "type": "object", - "properties": { - "providerName": { - "type": "string", - "description": "Human-readable name to identify a Provider." - }, - "oidcToken": { - "type": "string", - "description": "Base64 encoded OIDC token" - } - }, - "required": ["providerName", "oidcToken"] - }, - "OauthRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_OAUTH"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/OauthIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "OauthResult": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for the authenticating User." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - }, - "credentialBundle": { - "type": "string", - "description": "HPKE encrypted credential bundle" - } - }, - "required": ["userId", "apiKeyId", "credentialBundle"] - }, - "Operator": { - "type": "string", - "enum": [ - "OPERATOR_EQUAL", - "OPERATOR_MORE_THAN", - "OPERATOR_MORE_THAN_OR_EQUAL", - "OPERATOR_LESS_THAN", - "OPERATOR_LESS_THAN_OR_EQUAL", - "OPERATOR_CONTAINS", - "OPERATOR_NOT_EQUAL", - "OPERATOR_IN", - "OPERATOR_NOT_IN", - "OPERATOR_CONTAINS_ONE", - "OPERATOR_CONTAINS_ALL" - ] - }, - "OtpAuthIntent": { - "type": "object", - "properties": { - "otpId": { - "type": "string", - "description": "ID representing the result of an init OTP activity." - }, - "otpCode": { - "type": "string", - "description": "6 digit OTP code sent out to a user's contact (email or SMS)" - }, - "targetPublicKey": { - "type": "string", - "description": "Client-side public key generated by the user, to which the OTP bundle (credentials) will be encrypted." - }, - "apiKeyName": { - "type": "string", - "description": "Optional human-readable name for an API Key. If none provided, default to OTP Auth - \u003cTimestamp\u003e" - }, - "expirationSeconds": { - "type": "string", - "description": "Expiration window (in seconds) indicating how long the API key is valid. If not provided, a default of 15 minutes will be used." - }, - "invalidateExisting": { - "type": "boolean", - "description": "Invalidate all other previously generated OTP Auth API keys" - } - }, - "required": ["otpId", "otpCode"] - }, - "OtpAuthRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_OTP_AUTH"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/OtpAuthIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "OtpAuthResult": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for the authenticating User." - }, - "apiKeyId": { - "type": "string", - "description": "Unique identifier for the created API key." - }, - "credentialBundle": { - "type": "string", - "description": "HPKE encrypted credential bundle" - } - }, - "required": ["userId"] - }, - "Pagination": { - "type": "object", - "properties": { - "limit": { - "type": "string", - "description": "A limit of the number of object to be returned, between 1 and 100. Defaults to 10." - }, - "before": { - "type": "string", - "description": "A pagination cursor. This is an object ID that enables you to fetch all objects before this ID." - }, - "after": { - "type": "string", - "description": "A pagination cursor. This is an object ID that enables you to fetch all objects after this ID." - } - } - }, - "PathFormat": { - "type": "string", - "enum": ["PATH_FORMAT_BIP32"] - }, - "PayloadEncoding": { - "type": "string", - "enum": ["PAYLOAD_ENCODING_HEXADECIMAL", "PAYLOAD_ENCODING_TEXT_UTF8"] - }, - "Policy": { - "type": "object", - "properties": { - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - }, - "policyName": { - "type": "string", - "description": "Human-readable name for a Policy." - }, - "effect": { - "$ref": "#/definitions/Effect", - "description": "The instruction to DENY or ALLOW a particular activity following policy selector(s)." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "notes": { - "type": "string", - "description": "Human-readable notes added by a User to describe a particular policy." - }, - "consensus": { - "type": "string", - "description": "A consensus expression that evalutes to true or false." - }, - "condition": { - "type": "string", - "description": "A condition expression that evalutes to true or false." - } - }, - "required": [ - "policyId", - "policyName", - "effect", - "createdAt", - "updatedAt", - "notes", - "consensus", - "condition" - ] - }, - "PrivateKey": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - }, - "publicKey": { - "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." - }, - "privateKeyName": { - "type": "string", - "description": "Human-readable name for a Private Key." - }, - "curve": { - "$ref": "#/definitions/Curve", - "description": "Cryptographic Curve used to generate a given Private Key." - }, - "addresses": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/data.v1.Address" - }, - "description": "Derived cryptocurrency addresses for a given Private Key." - }, - "privateKeyTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key Tag IDs." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "exported": { - "type": "boolean", - "description": "True when a given Private Key is exported, false otherwise." - }, - "imported": { - "type": "boolean", - "description": "True when a given Private Key is imported, false otherwise." - } - }, - "required": [ - "privateKeyId", - "publicKey", - "privateKeyName", - "curve", - "addresses", - "privateKeyTags", - "createdAt", - "updatedAt", - "exported", - "imported" - ] - }, - "PrivateKeyParams": { - "type": "object", - "properties": { - "privateKeyName": { - "type": "string", - "description": "Human-readable name for a Private Key." - }, - "curve": { - "$ref": "#/definitions/Curve", - "description": "Cryptographic Curve used to generate a given Private Key." - }, - "privateKeyTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key Tag IDs. This field, if not needed, should be an empty array in your request body." - }, - "addressFormats": { - "type": "array", - "items": { - "$ref": "#/definitions/AddressFormat" - }, - "description": "Cryptocurrency-specific formats for a derived address (e.g., Ethereum)." - } - }, - "required": [ - "privateKeyName", - "curve", - "privateKeyTags", - "addressFormats" - ] - }, - "PrivateKeyResult": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string" - }, - "addresses": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/activity.v1.Address" - } - } - } - }, - "PublicKeyCredentialWithAttestation": { - "type": "object", - "properties": { - "id": { - "type": "string" - }, - "type": { - "type": "string", - "enum": ["public-key"] - }, - "rawId": { - "type": "string" - }, - "authenticatorAttachment": { - "type": "string", - "enum": ["cross-platform", "platform"], - "x-nullable": true - }, - "response": { - "$ref": "#/definitions/AuthenticatorAttestationResponse" - }, - "clientExtensionResults": { - "$ref": "#/definitions/SimpleClientExtensionResults" - } - }, - "required": ["id", "type", "rawId", "response", "clientExtensionResults"] - }, - "RecoverUserIntent": { - "type": "object", - "properties": { - "authenticator": { - "$ref": "#/definitions/AuthenticatorParamsV2", - "description": "The new authenticator to register." - }, - "userId": { - "type": "string", - "description": "Unique identifier for the user performing recovery." - } - }, - "required": ["authenticator", "userId"] - }, - "RecoverUserRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_RECOVER_USER"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/RecoverUserIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "RecoverUserResult": { - "type": "object", - "properties": { - "authenticatorId": { - "type": "array", - "items": { - "type": "string" - }, - "description": "ID of the authenticator created." - } - }, - "required": ["authenticatorId"] - }, - "RejectActivityIntent": { - "type": "object", - "properties": { - "fingerprint": { - "type": "string", - "description": "An artifact verifying a User's action." - } - }, - "required": ["fingerprint"] - }, - "RejectActivityRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_REJECT_ACTIVITY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/RejectActivityIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "RemoveOrganizationFeatureIntent": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/FeatureName", - "description": "Name of the feature to remove" - } - }, - "required": ["name"] - }, - "RemoveOrganizationFeatureRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/RemoveOrganizationFeatureIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "RemoveOrganizationFeatureResult": { - "type": "object", - "properties": { - "features": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Feature" - }, - "description": "Resulting list of organization features." - } - }, - "required": ["features"] - }, - "Result": { - "type": "object", - "properties": { - "createOrganizationResult": { - "$ref": "#/definitions/CreateOrganizationResult" - }, - "createAuthenticatorsResult": { - "$ref": "#/definitions/CreateAuthenticatorsResult" - }, - "createUsersResult": { - "$ref": "#/definitions/CreateUsersResult" - }, - "createPrivateKeysResult": { - "$ref": "#/definitions/CreatePrivateKeysResult" - }, - "createInvitationsResult": { - "$ref": "#/definitions/CreateInvitationsResult" - }, - "acceptInvitationResult": { - "$ref": "#/definitions/AcceptInvitationResult" - }, - "signRawPayloadResult": { - "$ref": "#/definitions/SignRawPayloadResult" - }, - "createPolicyResult": { - "$ref": "#/definitions/CreatePolicyResult" - }, - "disablePrivateKeyResult": { - "$ref": "#/definitions/DisablePrivateKeyResult" - }, - "deleteUsersResult": { - "$ref": "#/definitions/DeleteUsersResult" - }, - "deleteAuthenticatorsResult": { - "$ref": "#/definitions/DeleteAuthenticatorsResult" - }, - "deleteInvitationResult": { - "$ref": "#/definitions/DeleteInvitationResult" - }, - "deleteOrganizationResult": { - "$ref": "#/definitions/DeleteOrganizationResult" - }, - "deletePolicyResult": { - "$ref": "#/definitions/DeletePolicyResult" - }, - "createUserTagResult": { - "$ref": "#/definitions/CreateUserTagResult" - }, - "deleteUserTagsResult": { - "$ref": "#/definitions/DeleteUserTagsResult" - }, - "signTransactionResult": { - "$ref": "#/definitions/SignTransactionResult" - }, - "deleteApiKeysResult": { - "$ref": "#/definitions/DeleteApiKeysResult" - }, - "createApiKeysResult": { - "$ref": "#/definitions/CreateApiKeysResult" - }, - "createPrivateKeyTagResult": { - "$ref": "#/definitions/CreatePrivateKeyTagResult" - }, - "deletePrivateKeyTagsResult": { - "$ref": "#/definitions/DeletePrivateKeyTagsResult" - }, - "setPaymentMethodResult": { - "$ref": "#/definitions/SetPaymentMethodResult" - }, - "activateBillingTierResult": { - "$ref": "#/definitions/ActivateBillingTierResult" - }, - "deletePaymentMethodResult": { - "$ref": "#/definitions/DeletePaymentMethodResult" - }, - "createApiOnlyUsersResult": { - "$ref": "#/definitions/CreateApiOnlyUsersResult" - }, - "updateRootQuorumResult": { - "$ref": "#/definitions/UpdateRootQuorumResult" - }, - "updateUserTagResult": { - "$ref": "#/definitions/UpdateUserTagResult" - }, - "updatePrivateKeyTagResult": { - "$ref": "#/definitions/UpdatePrivateKeyTagResult" - }, - "createSubOrganizationResult": { - "$ref": "#/definitions/CreateSubOrganizationResult" - }, - "updateAllowedOriginsResult": { - "$ref": "#/definitions/UpdateAllowedOriginsResult" - }, - "createPrivateKeysResultV2": { - "$ref": "#/definitions/CreatePrivateKeysResultV2" - }, - "updateUserResult": { - "$ref": "#/definitions/UpdateUserResult" - }, - "updatePolicyResult": { - "$ref": "#/definitions/UpdatePolicyResult" - }, - "createSubOrganizationResultV3": { - "$ref": "#/definitions/CreateSubOrganizationResultV3" - }, - "createWalletResult": { - "$ref": "#/definitions/CreateWalletResult" - }, - "createWalletAccountsResult": { - "$ref": "#/definitions/CreateWalletAccountsResult" - }, - "initUserEmailRecoveryResult": { - "$ref": "#/definitions/InitUserEmailRecoveryResult" - }, - "recoverUserResult": { - "$ref": "#/definitions/RecoverUserResult" - }, - "setOrganizationFeatureResult": { - "$ref": "#/definitions/SetOrganizationFeatureResult" - }, - "removeOrganizationFeatureResult": { - "$ref": "#/definitions/RemoveOrganizationFeatureResult" - }, - "exportPrivateKeyResult": { - "$ref": "#/definitions/ExportPrivateKeyResult" - }, - "exportWalletResult": { - "$ref": "#/definitions/ExportWalletResult" - }, - "createSubOrganizationResultV4": { - "$ref": "#/definitions/CreateSubOrganizationResultV4" - }, - "emailAuthResult": { - "$ref": "#/definitions/EmailAuthResult" - }, - "exportWalletAccountResult": { - "$ref": "#/definitions/ExportWalletAccountResult" - }, - "initImportWalletResult": { - "$ref": "#/definitions/InitImportWalletResult" - }, - "importWalletResult": { - "$ref": "#/definitions/ImportWalletResult" - }, - "initImportPrivateKeyResult": { - "$ref": "#/definitions/InitImportPrivateKeyResult" - }, - "importPrivateKeyResult": { - "$ref": "#/definitions/ImportPrivateKeyResult" - }, - "createPoliciesResult": { - "$ref": "#/definitions/CreatePoliciesResult" - }, - "signRawPayloadsResult": { - "$ref": "#/definitions/SignRawPayloadsResult" - }, - "createReadOnlySessionResult": { - "$ref": "#/definitions/CreateReadOnlySessionResult" - }, - "createOauthProvidersResult": { - "$ref": "#/definitions/CreateOauthProvidersResult" - }, - "deleteOauthProvidersResult": { - "$ref": "#/definitions/DeleteOauthProvidersResult" - }, - "createSubOrganizationResultV5": { - "$ref": "#/definitions/CreateSubOrganizationResultV5" - }, - "oauthResult": { - "$ref": "#/definitions/OauthResult" - }, - "createReadWriteSessionResult": { - "$ref": "#/definitions/CreateReadWriteSessionResult" - }, - "createSubOrganizationResultV6": { - "$ref": "#/definitions/CreateSubOrganizationResultV6" - }, - "deletePrivateKeysResult": { - "$ref": "#/definitions/DeletePrivateKeysResult" - }, - "deleteWalletsResult": { - "$ref": "#/definitions/DeleteWalletsResult" - }, - "createReadWriteSessionResultV2": { - "$ref": "#/definitions/CreateReadWriteSessionResultV2" - }, - "deleteSubOrganizationResult": { - "$ref": "#/definitions/DeleteSubOrganizationResult" - }, - "initOtpAuthResult": { - "$ref": "#/definitions/InitOtpAuthResult" - }, - "otpAuthResult": { - "$ref": "#/definitions/OtpAuthResult" - }, - "createSubOrganizationResultV7": { - "$ref": "#/definitions/CreateSubOrganizationResultV7" - }, - "updateWalletResult": { - "$ref": "#/definitions/UpdateWalletResult" - } - } - }, - "RootUserParams": { - "type": "object", - "properties": { - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParams" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParamsV2" - }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." - } - }, - "required": ["userName", "apiKeys", "authenticators"] - }, - "RootUserParamsV2": { - "type": "object", - "properties": { - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParams" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParamsV2" - }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." - }, - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/OauthProviderParams" - }, - "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." - } - }, - "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] - }, - "RootUserParamsV3": { - "type": "object", - "properties": { - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParamsV2" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParamsV2" - }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." - }, - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/OauthProviderParams" - }, - "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." - } - }, - "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] - }, - "RootUserParamsV4": { - "type": "object", - "properties": { - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "userPhoneNumber": { - "type": "string", - "description": "The user's phone number in E.164 format e.g. +13214567890" - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParamsV2" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParamsV2" - }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." - }, - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/OauthProviderParams" - }, - "description": "A list of Oauth providers. This field, if not needed, should be an empty array in your request body." - } - }, - "required": ["userName", "apiKeys", "authenticators", "oauthProviders"] - }, - "Selector": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "operator": { - "$ref": "#/definitions/Operator" - }, - "target": { - "type": "string" - } - } - }, - "SelectorV2": { - "type": "object", - "properties": { - "subject": { - "type": "string" - }, - "operator": { - "$ref": "#/definitions/Operator" - }, - "targets": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "SetOrganizationFeatureIntent": { - "type": "object", - "properties": { - "name": { - "$ref": "#/definitions/FeatureName", - "description": "Name of the feature to set" - }, - "value": { - "type": "string", - "description": "Optional value for the feature. Will override existing values if feature is already set." - } - }, - "required": ["name", "value"] - }, - "SetOrganizationFeatureRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/SetOrganizationFeatureIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "SetOrganizationFeatureResult": { - "type": "object", - "properties": { - "features": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Feature" - }, - "description": "Resulting list of organization features." - } - }, - "required": ["features"] - }, - "SetPaymentMethodIntent": { - "type": "object", - "properties": { - "number": { - "type": "string", - "description": "The account number of the customer's credit card." - }, - "cvv": { - "type": "string", - "description": "The verification digits of the customer's credit card." - }, - "expiryMonth": { - "type": "string", - "description": "The month that the credit card expires." - }, - "expiryYear": { - "type": "string", - "description": "The year that the credit card expires." - }, - "cardHolderEmail": { - "type": "string", - "description": "The email that will receive invoices for the credit card." - }, - "cardHolderName": { - "type": "string", - "description": "The name associated with the credit card." - } - }, - "required": [ - "number", - "cvv", - "expiryMonth", - "expiryYear", - "cardHolderEmail", - "cardHolderName" - ] - }, - "SetPaymentMethodIntentV2": { - "type": "object", - "properties": { - "paymentMethodId": { - "type": "string", - "description": "The id of the payment method that was created clientside." - }, - "cardHolderEmail": { - "type": "string", - "description": "The email that will receive invoices for the credit card." - }, - "cardHolderName": { - "type": "string", - "description": "The name associated with the credit card." - } - }, - "required": ["paymentMethodId", "cardHolderEmail", "cardHolderName"] - }, - "SetPaymentMethodResult": { - "type": "object", - "properties": { - "lastFour": { - "type": "string", - "description": "The last four digits of the credit card added." - }, - "cardHolderName": { - "type": "string", - "description": "The name associated with the payment method." - }, - "cardHolderEmail": { - "type": "string", - "description": "The email address associated with the payment method." - } - }, - "required": ["lastFour", "cardHolderName", "cardHolderEmail"] - }, - "SignRawPayloadIntent": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - }, - "payload": { - "type": "string", - "description": "Raw unsigned payload to be signed." - }, - "encoding": { - "$ref": "#/definitions/PayloadEncoding", - "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." - }, - "hashFunction": { - "$ref": "#/definitions/HashFunction", - "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." - } - }, - "required": ["privateKeyId", "payload", "encoding", "hashFunction"] - }, - "SignRawPayloadIntentV2": { - "type": "object", - "properties": { - "signWith": { - "type": "string", - "description": "A Wallet account address, Private Key address, or Private Key identifier." - }, - "payload": { - "type": "string", - "description": "Raw unsigned payload to be signed." - }, - "encoding": { - "$ref": "#/definitions/PayloadEncoding", - "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." - }, - "hashFunction": { - "$ref": "#/definitions/HashFunction", - "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." - } - }, - "required": ["signWith", "payload", "encoding", "hashFunction"] - }, - "SignRawPayloadRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/SignRawPayloadIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "SignRawPayloadResult": { - "type": "object", - "properties": { - "r": { - "type": "string", - "description": "Component of an ECSDA signature." - }, - "s": { - "type": "string", - "description": "Component of an ECSDA signature." - }, - "v": { - "type": "string", - "description": "Component of an ECSDA signature." - } - }, - "required": ["r", "s", "v"] - }, - "SignRawPayloadsIntent": { - "type": "object", - "properties": { - "signWith": { - "type": "string", - "description": "A Wallet account address, Private Key address, or Private Key identifier." - }, - "payloads": { - "type": "array", - "items": { - "type": "string" - }, - "description": "An array of raw unsigned payloads to be signed." - }, - "encoding": { - "$ref": "#/definitions/PayloadEncoding", - "description": "Encoding of the `payload` string. Turnkey uses this information to convert `payload` into bytes with the correct decoder (e.g. hex, utf8)." - }, - "hashFunction": { - "$ref": "#/definitions/HashFunction", - "description": "Hash function to apply to payload bytes before signing. This field must be set to HASH_FUNCTION_NOT_APPLICABLE for EdDSA/ed25519 signature requests; configurable payload hashing is not supported by RFC 8032." - } - }, - "required": ["signWith", "payloads", "encoding", "hashFunction"] - }, - "SignRawPayloadsRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_SIGN_RAW_PAYLOADS"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/SignRawPayloadsIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "SignRawPayloadsResult": { - "type": "object", - "properties": { - "signatures": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/SignRawPayloadResult" - } - } - } - }, - "SignTransactionIntent": { - "type": "object", - "properties": { - "privateKeyId": { - "type": "string", - "description": "Unique identifier for a given Private Key." - }, - "unsignedTransaction": { - "type": "string", - "description": "Raw unsigned transaction to be signed by a particular Private Key." - }, - "type": { - "$ref": "#/definitions/TransactionType" - } - }, - "required": ["privateKeyId", "unsignedTransaction", "type"] - }, - "SignTransactionIntentV2": { - "type": "object", - "properties": { - "signWith": { - "type": "string", - "description": "A Wallet account address, Private Key address, or Private Key identifier." - }, - "unsignedTransaction": { - "type": "string", - "description": "Raw unsigned transaction to be signed" - }, - "type": { - "$ref": "#/definitions/TransactionType" - } - }, - "required": ["signWith", "unsignedTransaction", "type"] - }, - "SignTransactionRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_SIGN_TRANSACTION_V2"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/SignTransactionIntentV2" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "SignTransactionResult": { - "type": "object", - "properties": { - "signedTransaction": { - "type": "string" - } - }, - "required": ["signedTransaction"] - }, - "SimpleClientExtensionResults": { - "type": "object", - "properties": { - "appid": { - "type": "boolean" - }, - "appidExclude": { - "type": "boolean" - }, - "credProps": { - "$ref": "#/definitions/CredPropsAuthenticationExtensionsClientOutputs" - } - } - }, - "SmsCustomizationParams": { - "type": "object", - "properties": { - "template": { - "type": "string", - "description": "Template containing references to .OtpCode i.e Your OTP is {{.OtpCode}}" - } - } - }, - "Status": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Any" - } - } - } - }, - "TagType": { - "type": "string", - "enum": ["TAG_TYPE_USER", "TAG_TYPE_PRIVATE_KEY"] - }, - "TransactionType": { - "type": "string", - "enum": ["TRANSACTION_TYPE_ETHEREUM", "TRANSACTION_TYPE_SOLANA"] - }, - "UpdateAllowedOriginsIntent": { - "type": "object", - "properties": { - "allowedOrigins": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Additional origins requests are allowed from besides Turnkey origins" - } - }, - "required": ["allowedOrigins"] - }, - "UpdateAllowedOriginsResult": { - "type": "object" - }, - "UpdatePolicyIntent": { - "type": "object", - "properties": { - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - }, - "policyName": { - "type": "string", - "description": "Human-readable name for a Policy." - }, - "policyEffect": { - "$ref": "#/definitions/Effect", - "description": "The instruction to DENY or ALLOW an activity (optional)." - }, - "policyCondition": { - "type": "string", - "description": "The condition expression that triggers the Effect (optional)." - }, - "policyConsensus": { - "type": "string", - "description": "The consensus expression that triggers the Effect (optional)." - }, - "policyNotes": { - "type": "string", - "description": "Accompanying notes for a Policy (optional)." - } - }, - "required": ["policyId"] - }, - "UpdatePolicyRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_UPDATE_POLICY"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/UpdatePolicyIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "UpdatePolicyResult": { - "type": "object", - "properties": { - "policyId": { - "type": "string", - "description": "Unique identifier for a given Policy." - } - }, - "required": ["policyId"] - }, - "UpdatePrivateKeyTagIntent": { - "type": "object", - "properties": { - "privateKeyTagId": { - "type": "string", - "description": "Unique identifier for a given Private Key Tag." - }, - "newPrivateKeyTagName": { - "type": "string", - "description": "The new, human-readable name for the tag with the given ID." - }, - "addPrivateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Keys IDs to add this tag to." - }, - "removePrivateKeyIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of Private Key IDs to remove this tag from." - } - }, - "required": ["privateKeyTagId", "addPrivateKeyIds", "removePrivateKeyIds"] - }, - "UpdatePrivateKeyTagRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/UpdatePrivateKeyTagIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "UpdatePrivateKeyTagResult": { - "type": "object", - "properties": { - "privateKeyTagId": { - "type": "string", - "description": "Unique identifier for a given Private Key Tag." - } - }, - "required": ["privateKeyTagId"] - }, - "UpdateRootQuorumIntent": { - "type": "object", - "properties": { - "threshold": { - "type": "integer", - "format": "int32", - "description": "The threshold of unique approvals to reach quorum." - }, - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "The unique identifiers of users who comprise the quorum set." - } - }, - "required": ["threshold", "userIds"] - }, - "UpdateRootQuorumRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_UPDATE_ROOT_QUORUM"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/UpdateRootQuorumIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "UpdateRootQuorumResult": { - "type": "object" - }, - "UpdateUserIntent": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "userTagIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "An updated list of User Tags to apply to this User. This field, if not needed, should be an empty array in your request body." - }, - "userPhoneNumber": { - "type": "string", - "description": "The user's phone number in E.164 format e.g. +13214567890" - } - }, - "required": ["userId"] - }, - "UpdateUserRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_UPDATE_USER"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/UpdateUserIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "UpdateUserResult": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "A User ID." - } - }, - "required": ["userId"] - }, - "UpdateUserTagIntent": { - "type": "object", - "properties": { - "userTagId": { - "type": "string", - "description": "Unique identifier for a given User Tag." - }, - "newUserTagName": { - "type": "string", - "description": "The new, human-readable name for the tag with the given ID." - }, - "addUserIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs to add this tag to." - }, - "removeUserIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User IDs to remove this tag from." - } - }, - "required": ["userTagId", "addUserIds", "removeUserIds"] - }, - "UpdateUserTagRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_UPDATE_USER_TAG"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/UpdateUserTagIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "UpdateUserTagResult": { - "type": "object", - "properties": { - "userTagId": { - "type": "string", - "description": "Unique identifier for a given User Tag." - } - }, - "required": ["userTagId"] - }, - "UpdateWalletIntent": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - }, - "walletName": { - "type": "string", - "description": "Human-readable name for a Wallet." - } - }, - "required": ["walletId"] - }, - "UpdateWalletRequest": { - "type": "object", - "properties": { - "type": { - "type": "string", - "enum": ["ACTIVITY_TYPE_UPDATE_WALLET"] - }, - "timestampMs": { - "type": "string", - "description": "Timestamp (in milliseconds) of the request, used to verify liveness of user requests." - }, - "organizationId": { - "type": "string", - "description": "Unique identifier for a given Organization." - }, - "parameters": { - "$ref": "#/definitions/UpdateWalletIntent" - } - }, - "required": ["type", "timestampMs", "organizationId", "parameters"] - }, - "UpdateWalletResult": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "A Wallet ID." - } - }, - "required": ["walletId"] - }, - "User": { - "type": "object", - "properties": { - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "userPhoneNumber": { - "type": "string", - "description": "The user's phone number in E.164 format e.g. +13214567890" - }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/Authenticator" - }, - "description": "A list of Authenticator parameters." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKey" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - }, - "userTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User Tag IDs." - }, - "oauthProviders": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/OauthProvider" - }, - "description": "A list of Oauth Providers." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - } - }, - "required": [ - "userId", - "userName", - "authenticators", - "apiKeys", - "userTags", - "oauthProviders", - "createdAt", - "updatedAt" - ] - }, - "UserParams": { - "type": "object", - "properties": { - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "accessType": { - "$ref": "#/definitions/AccessType", - "description": "The User's permissible access method(s)." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParams" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParams" - }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." - }, - "userTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User Tag IDs. This field, if not needed, should be an empty array in your request body." - } - }, - "required": [ - "userName", - "accessType", - "apiKeys", - "authenticators", - "userTags" - ] - }, - "UserParamsV2": { - "type": "object", - "properties": { - "userName": { - "type": "string", - "description": "Human-readable name for a User." - }, - "userEmail": { - "type": "string", - "description": "The user's email address." - }, - "apiKeys": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/ApiKeyParams" - }, - "description": "A list of API Key parameters. This field, if not needed, should be an empty array in your request body." - }, - "authenticators": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/AuthenticatorParamsV2" - }, - "description": "A list of Authenticator parameters. This field, if not needed, should be an empty array in your request body." - }, - "userTags": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of User Tag IDs. This field, if not needed, should be an empty array in your request body." - } - }, - "required": ["userName", "apiKeys", "authenticators", "userTags"] - }, - "Vote": { - "type": "object", - "properties": { - "id": { - "type": "string", - "description": "Unique identifier for a given Vote object." - }, - "userId": { - "type": "string", - "description": "Unique identifier for a given User." - }, - "user": { - "$ref": "#/definitions/User", - "description": "Web and/or API user within your Organization." - }, - "activityId": { - "type": "string", - "description": "Unique identifier for a given Activity object." - }, - "selection": { - "type": "string", - "enum": ["VOTE_SELECTION_APPROVED", "VOTE_SELECTION_REJECTED"] - }, - "message": { - "type": "string", - "description": "The raw message being signed within a Vote." - }, - "publicKey": { - "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." - }, - "signature": { - "type": "string", - "description": "The signature applied to a particular vote." - }, - "scheme": { - "type": "string", - "description": "Method used to produce a signature." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - } - }, - "required": [ - "id", - "userId", - "user", - "activityId", - "selection", - "message", - "publicKey", - "signature", - "scheme", - "createdAt" - ] - }, - "Wallet": { - "type": "object", - "properties": { - "walletId": { - "type": "string", - "description": "Unique identifier for a given Wallet." - }, - "walletName": { - "type": "string", - "description": "Human-readable name for a Wallet." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "exported": { - "type": "boolean", - "description": "True when a given Wallet is exported, false otherwise." - }, - "imported": { - "type": "boolean", - "description": "True when a given Wallet is imported, false otherwise." - } - }, - "required": [ - "walletId", - "walletName", - "createdAt", - "updatedAt", - "exported", - "imported" - ] - }, - "WalletAccount": { - "type": "object", - "properties": { - "walletAccountId": { - "type": "string", - "description": "Unique identifier for a given Wallet Account." - }, - "organizationId": { - "type": "string", - "description": "The Organization the Account belongs to." - }, - "walletId": { - "type": "string", - "description": "The Wallet the Account was derived from." - }, - "curve": { - "$ref": "#/definitions/Curve", - "description": "Cryptographic curve used to generate the Account." - }, - "pathFormat": { - "$ref": "#/definitions/PathFormat", - "description": "Path format used to generate the Account." - }, - "path": { - "type": "string", - "description": "Path used to generate the Account." - }, - "addressFormat": { - "$ref": "#/definitions/AddressFormat", - "description": "Address format used to generate the Acccount." - }, - "address": { - "type": "string", - "description": "Address generated using the Wallet seed and Account parameters." - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - } - }, - "required": [ - "walletAccountId", - "organizationId", - "walletId", - "curve", - "pathFormat", - "path", - "addressFormat", - "address", - "createdAt", - "updatedAt" - ] - }, - "WalletAccountParams": { - "type": "object", - "properties": { - "curve": { - "$ref": "#/definitions/Curve", - "description": "Cryptographic curve used to generate a wallet Account." - }, - "pathFormat": { - "$ref": "#/definitions/PathFormat", - "description": "Path format used to generate a wallet Account." - }, - "path": { - "type": "string", - "description": "Path used to generate a wallet Account." - }, - "addressFormat": { - "$ref": "#/definitions/AddressFormat", - "description": "Address format used to generate a wallet Acccount." - } - }, - "required": ["curve", "pathFormat", "path", "addressFormat"] - }, - "WalletParams": { - "type": "object", - "properties": { - "walletName": { - "type": "string", - "description": "Human-readable name for a Wallet." - }, - "accounts": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/WalletAccountParams" - }, - "description": "A list of wallet Accounts. This field, if not needed, should be an empty array in your request body." - }, - "mnemonicLength": { - "type": "integer", - "format": "int32", - "description": "Length of mnemonic to generate the Wallet seed. Defaults to 12. Accepted values: 12, 15, 18, 21, 24." - } - }, - "required": ["walletName", "accounts"] - }, - "WalletResult": { - "type": "object", - "properties": { - "walletId": { - "type": "string" - }, - "addresses": { - "type": "array", - "items": { - "type": "string" - }, - "description": "A list of account addresses." - } - }, - "required": ["walletId", "addresses"] - }, - "activity.v1.Address": { - "type": "object", - "properties": { - "format": { - "$ref": "#/definitions/AddressFormat" - }, - "address": { - "type": "string" - } - } - }, - "data.v1.Address": { - "type": "object", - "properties": { - "format": { - "$ref": "#/definitions/AddressFormat" - }, - "address": { - "type": "string" - } - } - }, - "external.data.v1.Credential": { - "type": "object", - "properties": { - "publicKey": { - "type": "string", - "description": "The public component of a cryptographic key pair used to sign messages and transactions." - }, - "type": { - "$ref": "#/definitions/CredentialType" - } - }, - "required": ["publicKey", "type"] - }, - "external.data.v1.Quorum": { - "type": "object", - "properties": { - "threshold": { - "type": "integer", - "format": "int32", - "description": "Count of unique approvals required to meet quorum." - }, - "userIds": { - "type": "array", - "items": { - "type": "string" - }, - "description": "Unique identifiers of quorum set members." - } - }, - "required": ["threshold", "userIds"] - }, - "external.data.v1.Timestamp": { - "type": "object", - "properties": { - "seconds": { - "type": "string" - }, - "nanos": { - "type": "string" - } - }, - "required": ["seconds", "nanos"] - }, - "v1.Tag": { - "type": "object", - "properties": { - "tagId": { - "type": "string", - "description": "Unique identifier for a given Tag." - }, - "tagName": { - "type": "string", - "description": "Human-readable name for a Tag." - }, - "tagType": { - "$ref": "#/definitions/TagType" - }, - "createdAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - }, - "updatedAt": { - "$ref": "#/definitions/external.data.v1.Timestamp" - } - }, - "required": ["tagId", "tagName", "tagType", "createdAt", "updatedAt"] - } - }, - "securityDefinitions": { - "ApiKeyAuth": { - "type": "apiKey", - "name": "X-Stamp", - "in": "header" - }, - "AuthenticatorAuth": { - "type": "apiKey", - "name": "X-Stamp-WebAuthn", - "in": "header" - } - }, - "security": [ - { - "ApiKeyAuth": [] - }, - { - "AuthenticatorAuth": [] - } - ], - "x-tagGroups": [ - { - "name": "ORGANIZATIONS", - "tags": ["Organizations", "Invitations", "Policies", "Features"] - }, - { - "name": "WALLETS AND PRIVATE KEYS", - "tags": ["Wallets", "Signing", "Private Keys", "Private Key Tags"] - }, - { - "name": "USERS", - "tags": ["Users", "User Tags", "User Recovery", "User Auth"] - }, - { - "name": "CREDENTIALS", - "tags": ["Authenticators", "API Keys", "Sessions"] - }, - { - "name": "ACTIVITIES", - "tags": ["Activities", "Consensus"] - } - ] -} diff --git a/assets/files/email_auth_steps-d4f7ca188fd3fb9a2de5557b4cf39c7b.png.png b/assets/files/email_auth_steps-d4f7ca188fd3fb9a2de5557b4cf39c7b.png.png new file mode 100644 index 00000000..3759fad0 Binary files /dev/null and b/assets/files/email_auth_steps-d4f7ca188fd3fb9a2de5557b4cf39c7b.png.png differ diff --git a/static/.nojekyll b/assets/files/email_recovery_steps-d43c6b808682671a8294b7f420efe2a5.png similarity index 100% rename from static/.nojekyll rename to assets/files/email_recovery_steps-d43c6b808682671a8294b7f420efe2a5.png diff --git a/assets/files/wallet_export_steps-5bb19c72eb9596fab8db3b1dcc52e60a.png.png b/assets/files/wallet_export_steps-5bb19c72eb9596fab8db3b1dcc52e60a.png.png new file mode 100644 index 00000000..c7fd8254 Binary files /dev/null and b/assets/files/wallet_export_steps-5bb19c72eb9596fab8db3b1dcc52e60a.png.png differ diff --git a/assets/files/wallet_import_steps-6c4753c1e726e1632ce475bc838388c2.png.png b/assets/files/wallet_import_steps-6c4753c1e726e1632ce475bc838388c2.png.png new file mode 100644 index 00000000..3e6230c8 Binary files /dev/null and b/assets/files/wallet_import_steps-6c4753c1e726e1632ce475bc838388c2.png.png differ diff --git a/docs/documentation/authentication/email.mdx b/authentication/email.mdx similarity index 75% rename from docs/documentation/authentication/email.mdx rename to authentication/email.mdx index 67173750..2ae5c549 100644 --- a/docs/documentation/authentication/email.mdx +++ b/authentication/email.mdx @@ -1,15 +1,10 @@ --- -title: Email Authentication -sidebar_label: Email -sidebar_position: 2 -slug: /authentication/email +title: "Overview" +description: "Email Authentication enables users to authenticate and recover their Turnkey accounts using email-based verification. There are two methods of email authentication:" +sidebarTitle: "Email" --- -# Overview - -Email Authentication enables users to authenticate and recover their Turnkey accounts using email-based verification. There are two methods of email authentication: - -** One-Time Password** +**One-Time Password** - Uses a 6-digit one-time password sent via email - Simple, and familiar user experience @@ -30,16 +25,19 @@ Email Authentication is built with expiring API keys as the foundation. The two The authentication process happens in two steps: -1. A 6-digit OTP code is sent to the user's verified email address -2. Upon verification of the correct code, an API key credential is generated and encrypted for the client + + A 6-digit OTP code is sent to the user's verified email address + + Upon verification of the correct code, an API key credential is generated + and encrypted for the client + + ### Credential Bundle Method The API key credential is encrypted and delivered directly through email to the user. -In both cases, once the credential is live on the client side (within the context of an iframe), it -is readily available to stamp (authenticate) requests. See the [enclave to end-user secure channel](../security/enclave-secure-channels.md) -for more info on how we achieve secure delivery. +In both cases, once the credential is live on the client side (within the context of an iframe), it is readily available to stamp (authenticate) requests. See the [enclave to end-user secure channel](/security/enclave-secure-channels) for more info on how we achieve secure delivery. ## User Experience @@ -50,7 +48,9 @@ The flow begins with a new activity of type `ACTIVITY_TYPE_INIT_OTP_AUTH` with t - `otpType`: specify `"OTP_TYPE_EMAIL"` - `contact`: user's email address (must match their registered email) - `emailCustomization`: optional parameters for customizing emails -- `userIdentifier`: optional parameter for rate limiting (recommended for production) +- `userIdentifier`: optional parameter for rate limiting SMS OTP requests per user. + We recommend generating this server-side based on the user's IP address or public key. + See the [OTP Rate Limits](#otp-rate-limits) section below for more details. After receiving the 6-digit code, users complete authentication with `ACTIVITY_TYPE_OTP_AUTH`: @@ -61,13 +61,20 @@ After receiving the 6-digit code, users complete authentication with `ACTIVITY_T - `expirationSeconds`: optional validity window (defaults to 15 minutes) - `invalidateExisting`: optional boolean to invalidate previous OTP Auth API keys -

+ auth otp email -

+ + +### OTP Rate Limits + +In order to safeguard users, Turnkey enforces rate limits for OTP auth activities. If a `userIdentifier` parameter is provided, the following limits are enforced: + +- 3 requests per 3 minutes per unique `userIdentifier` +- 3 retries max per code, after which point that code will be locked +- 3 active codes per user, each with a 5 minute TTL ### Credential Bundle Authentication Flow @@ -80,9 +87,9 @@ This alternative method uses `ACTIVITY_TYPE_EMAIL_AUTH` with these parameters: - `emailCustomization`: optional parameters for customizing emails - `invalidateExisting`: optional boolean to invalidate previous Email Auth API keys -

- auth email -

+ + auth email + ### Recovery Flow @@ -96,9 +103,9 @@ The recovery process consists of two phases: 1. **Initiation**: Generates a temporary recovery credential and sends it via email 2. **Finalization**: User decrypts the recovery credential and uses it to sign an `ACTIVITY_TYPE_RECOVER_USER` activity, which can add new authenticators to regain account access -

- auth email -

+ + auth email + ## Authorization @@ -120,23 +127,25 @@ Specifically: ### Recovery - `ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY`: + - Initiates the recovery process - Requires proper authorization via policies - Can target any user in the organization or sub-organizations + - `ACTIVITY_TYPE_RECOVER_USER`: + - Must be signed by the recovery credential received via email - Users can add credentials to their own user when authenticated - Recovery credentials expire after 15 minutes - Only the most recent recovery credential remains valid - Users can add new authenticators to regain account access when authenticated with a recovery credential -

+ email auth authorization -

+ ## Implementation in Sub-organizations @@ -151,17 +160,33 @@ Both authentication methods and recovery work seamlessly with [sub-organizations For implementation details: -- [Sub-Organization Email Auth Guide](/embedded-wallets/sub-organization-auth) -- [Sub-Organization Recovery Guide](/embedded-wallets/sub-organization-recovery) + + + + ## Implementation in Organizations For organizations accessed via dashboard: 1. Ensure the required features are enabled: + - `FEATURE_NAME_OTP_EMAIL_AUTH` for OTP-based authentication - `FEATURE_NAME_EMAIL_AUTH` for credential bundle authentication - Recovery features if needed + 2. Users initiating the request must have appropriate permissions ## Opting Out @@ -180,9 +205,10 @@ When creating sub-organizations, use: - `disableEmailAuth` parameter for credential bundle authentication - `disableEmailRecovery` parameter for recovery -## Implementation Notes +## Implementation Notes[​](#implementation-notes "Direct link to Implementation Notes") - Users are limited to: + - 10 long-lived API keys - 10 expiring API keys (oldest are discarded when limit is reached) @@ -198,7 +224,7 @@ When creating sub-organizations, use: Example of enabling OTP-based Email Auth: -```sh +```bash turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", @@ -211,7 +237,7 @@ turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization Example of enabling credential bundle Email Auth: -```sh +```bash turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", diff --git a/docs/documentation/authentication/passkeys/discoverable.md b/authentication/passkeys/discoverable-vs-non-discoverable.mdx similarity index 80% rename from docs/documentation/authentication/passkeys/discoverable.md rename to authentication/passkeys/discoverable-vs-non-discoverable.mdx index 018589da..9227e847 100644 --- a/docs/documentation/authentication/passkeys/discoverable.md +++ b/authentication/passkeys/discoverable-vs-non-discoverable.mdx @@ -1,19 +1,14 @@ --- -description: Learn about discoverable vs. non-discoverable credentials and how they affect UX -slug: /authentication/passkeys/discoverable-vs-non-discoverable -sidebar_position: 5 +title: "Discoverable vs. Non-Discoverable" +description: 'Also known as "resident" vs. "non-resident" credentials. From [the spec](https://www.w3.org/TR/webauthn-2/)' --- -# Discoverable vs. non-discoverable - -Also known as "resident" vs. "non-resident" credentials. From [the spec](https://www.w3.org/TR/webauthn-2/): - > Historically, client-side discoverable credentials have been known as resident credentials or resident keys. Due to the phrases ResidentKey and residentKey being widely used in both the WebAuthn API and also in the Authenticator Model (e.g., in dictionary member names, algorithm variable names, and operation parameters) the usage of resident within their names has not been changed for backwards compatibility purposes. Also, the term resident key is defined here as equivalent to a client-side discoverable credential. What does this mean exactly? -- "resident" credentials and "discoverable" credentials are the same -- "non-resident" credentials and "non-discoverable" credentials are the same. +* "resident" credentials and "discoverable" credentials are the same +* "non-resident" credentials and "non-discoverable" credentials are the same. The spec authors made this rename for clarity. @@ -23,18 +18,14 @@ With terminology out of the way, what is a "discoverable" credential compared to A discoverable credential is a self-contained key pair, stored on the end-user's device. Discoverable credentials are preferred because keys are self-contained, can easily be synced and can be used across devices independently. Crucially for UX, the end-user is able to list their passkeys and choose which device/passkey they'd like to use: -

- device selection on Chrome - passkey selection on Chrome -

+ + + device selection on Chrome + + + passkey selection on Chrome + + With discoverable credentials you don't have to keep track of credential IDs. Your authentication flow can simply be: "prompt the user with passkey authentication", and let the browser or device native UX handle the rest! The downside is you lose some control over these prompts, because they will vary depending on your users' OS and browser. @@ -46,10 +37,10 @@ A non-discoverable credential isn’t stored on the end-user's device fully: Tur Why would you choose non-discoverable credentials? -- Most hardware security keys have limited slots to store discoverable credentials, or will refuse to create new discoverable credentials on the hardware altogether. YubiKey 5 [advertises 25 slots](https://support.yubico.com/hc/en-us/articles/4404456942738-FAQ#h_01FFHQFVBW0995G2MKZGCKQVEJ), SoloKeys [support 50](https://github.com/solokeys/solo1/issues/156#issuecomment-477645573), NitroKeys 3 [support 10](https://github.com/Nitrokey/nitrokey-3-firmware/blob/0e23c75318e2016ac1cfb8345de9279e3ad2eaf9/components/apps/src/lib.rs#L390). Non-discoverable credentials aren't subject to these limits because they work off of a single hardware secret. -- Security keys can only allow clearing of individual slots if they support [CTAP 2.1](https://fidoalliance.org/specs/fido-v2.1-rd-20201208/fido-client-to-authenticator-protocol-v2.1-rd-20201208.html). This is described in [this blog post](https://fy.blackhats.net.au/blog/2023-02-02-how-hype-will-turn-your-security-key-into-junk/). When security keys do not support CTAP 2.1, slots can only be freed up by resetting the hardware entirely, erasing all secrets at once. -- Non-discoverable credentials take less space. This is important in some environments, but unlikely to be relevant if your users are storing passkeys in their Google or Apple accounts (plenty of space available there!) -- Credential IDs have to be communicated during authentication (via the `allowCredentials` field). This allows browsers to offer better, more tailored prompts in some cases. For example: if the list contains a single authenticator with `"transports": ["AUTHENTICATOR_TRANSPORT_INTERNAL"]`, Chrome does “the right thing” by skipping the device selection popup: users go straight to the fingerprint popup, with no need to select “this device”! +* Most hardware security keys have limited slots to store discoverable credentials, or will refuse to create new discoverable credentials on the hardware altogether. YubiKey 5 [advertises 25 slots](https://support.yubico.com/hc/en-us/articles/4404456942738-FAQ#h_01FFHQFVBW0995G2MKZGCKQVEJ), SoloKeys [support 50](https://github.com/solokeys/solo1/issues/156#issuecomment-477645573), NitroKeys 3 [support 10](https://github.com/Nitrokey/nitrokey-3-firmware/blob/0e23c75318e2016ac1cfb8345de9279e3ad2eaf9/components/apps/src/lib.rs#L390). Non-discoverable credentials aren't subject to these limits because they work off of a single hardware secret. +* Security keys can only allow clearing of individual slots if they support [CTAP 2.1](https://fidoalliance.org/specs/fido-v2.1-rd-20201208/fido-client-to-authenticator-protocol-v2.1-rd-20201208.html). This is described in [this blog post](https://fy.blackhats.net.au/blog/2023-02-02-how-hype-will-turn-your-security-key-into-junk/). When security keys do not support CTAP 2.1, slots can only be freed up by resetting the hardware entirely, erasing all secrets at once. +* Non-discoverable credentials take less space. This is important in some environments, but unlikely to be relevant if your users are storing passkeys in their Google or Apple accounts (plenty of space available there!) +* Credential IDs have to be communicated during authentication (via the `allowCredentials` field). This allows browsers to offer better, more tailored prompts in some cases. For example: if the list contains a single authenticator with `"transports": ["AUTHENTICATOR_TRANSPORT_INTERNAL"]`, Chrome does “the right thing” by skipping the device selection popup: users go straight to the fingerprint popup, with no need to select “this device”! The downside to this is, of course, that you need to store credential IDs, and you need to make sure you can retrieve credentials for each user. This can be done with a table of credentials keyed by user email, for example. Or if you have your own authentication already, a list of credentials can be returned when the user logs in. diff --git a/docs/documentation/authentication/passkeys/integration.md b/authentication/passkeys/integration.mdx similarity index 63% rename from docs/documentation/authentication/passkeys/integration.md rename to authentication/passkeys/integration.mdx index fc5412f2..1e830faa 100644 --- a/docs/documentation/authentication/passkeys/integration.md +++ b/authentication/passkeys/integration.mdx @@ -1,22 +1,15 @@ --- -description: Integration guide to use passkeys in your application -slug: /authentication/passkeys/integration -sidebar_position: 2 +title: "Integrating Passkeys" --- -# Integrating passkeys - ## Passkey flow A typical passkey flow is composed of 4 main steps, depicted below: -

- passkey prompt on Turnkey -

+ + + Passkey flow on Turnkey + 1. Your app frontend triggers a passkey prompt. 2. Your end-user uses their device to produce a signature with their passkey, and a signed request is produced. @@ -25,57 +18,58 @@ A typical passkey flow is composed of 4 main steps, depicted below: This flow happens once for **registration** and for each subsequent **authentication** or signature request. The main difference is the browser APIs used to trigger the passkey prompt in step (1): -- **Passkey registration** uses `navigator.credentials.create`(as described in [this guide](https://web.dev/passkey-registration/)). `navigator.credentials.create` triggers the creation of a **new** passkey. -- **Passkey authentication** uses `navigator.credentials.get`. See [this guide](https://web.dev/passkey-form-autofill/) for more information. `navigator.credentials.get` triggers a signature prompt for an **existing** passkey. +* **Passkey registration** uses `navigator.credentials.create`(as described in [this guide](https://web.dev/passkey-registration/)). `navigator.credentials.create` triggers the creation of a **new** passkey. +* **Passkey authentication** uses `navigator.credentials.get`. See [this guide](https://web.dev/passkey-form-autofill/) for more information. `navigator.credentials.get` triggers a signature prompt for an **existing** passkey. ## Our SDK can help Our SDK has integrated passkey functionality, and we've built examples to help you get started. -- [`@turnkey/http`](https://www.npmjs.com/package/@turnkey/http) has a helper to trigger passkey registration (`getWebAuthnAttestation`). You can see it in action in our [`with-federated-passkeys`](https://github.com/tkhq/sdk/tree/main/examples/with-federated-passkeys) example: [direct code link](https://github.com/tkhq/sdk/blob/a2bfbf3cbd6040902bbe4c247900ac560be42925/examples/with-federated-passkeys/src/pages/index.tsx#L88) -- [`@turnkey/webauthn-stamper`](https://www.npmjs.com/package/@turnkey/webauthn-stamper) is a passkey-compatible stamper which integrates seamlessly with `TurnkeyClient`: +* [`@turnkey/http`](https://www.npmjs.com/package/@turnkey/http) has a helper to trigger passkey registration (`getWebAuthnAttestation`). You can see it in action in our [`with-federated-passkeys`](https://github.com/tkhq/sdk/tree/main/examples/with-federated-passkeys) example: [direct code link](https://github.com/tkhq/sdk/blob/a2bfbf3cbd6040902bbe4c247900ac560be42925/examples/with-federated-passkeys/src/pages/index.tsx#L88) + +* [`@turnkey/webauthn-stamper`](https://www.npmjs.com/package/@turnkey/webauthn-stamper) is a passkey-compatible stamper which integrates seamlessly with `TurnkeyClient`: - ```js - import { WebauthnStamper } from "@turnkey/webauthn-stamper"; - import { TurnkeyClient, createActivityPoller } from "@turnkey/http"; +```ts +import { WebauthnStamper } from "@turnkey/webauthn-stamper"; +import { TurnkeyClient, createActivityPoller } from "@turnkey/http"; - const stamper = new WebAuthnStamper({ - rpId: "your.app.xyz", - }); +const stamper = new WebAuthnStamper({ + rpId: "your.app.xyz", +}); - // New HTTP client able to sign with passkeys - const httpClient = new TurnkeyClient( - { baseUrl: "https://api.turnkey.com" }, - stamper - ); +// New HTTP client able to sign with passkeys +const httpClient = new TurnkeyClient( + { baseUrl: "https://api.turnkey.com" }, + stamper +); - // This will produce a signed request that can be POSTed from anywhere. - // The `signedRequest` has a URL, a POST body, and a "stamp" (HTTP header name and value) - const signedRequest = await httpClient.stampCreatePrivateKeys(...) +// This will produce a signed request that can be POSTed from anywhere. +// The `signedRequest` has a URL, a POST body, and a "stamp" (HTTP header name and value) +const signedRequest = await httpClient.stampCreatePrivateKeys(...) - // Alternatively, you can POST directly from your frontend. - // Our HTTP client will use the webauthn stamper and the configured baseUrl automatically! - const activityPoller = createActivityPoller({ - client: client, - requestFn: client.createPrivateKeys, - }); +// Alternatively, you can POST directly from your frontend. +// Our HTTP client will use the webauthn stamper and the configured baseUrl automatically! +const activityPoller = createActivityPoller({ + client: client, + requestFn: client.createPrivateKeys, +}); - // Contains the activity result; no backend proxy needed! - const completedActivity = await activityPoller({ - type: "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", - // (omitting the rest of this for brevity) - }) - ``` +// Contains the activity result; no backend proxy needed! +const completedActivity = await activityPoller({ + type: "ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2", + // (omitting the rest of this for brevity) +}) +``` -- [`@turnkey/viem`](https://www.npmjs.com/package/@turnkey/viem) is a package wrapping all of the above so that you work directly with Viem without worrying about passkeys. See [this demo](https://github.com/tkhq/sdk/tree/main/examples/with-viem-and-passkeys). +* [`@turnkey/viem`](https://www.npmjs.com/package/@turnkey/viem) is a package wrapping all of the above so that you work directly with Viem without worrying about passkeys. See [this demo](https://github.com/tkhq/sdk/tree/main/examples/with-viem-and-passkeys). Regardless of whether you use our helpers and abstractions, take a look at [our registration and authentication options guide](/authentication/passkeys/options). This will help you choose the right options for your passkey flow. If you have questions, feedback, or find yourself in need of an abstraction or integration that doesn't exist yet, please get in touch with us! You can -- Create an [issue on our SDK repo](https://github.com/tkhq/sdk/issues) -- Join our slack community [here](https://join.slack.com/t/clubturnkey/shared_invite/zt-2837d2isy-gbH60kJ~XnXSSFHiqVOrqw) -- Contact us at +* Create an [issue on our SDK repo](https://github.com/tkhq/sdk/issues) +* Join our slack community [here](https://join.slack.com/t/clubturnkey/shared_invite/zt-31v4yhgw6-PwBzyNsWCCBTk2xft3EoHQ) +* Contact us at [hello@turnkey.com](mailto:hello@turnkey.com) We're here to make this as easy as possible for you and your team! @@ -89,6 +83,6 @@ Turnkey has an open CORS policy for its public API. This means your frontend can How should you decide what to do? Here are some considerations: -- A backend proxy can be useful if you need to inspect and persist activity results. For example: if your users are creating wallets, you might want to persist the addresses. If your users are signing transactions, you might want to broadcast on their behalf. -- Another reason why a backend server could be beneficial is monitoring, feature toggles, and validation: with a proxy you're able to control which requests are proxied and which aren't. You can also perform additional validation before signed requests are forwarded to Turnkey. -- POSTing signed requests directly from your app frontend to Turnkey saves you the burden of running a proxy server, and takes you out of the loop so that your end-users interact directly with Turnkey. This is a "hands-off" approach that can work well if you want to give your end-users maximum flexibility and ownership over their sub-organization. +* A backend proxy can be useful if you need to inspect and persist activity results. For example: if your users are creating wallets, you might want to persist the addresses. If your users are signing transactions, you might want to broadcast on their behalf. +* Another reason why a backend server could be beneficial is monitoring, feature toggles, and validation: with a proxy you're able to control which requests are proxied and which aren't. You can also perform additional validation before signed requests are forwarded to Turnkey. +* POSTing signed requests directly from your app frontend to Turnkey saves you the burden of running a proxy server, and takes you out of the loop so that your end-users interact directly with Turnkey. This is a "hands-off" approach that can work well if you want to give your end-users maximum flexibility and ownership over their sub-organization. diff --git a/docs/documentation/authentication/passkeys/introduction.md b/authentication/passkeys/introduction.mdx similarity index 66% rename from docs/documentation/authentication/passkeys/introduction.md rename to authentication/passkeys/introduction.mdx index 6f667eb1..83e3089c 100644 --- a/docs/documentation/authentication/passkeys/introduction.md +++ b/authentication/passkeys/introduction.mdx @@ -1,28 +1,23 @@ --- -description: Learn about passkeys at a high-level -slug: /authentication/passkeys/introduction -sidebar_position: 1 +title: "Introduction to Passkeys" +description: "Passkeys are born out of a new standard being pushed by major industry players: Apple and Google." --- -# Introduction to passkeys - -Passkeys are born out of a new standard being pushed by major industry players: Apple and Google. - -Google has a great high-level introduction to passkeys at https://developers.google.com/identity/passkeys, and Apple has its own version here: https://developer.apple.com/passkeys +Google has a great high-level introduction to passkeys at [https://developers.google.com/identity/passkeys](https://developers.google.com/identity/passkeys), and Apple has its own version here: [https://developer.apple.com/passkeys](https://developer.apple.com/passkeys) ## TLDR: what are passkeys? From a technical point of view, passkeys are cryptographic key pairs created on end-user devices. Apple and Google have done a great job making these key pairs usable: -- Key generation happens in secure end-user hardware. -- Using passkeys is easy thanks to native browser UIs and cross-device syncing. -- Passkey recovery for users is supported natively by Apple via iCloud Keychain and Google via the Google Password Manager. +* Key generation happens in secure end-user hardware. +* Using passkeys is easy thanks to native browser UIs and cross-device syncing. +* Passkey recovery for users is supported natively by Apple via iCloud Keychain and Google via the Google Password Manager. Passkeys come with big security upgrades compared to traditional passwords: -- Access to passkeys is gated with OS-level biometrics: faceID, touchID, lock screen patterns, and so on. -- Passkeys are bound to the web domain that creates them. This is important to thwart phishing attacks, where an attacker hosts a similar-looking website to steal user credentials. This is doable with passwords; impossible with passkeys. -- Because passkeys rely on public key cryptography, passkeys have two components: a public key and a private key. Private keys are never disclosed to websites or apps, making them a lot harder to steal. Only public keys are sent. To authenticate, passkeys sign messages (with their private keys) and provide signatures as proofs, similar to crypto wallets. +* Access to passkeys is gated with OS-level biometrics: faceID, touchID, lock screen patterns, and so on. +* Passkeys are bound to the web domain that creates them. This is important to thwart phishing attacks, where an attacker hosts a similar-looking website to steal user credentials. This is doable with passwords; impossible with passkeys. +* Because passkeys rely on public key cryptography, passkeys have two components: a public key and a private key. Private keys are never disclosed to websites or apps, making them a lot harder to steal. Only public keys are sent. To authenticate, passkeys sign messages (with their private keys) and provide signatures as proofs, similar to crypto wallets. ## Isn't this similar to Webauthn? @@ -34,8 +29,8 @@ The difference? Passkeys are resident credentials and they can be synced between Synchronization and recovery are both supported natively by Apple and Google: -- With Apple, Passkeys created on one device are synced through [iCloud Keychain](https://support.apple.com/en-us/HT204085) as long as the user is logged in with their Apple ID. Apple covers both syncing and recovery in ["About the security of passkeys"](https://support.apple.com/en-us/102195). For some additional detail, see [this Q&A with the passkey team](https://developer.apple.com/news/?id=21mnmxow). Apple's account recovery process is documented in [this support page](https://support.apple.com/en-us/HT204921). -- With Google, [Google Password Manager](https://passwords.google/) syncs passkeys across devices seamlessly. Google has plans to support syncing more broadly across different operating systems, see [this support summary](https://developers.google.com/identity/passkeys/supported-environments#chrome-passkey-support-summary). Recovery is covered in [this FAQ ("What happens if a user loses their device?")](https://developers.google.com/identity/passkeys/faq#what_happens_if_a_user_loses_their_device): it relies on Google's overall [account recovery process](https://support.google.com/accounts/answer/7682439?hl=en) because passkeys are attached to Google accounts. +* With Apple, Passkeys created on one device are synced through [iCloud Keychain](https://support.apple.com/en-us/HT204085) as long as the user is logged in with their Apple ID. Apple covers both syncing and recovery in ["About the security of passkeys"](https://support.apple.com/en-us/102195). For some additional detail, see [this Q\&A with the passkey team](https://developer.apple.com/news/?id=21mnmxow). Apple's account recovery process is documented in [this support page](https://support.apple.com/en-us/HT204921). +* With Google, [Google Password Manager](https://passwords.google/) syncs passkeys across devices seamlessly. Google has plans to support syncing more broadly across different operating systems, see [this support summary](https://developers.google.com/identity/passkeys/supported-environments#chrome-passkey-support-summary). Recovery is covered in [this FAQ ("What happens if a user loses their device?")](https://developers.google.com/identity/passkeys/faq#what_happens_if_a_user_loses_their_device): it relies on Google's overall [account recovery process](https://support.google.com/accounts/answer/7682439?hl=en) because passkeys are attached to Google accounts. ## OS and browser support @@ -47,18 +42,15 @@ Support also varies by operating system: [this matrix](https://passkeys.dev/devi We believe **it's time to move away from passwords** so we've built Turnkey without them. When you authenticate to Turnkey you'll be prompted to create a new passkey: -

- Authenticator selection on Turnkey - Passkey prompt on Turnkey -

+ + + Authenticator selection on Turnkey + + + + Passkey prompt on Turnkey + + Authentication to Turnkey requires a passkey signature. No password needed! diff --git a/docs/documentation/authentication/passkeys/native.md b/authentication/passkeys/native.mdx similarity index 74% rename from docs/documentation/authentication/passkeys/native.md rename to authentication/passkeys/native.mdx index 74d816d2..e6b44368 100644 --- a/docs/documentation/authentication/passkeys/native.md +++ b/authentication/passkeys/native.mdx @@ -1,24 +1,19 @@ --- -description: See how passkeys integrate into native applications on iOS and Android -slug: /authentication/passkeys/native -sidebar_position: 4 +title: "Native Passkeys" +description: "If you're unfamiliar with passkeys broadly, head to for an overview. TL;DR: passkeys are cryptographic key pairs generated and stored on secure hardware. Typically this is your Mac's or iPhone's , your Android's , or an external security key plugged in via USB." --- -# Native passkeys - -If you're unfamiliar with passkeys broadly, head to [this introduction](./introduction.md) for an overview. TL;DR: passkeys are cryptographic key pairs generated and stored on secure hardware. Typically this is your Mac's or iPhone's [secure enclave](https://support.apple.com/guide/security/secure-enclave-sec59b0b31ff/web), your Android's [Titan M2 chip](https://security.googleblog.com/2021/10/pixel-6-setting-new-standard-for-mobile.html), or an external security key plugged in via USB. - -- Registration ("sign up") creates a new key pair: this is your passkey -- Authentication ("sign in") uses an existing passkey to sign a message, proving ownership of the associated private key stored on your device. +* Registration ("sign up") creates a new key pair: this is your passkey +* Authentication ("sign in") uses an existing passkey to sign a message, proving ownership of the associated private key stored on your device. ## Passkeys on the Web Creating and using passkeys on the web is straightforward: browsers offer APIs to do it! -- `navigator.credentials.create` creates a passkey -- `navigator.credentials.get` prompts the user to select a passkey to sign a message +* `navigator.credentials.create` creates a passkey +* `navigator.credentials.get` prompts the user to select a passkey to sign a message -And this doesn't require a backend. Here's a demo proving it: https://passkeyapp.tkhqlabs.xyz/ +And this doesn't require a backend. Here's a demo proving it: [https://passkeyapp.tkhqlabs.xyz/](https://passkeyapp.tkhqlabs.xyz/) An important security feature of passkeys: they're **domain-bound** to prevent phishing. In other words: passkeys created on `passkeyapp.tkhqlabs.xyz` won't be usable on `turnkey.com` for example. Browsers prevent this. @@ -32,8 +27,8 @@ In the Android ecosystem the `CredentialManager` supports creating and using pas iOS APIs to create and use passkeys are available as well: -- `ASAuthorizationPlatformPublicKeyCredentialProvider(…).createCredentialRegistrationRequest` for passkey creation -- `ASAuthorizationPlatformPublicKeyCredentialProvider(…).createCredentialAssertionRequest` for passkey usage +* `ASAuthorizationPlatformPublicKeyCredentialProvider(…).createCredentialRegistrationRequest` for passkey creation +* `ASAuthorizationPlatformPublicKeyCredentialProvider(…).createCredentialAssertionRequest` for passkey usage See [these docs](https://developer.apple.com/documentation/authenticationservices/asauthorizationplatformpublickeycredentialprovider) for more info. And [this app](https://github.com/r-n-o/shiny) for a mini demo. @@ -59,10 +54,9 @@ If you're looking for a concrete example, head to [this repository](https://gith Passkeys on native apps aren't app-bound, they're **domain** bound just like web passkeys. This may come as a surprise: you'll have to configure a web domain to use passkeys natively! Configuration is done separately per ecosystem, but the idea is the same: -- iOS expects a JSON file at the domain root (`/.well-known -/apple-app-site-association`) : [example](https://github.com/r-n-o/passkeyapp/blob/main/http/.well-known/apple-app-site-association) -- Android expects a JSON file at the domain root (`/.well-known/assetlinks.json`): [example](https://github.com/r-n-o/passkeyapp/blob/main/http/.well-known/assetlinks.json) +* iOS expects a JSON file at the domain root (`/.well-known /apple-app-site-association`) : [example](https://github.com/r-n-o/passkeyapp/blob/main/http/.well-known/apple-app-site-association) +* Android expects a JSON file at the domain root (`/.well-known/assetlinks.json`): [example](https://github.com/r-n-o/passkeyapp/blob/main/http/.well-known/assetlinks.json) -This unlocks interesting flows where users use their web-created passkeys in a "companion" native app, or vice-versa. For example: a native app linked to the wallet.tx.xyz domain would allow users to log into their account from a native mobile app _using their web-created passkey_ as long as they're synced properly. +This unlocks interesting flows where users use their web-created passkeys in a "companion" native app, or vice-versa. For example: a native app linked to the wallet.tx.xyz domain would allow users to log into their account from a native mobile app *using their web-created passkey* as long as they're synced properly. Note that these associations are "many-to-many": a website can link multiple associated apps, and a single native application can choose to create passkeys for multiple domains, via a dropdown for example. However (as far as we know) a single passkey is always bound to a single web domain: it can't be bound to multiple web domains. diff --git a/docs/documentation/authentication/passkeys/options.md b/authentication/passkeys/options.mdx similarity index 65% rename from docs/documentation/authentication/passkeys/options.md rename to authentication/passkeys/options.mdx index 373d20e6..5af48974 100644 --- a/docs/documentation/authentication/passkeys/options.md +++ b/authentication/passkeys/options.mdx @@ -1,13 +1,8 @@ --- -description: Learn about registration and authentication options -slug: /authentication/passkeys/options -sidebar_position: 3 +title: "Passkey Options" +description: "Whether you use the raw browser APIs or one of our helpers you'll have flexibility to set your own registration and authentication options. This page provides an overview and some recommendations related to these options." --- -# Passkey options - -Whether you use the raw browser APIs or one of our helpers you'll have flexibility to set your own registration and authentication options. This page provides an overview and some recommendations related to these options. - ## Registration options Mozilla has good (but lengthy) documentation on each option: [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/API/CredentialsContainer/create). Below we detail the most relevant options you'll want to think about. @@ -20,12 +15,9 @@ This is the challenge signed by the end-user for registration. During registrati Number of seconds before "giving up". The browser will simply show a timeout popup: -

- authenticatorAttachment unspecified -

+ + Timeout popup + This UI isn't very helpful, so we recommend making the timeout long (5 minutes). The less your users see this, the better. @@ -35,28 +27,21 @@ The `rp` options is an object with 2 fields: `id` and `name`. `rp.id` (aka RPID) should be your app top-level domain. For example, if your app is hosted on `https://your.app.xyz` the RPID should be `app.xyz` unless you have good reasons to do otherwise (see below). -
- Reasons to set RPID to specific sub-domains - -`rp.id`, or RPID, is a way to identify the website a passkey is associated with. Once set at registration time, it **determines the set of origins on which the passkey may be be used**. The WebAuthn spec states that the RPID must be a “registrable domain suffix of, or equal to” the current domain. If the page creating a passkey is hosted at `https://your.app.xyz`, the RPID can thus be "your.app.xyz" or "app.xyz". - -A passkey with RPID "your.app.xyz" cannot be used on `https://www.app.xyz` or `https://foo.app.xyz`. However a passkey created with RPID "app.xyz" will be usable on all `https://*.app.xyz` sub-domains: `https://your.app.xyz`, `https://www.app.xyz`, `https://foo.app.xyz`, and so on. Hence our general recommendation above to set `app.xyz` (top-level domain) as the RPID to maximize flexibility. + + `rp.id`, or RPID, is a way to identify the website a passkey is associated with. Once set at registration time, it **determines the set of origins on which the passkey may be be used**. The [WebAuthn spec](https://www.w3.org/TR/webauthn-2/#relying-party-identifier) states that the RPID must be a “registrable domain suffix of, or equal to” the current domain. If the page creating a passkey is hosted at `https://your.app.xyz`, the RPID can thus be "your.app.xyz" or "app.xyz". -A reason why you might want to set the RPID to "your.app.xyz" instead of "app.xyz" like recommended above is extra security: if you are worried about user passkeys being usable across all your sub-domains, it makes sense to scope passkeys to the sub-domain they're meant to be used on, and only that sub-domain. + A passkey with RPID "your.app.xyz" **cannot** be used on `https://www.app.xyz` or `https://foo.app.xyz`. However a passkey created with RPID "app.xyz" **will** be usable on all `https://*.app.xyz` sub-domains: `https://your.app.xyz`, `https://www.app.xyz`, `https://foo.app.xyz`, and so on. Hence our general recommendation above to set `app.xyz` (top-level domain) as the RPID to maximize flexibility. -If you scope passkeys to a specific sub-domain, be aware that migrating your app to a different sub-domain later will require a migration process where users have to re-enroll themselves by creating new passkeys on the new sub-domain. Passkeys cannot be transferred from one RPID to another. + A reason why you might want to set the RPID to "your.app.xyz" instead of "app.xyz" like recommended above is extra security: if you are worried about user passkeys being usable across all your sub-domains, it makes sense to scope passkeys to the sub-domain they're meant to be used on, and only that sub-domain. -
+ If you scope passkeys to a specific sub-domain, be aware that migrating your app to a different sub-domain later will require a migration process where users have to re-enroll themselves by creating new passkeys on the new sub-domain. Passkeys cannot be transferred from one RPID to another. + `rp.id` will show up in the initial registration popup: -

- RPID in registration prompt -

+ + RPID in registration prompt + `rp.name` doesn't show up in the popup so can be set to anything. We recommend setting it to the correctly capitalized name of your app, in case browsers start showing it in their native UIs in the future. @@ -74,12 +59,15 @@ The integers `-7` and `-257` are algorithm identifiers for ES256 (aka P256) and The `user` field has three sub-fields: -- `id`: also known as "user handle", isn't visible to the end-user. We **strongly recommend setting this to a random value** (e.g. `const id = new Uint8Array(32); crypto.getRandomValues(id)`) to make sure a new passkey is created. Be aware: **if you accidentally set this value to an existing user handle, the corresponding passkey will be overridden!** [This section of spec](https://www.w3.org/TR/webauthn-2/#dictionary-user-credential-params) is clear on the matter: "the user handle ought not be a constant value across different accounts, even for non-discoverable credentials". -- `name`: this will show up in the passkey list modal (see screenshot below). We recommend setting this to something the user will recognize: their email, the name of your app, or potentially leave this up to the user: -

- RPID in registration prompt -

-- `displayName`: as far as we can tell this doesn't show up in current browser UIs. It might show up in future iterations so it's best to populate this with the same value as `name`. +* `id`: also known as "user handle", isn't visible to the end-user. We **strongly recommend setting this to a random value** (e.g. `const id = new Uint8Array(32); crypto.getRandomValues(id)`) to make sure a new passkey is created. Be aware: **if you accidentally set this value to an existing user handle, the corresponding passkey will be overridden!** [This section of spec](https://www.w3.org/TR/webauthn-2/#dictionary-user-credential-params) is clear on the matter: "the user handle ought not be a constant value across different accounts, even for non-discoverable credentials". + +* `name`: this will show up in the passkey list modal (see screenshot below). We recommend setting this to something the user will recognize: their email, the name of your app, or potentially leave this up to the user: + + + User name and display name in passkey list + + +* `displayName`: as far as we can tell this doesn't show up in current browser UIs. It might show up in future iterations so it's best to populate this with the same value as `name`. ### `authenticatorSelection` @@ -89,10 +77,10 @@ This option has lots of consequences for UX, and it has many sub-options, outlin This option, if set, restricts the type of authenticators that can be registered. See the table below for the values this option can take and their effect on registration prompts (captured via Chrome on a MacBook Pro). -| Empty (default) | `platform` | `cross-platform` | -| -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | -| If you want broad compatibility, leave this option empty, and the browser UI will allow for both internal and external passkeys. | If set to `platform`, only internal authenticators (face ID, touch ID, and so on) can be registered. | If set to `cross-platform`, only passkeys from other devices or attached via USB are allowed. | -| authenticatorAttachment unspecified | authenticatorAttachment set to platform | authenticatorAttachment set to cross-platform | +| Empty (default) | `platform` | `cross-platform` | +| -------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| If you want broad compatibility, leave this option empty, and the browser UI will allow for both internal and external passkeys. | If set to `platform`, only internal authenticators (face ID, touch ID, and so on) can be registered. | If set to `cross-platform`, only passkeys from other devices or attached via USB are allowed. | +| authenticatorAttachment unspecified | authenticatorAttachment set to platform | authenticatorAttachment set to cross-platform | #### `requireResidentKey` and `residentKey` @@ -104,9 +92,9 @@ Important note: the default for `requireResidentKey` (`discouraged`) results in "User verification" refers to mechanisms on the authenticators themselves such as PIN codes or biometric/fingerprint readers. This flag can be set to: -- `discouraged`: yubikey PINs won't be required even if the device technically supports it. We've found that for TouchID/FaceID, authentication will still be required however. -- `preferred`: yubikey PINs and other authentication mechanisms will be required if supported, but devices without them will be accepted. -- `required`: authenticators without user verification support won't be accepted. +* `discouraged`: yubikey PINs won't be required even if the device technically supports it. We've found that for TouchID/FaceID, authentication will still be required however. +* `preferred`: yubikey PINs and other authentication mechanisms will be required if supported, but devices without them will be accepted. +* `required`: authenticators without user verification support won't be accepted. To maximize compatibility we recommend setting `userVerification` to "discouraged" or "preferred" because some authenticators do not support user verification. @@ -132,30 +120,23 @@ List of objects restricting which credentials can be used during authentication. Each object in this list has an ID (the credential ID) and a list of transports (e.g. "hybrid", "internal", "usb", etc). The `transports` list is **optional** but results in better, more targeted prompts. For example, here are screenshot of targeted prompts captured on Chrome, on a MacBook laptop: -| `transports: ["internal"]` | `transports: ["usb"]` | `transports: ["hybrid"]` | -| ------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -| authentication prompt with transports: internal | authentication prompt with transports: usb | authentication prompt with transport: hybrid | +| `transports: ["internal"]` | `transports: ["usb"]` | `transports: ["hybrid"]` | +| -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- | +| authentication prompt with transports: internal | authentication prompt with transports: usb | authentication prompt with transport: hybrid | The credential ID needs to be passed as a buffer but is returned from registration as a base64-encoded value: make sure to decode it (in JavaScript: `Buffer.from(storedCredentialId, "base64")`) to avoid issues. If the wrong credential ID is specified, `transports: ["internal"]` is set, browsers error right away because they can enumerate internal credentials. Chrome, for example, displays the following error: -

- Chrome error when no matching passkey has been found for the provided Credential ID -

+ + Chrome error when no matching passkey has been found for the provided Credential ID + However, if the wrong credential ID is specified without `transports` set (or with other-than-internal `transports` set), browsers won't error right away because they can't enumerate external credentials. They will display an error once the user has pressed their security key or gone through the cross-device passkey flow: -

- Chrome error when the credential ID used by the user is not in the allowCredentials list -

+ + Chrome error when the credential ID used by the user is not in the allowCredentials list + ### `attestation` diff --git a/docs/documentation/authentication/sessions.md b/authentication/sessions.mdx similarity index 53% rename from docs/documentation/authentication/sessions.md rename to authentication/sessions.mdx index 45df9b38..caf81a8e 100644 --- a/docs/documentation/authentication/sessions.md +++ b/authentication/sessions.mdx @@ -1,17 +1,14 @@ --- -sidebar_position: 5 -description: Learn about user sessions on Turnkey -slug: /authentication/sessions +title: "Sessions" +description: "Turnkey sessions allow a user to take multiple, contiguous actions in a defined period of time." --- -# Sessions - ## What is a session? -Turnkey sessions allow a user to take multiple, contiguous actions in a defined period of time. Such actions can be divided into two buckets: +Such actions can be divided into two buckets: -- Read operations: Retrieving data (e.g., viewing wallet balances) -- Write operations: Modifying data or performing sensitive actions (e.g., signing transactions) +* Read operations: Retrieving data (e.g., viewing wallet balances) +* Write operations: Modifying data or performing sensitive actions (e.g., signing transactions) ## How can I create a session? @@ -25,9 +22,9 @@ By default, a parent organization has read access to all of its sub-organization #### Client side access -Separately, if you would like the client to have all read requests encapsulated (instead of reading data via a proxy like in the previous approach), the client can initiate a read-only session via a [CreateReadOnlySession activity](https://docs.turnkey.com/api#tag/Sessions/operation/CreateReadOnlySession). This activity returns a session string that, if passed into an HTTP request via `X-Session` header, gives permission to perform reads. Note that because this is an activity performed by an end-user, it requires authentication (e.g. via passkey). +Separately, if you would like the client to have all read requests encapsulated (instead of reading data via a proxy like in the previous approach), the client can initiate a read-only session via a [CreateReadOnlySession activity](/api-reference/sessions/create-read-only-session). This activity returns a session string that, if passed into an HTTP request via `X-Session` header, gives permission to perform reads. Note that because this is an activity performed by an end-user, it requires authentication (e.g. via passkey). -If you’d like to do this via our SDK abstractions, you can leverage the [login](https://github.com/tkhq/sdk/blob/6b3ea14d1184c5394449ecaad2b0f445e373823f/packages/sdk-browser/src/sdk-client.ts#L231-L255)1 method, which creates a `CreateReadOnlySession` activity under the hood. It stores the resulting session string in [Local Storage](https://github.com/tkhq/sdk/blob/6b3ea14d1184c5394449ecaad2b0f445e373823f/packages/sdk-browser/src/sdk-client.ts#L242-L252)2, and subsequent requests to fetch data from Turnkey injects the session stored here at [call time](https://github.com/tkhq/sdk/blob/6b3ea14d1184c5394449ecaad2b0f445e373823f/packages/sdk-browser/src/__generated__/sdk-client-base.ts#L45-L47)3 within `@turnkey/sdk-browser`. +If you’d like to do this via our SDK abstractions, you can leverage the [login](https://github.com/tkhq/sdk/blob/6b3ea14d1184c5394449ecaad2b0f445e373823f/packages/sdk-browser/src/sdk-client.ts#L231-L255)1 method, which creates a `CreateReadOnlySession` activity under the hood. It stores the resulting session string in [Local Storage](https://github.com/tkhq/sdk/blob/6b3ea14d1184c5394449ecaad2b0f445e373823f/packages/sdk-browser/src/sdk-client.ts#L242-L252)2, and subsequent requests to fetch data from Turnkey injects the session stored here at [call time](https://github.com/tkhq/sdk/blob/6b3ea14d1184c5394449ecaad2b0f445e373823f/packages/sdk-browser/src/__generated__/sdk-client-base.ts#L45-L47)3 within `@turnkey/sdk-browser`. ### Read-write sessions @@ -35,11 +32,11 @@ In contrast to read-only sessions, a read-write session makes sense when a user #### Creating a read-write session -Developers can leverage the [CreateReadWriteSession](https://docs.turnkey.com/api#tag/Sessions/operation/CreateReadWriteSession) activity, which requires a target embedded key and returns a credential bundle. This is a pattern that many core, secure flows follow, including Email Auth, and OTP Auth. See [documentation](/authentication/email) for more details. +Developers can leverage the [CreateReadWriteSession](/api-reference/sessions/create-read-write-session) activity, which requires a target embedded key and returns a credential bundle. This is a pattern that many core, secure flows follow, including Email Auth, and OTP Auth. See [documentation](/authentication/email#mechanism-and-cryptographic-details) for more details. -

- -

+ + Read-write sessions + As illustrated above, once you have a target embedded key in place on the client side, you can call `CreateReadWriteSession`, get the resulting credential bundle, and decrypt it on the client side using the “TEK”. Upon decryption, the result is a usable Turnkey API key that can be used to make both read and write requests. @@ -53,17 +50,17 @@ Your next question might be: where can I get the target embedded key? There are #### iframes: -Turnkey hosts an iframe for use cases such as this one at https://auth.turnkey.com (see [here](https://github.com/tkhq/frames/tree/main/auth) for code implementation). It’s to be used in conjunction with our [@turnkey/iframe-stamper](https://docs.turnkey.com/sdks/advanced/iframe-stamper), but note that some complexity can be abstracted away if using @turnkey/sdk-react. See this [code example](https://docs.turnkey.com/embedded-wallets/code-examples/create-passkey-session) for more. +Turnkey hosts an iframe for use cases such as this one at [https://auth.turnkey.com](https://auth.turnkey.com) (see [here](https://github.com/tkhq/frames/tree/main/auth) for code implementation). It’s to be used in conjunction with our [@turnkey/iframe-stamper](/sdks/advanced/iframe-stamper), but note that some complexity can be abstracted away if using @turnkey/sdk-react. See this [code example](/embedded-wallets/code-examples/create-passkey-session) for more. The iframe is responsible for holding the “TEK” mentioned in the previous diagram. In addition to housing the TEK, it exposes some methods to be able to interact with (but not extract!) the TEK. The end result is that the iframe can safely and securely sign requests to Turnkey. If you would like to take a look at lower level implementation details, see [here](https://github.com/tkhq/sdk/blob/main/packages/iframe-stamper/src/index.ts). There are a few considerations to note when using sessions with iframes: -- Sessions only last as long as the iframe is maintained on the browser -- On desktop, this generally is as long as the user doesn’t completely quit the browser -- On mobile, specifically iOS devices, this behavior is much more finicky as iOS is aggressive in clearing out data contained within iframes -- In either case, sessions are indeed shared across different browser tabs and windows -- May be more difficult to set up to use in conjunction with React Native or other frameworks +* Sessions only last as long as the iframe is maintained on the browser +* On desktop, this generally is as long as the user doesn’t completely quit the browser +* On mobile, specifically iOS devices, this behavior is much more finicky as iOS is aggressive in clearing out data contained within iframes +* In either case, sessions are indeed shared across different browser tabs and windows +* May be more difficult to set up to use in conjunction with React Native or other frameworks #### Local Storage: @@ -71,9 +68,9 @@ Another potential host for a TEK is directly in Local Storage. We’ve created l Here are some considerations for using Local Storage: -- Generally more durable than using iframes in various contexts (i.e. web on both desktop and mobile) -- Can be used in other settings such as React Native, Flutter, etc. -- As mentioned, the developer has complete control over the target embedded key. As a result, it’s important to manage this credential with caution. +* Generally more durable than using iframes in various contexts (i.e. web on both desktop and mobile) +* Can be used in other settings such as React Native, Flutter, etc. +* As mentioned, the developer has complete control over the target embedded key. As a result, it’s important to manage this credential with caution. For an example that leverages Local Storage with Email Auth, see [here](https://github.com/tkhq/sdk/tree/main/examples/email-auth-local-storage). @@ -81,53 +78,48 @@ For an example that leverages Local Storage with Email Auth, see [here](https:// Another option is to create an API key and store it directly within Local Storage. However, this is a riskier setup than via TEK (as mentioned in the above Local Storage section), as anyone who is able to access this client-side API key has full access to a User. - - ### Sessions FAQ - -#### How can I refresh a session? - -Once a user has a valid session, it is trivial to use that session to create a new session. It is possible to reuse the same loginWithReadWriteSession abstraction, as this will create a brand new session and automatically store the resulting credential bundle in local storage. - -#### How can I delete a session? - -In order to delete a session, simply remove all user-related artifacts from Local Storage. See implementation in context [here](https://github.com/tkhq/sdk/blob/9e9943387123d077fa3b7f38ef3be007291a2c8a/packages/sdk-browser/src/sdk-client.ts#L242-L255). - -```javascript -/** - * Clears out all data pertaining to a user session. - * - * @returns {Promise} - */ -logoutUser = async (): Promise => { - await removeStorageValue(StorageKeys.AuthBundle); // DEPRECATED - await removeStorageValue(StorageKeys.CurrentUser); - await removeStorageValue(StorageKeys.UserSession); - await removeStorageValue(StorageKeys.ReadWriteSession); - - return true; -}; -``` - -#### How long are sessions? - -The expiration of session keys can be specified to any amount of time using the `expirationSeconds` parameter. The default length is 900 seconds (15 minutes). - -#### How many session keys can be active at once? - -A user can have up to 10 expiring API keys at any given time. If you create an expiring API key that exceeds that limit, Turnkey automatically deletes one of your existing keys using the following priority: - -- Expired API keys are deleted first -- If no expired keys exist, the oldest unexpired key is deleted - + + + Once a user has a valid session, it is trivial to use that session to create a new session. It is possible to reuse the same loginWithReadWriteSession abstraction, as this will create a brand new session and automatically store the resulting credential bundle in local storage. + + + In order to delete a session, simply remove all user-related artifacts from Local Storage. See implementation in context [here](https://github.com/tkhq/sdk/blob/9e9943387123d077fa3b7f38ef3be007291a2c8a/packages/sdk-browser/src/sdk-client.ts#L242-L255). + + ```ts + /** + * Clears out all data pertaining to a user session. + * + * @returns {Promise} + */ + logoutUser = async (): Promise => { + await removeStorageValue(StorageKeys.AuthBundle); // DEPRECATED + await removeStorageValue(StorageKeys.CurrentUser); + await removeStorageValue(StorageKeys.UserSession); + await removeStorageValue(StorageKeys.ReadWriteSession); + + return true; + }; + ``` + + + The expiration of session keys can be specified to any amount of time using the `expirationSeconds` parameter. The default length is 900 seconds (15 minutes). + + + A user can have up to 10 expiring API keys at any given time. If you create an expiring API key that exceeds that limit, Turnkey automatically deletes one of your existing keys using the following priority: + + * Expired API keys are deleted first + * If no expired keys exist, the oldest unexpired key is deleted If you are looking to invalidate existing sessions, you can use the `invalidateExisting` parameter for Email Auth and OTP Auth activities. This will clear all existing session keys. - -#### Can I use the same sessions implementation for web and mobile? - + + + This is not recommended, because: This is not recommended, because: -- iOS Safari handles iframes differently. Specifically, it very aggressively evicts data stored within the iframe's local storage. -- React Native doesn’t support iframes natively at all -- Mobile browsers have different storage behaviors generally +* iOS Safari handles iframes differently. Specifically, it very aggressively evicts data stored within the iframe's local storage. +* React Native doesn’t support iframes natively at all +* Mobile browsers have different storage behaviors generally Instead, implement platform-specific session management using Local Storage for mobile. + + diff --git a/docs/documentation/authentication/sms.mdx b/authentication/sms.mdx similarity index 69% rename from docs/documentation/authentication/sms.mdx rename to authentication/sms.mdx index 41668dce..5b673895 100644 --- a/docs/documentation/authentication/sms.mdx +++ b/authentication/sms.mdx @@ -1,14 +1,9 @@ --- -title: SMS Authentication -sidebar_label: SMS -sidebar_position: 4 -slug: /authentication/sms +title: "SMS Authentication" +description: "SMS authentication enables users to authenticate their Turnkey account using their phone number via a 6-digit one-time password (OTP). When authenticated, users receive an expiring API key stored in memory within an iframe, which functions like a session key to access their wallet." +sidebarTitle: "SMS" --- -# SMS Authentication - -SMS authentication enables users to authenticate their Turnkey account using their phone number via a 6-digit one-time password (OTP). When authenticated, users receive an expiring API key stored in memory within an iframe, which functions like a session key to access their wallet. - ## How It Works SMS authentication uses two activities: @@ -24,7 +19,9 @@ To start SMS authentication, create an activity with `ACTIVITY_TYPE_INIT_OTP_AUT - `otpType`: must be set to `"OTP_TYPE_SMS"` - `contact`: user's phone number (must be previously approved and attached to the user's organization data) -- `userIdentifier`: optional parameter for rate limiting SMS OTP requests per user. We recommend generating this serverside based on the user's IP address or public key. +- `userIdentifier`: optional parameter for rate limiting SMS OTP requests per user. + We recommend generating this server-side based on the user's IP address or public key. + See the [OTP Rate Limits](#otp-rate-limits) section below for more details. ### Verifying the OTP @@ -41,9 +38,7 @@ Once the user receives their code, use `ACTIVITY_TYPE_OTP_AUTH` with these param SMS authentication requires proper permissions through policies or parent organization status. -:::note -Non-paying accounts are limited to **50 SMS messages** per month. -::: +Non-paying accounts are limited to **50 SMS messages** per month. ## Enabling/Disabling SMS Auth @@ -51,7 +46,7 @@ Non-paying accounts are limited to **50 SMS messages** per month. SMS authentication is disabled by default. Enable it using `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE`: -```sh +```bash turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", @@ -72,3 +67,11 @@ turnkey request --host api.turnkey.com --path /public/v1/submit/set_organization - Users are limited to 10 long-lived API keys and 10 expiring API keys - When the expiring API key limit is reached, the oldest key is automatically discarded + +## OTP Rate Limits + +In order to safeguard users, Turnkey enforces rate limits for OTP auth activities. If a `userIdentifier` parameter is provided, the following limits are enforced: + +- 3 requests per 3 minutes per unique `userIdentifier` +- 3 retries max per code, after which point that code will be locked +- 3 active codes per user, each with a 5 minute TTL diff --git a/docs/documentation/authentication/social-logins.mdx b/authentication/social-logins.mdx similarity index 67% rename from docs/documentation/authentication/social-logins.mdx rename to authentication/social-logins.mdx index 7bcc0b0c..5c23a36c 100644 --- a/docs/documentation/authentication/social-logins.mdx +++ b/authentication/social-logins.mdx @@ -1,62 +1,54 @@ --- -title: Social Logins -sidebar_label: Social Logins -sidebar_position: 3 -slug: /authentication/social-logins +title: "Social Logins" +description: "Social logins provide a familiar and convenient way for users to access applications using their existing accounts from popular platforms like Google, Apple, or Facebook. Under the hood, this functionality is powered by OAuth - a robust authentication protocol that enables secure user verification through OpenID Connect ([OIDC](https://openid.net/specs/openid-connect-core-1_0.html)) tokens. This feature is available exclusively for sub-organization users." --- -# Social Logins +Similar to [email auth](/authentication/email), social login authentication is ideal for users who prefer not to manage API keys or [passkeys](/authentication/passkeys/introduction) directly. This makes it particularly well-suited for onboarding users who are comfortable with traditional web2-style accounts but may be unfamiliar with cryptographic keys and credentials. An example implementing social login authentication for an organization can be found in our SDK repo [here](https://github.com/tkhq/sdk/tree/main/examples/oauth). -Social logins provide a familiar and convenient way for users to access applications using their existing accounts from popular platforms -like Google, Apple, or Facebook. Under the hood, this functionality is powered by OAuth - a robust authentication protocol that enables -secure user verification through OpenID Connect ([OIDC](https://openid.net/specs/openid-connect-core-1_0.html)) tokens. This feature is -available exclusively for sub-organization users. +## Roles and responsibilities -Similar to [email auth](email), social login authentication is ideal for users who prefer not to manage API keys or -[passkeys](/authentication/passkeys/introduction) directly. This makes it particularly well-suited for onboarding users who are comfortable -with traditional web2-style accounts but may be unfamiliar with cryptographic keys and credentials. An example implementing -social login authentication for an organization can be found in our SDK repo [here](https://github.com/tkhq/sdk/tree/main/examples/oauth). +* **Turnkey**: runs verifiable infrastructure to create credentials and verify OIDC tokens -## Roles and responsibilities +* **Parent**: that's you! **For the rest of this guide we'll assume you, the reader, are a Turnkey customer**. We assume that you have: + + * an existing Turnkey organization (we'll refer to this organization as "the parent organization") + * a web application frontend (we'll refer to this as just "app" or "web app") + * a backend able to sign and POST Turnkey activities ("backend" or "parent backend") + +* **End-User**: the end-user is a user of your web app. They have an account with Google. -- **Turnkey**: runs verifiable infrastructure to create credentials and verify OIDC tokens -- **Parent**: that's you! **For the rest of this guide we'll assume you, the reader, are a Turnkey customer**. We assume that you have: - - an existing Turnkey organization (we'll refer to this organization as "the parent organization") - - a web application frontend (we'll refer to this as just "app" or "web app") - - a backend able to sign and POST Turnkey activities ("backend" or "parent backend") -- **End-User**: the end-user is a user of your web app. They have an account with Google. -- **OIDC Provider**: a provider able to authenticate your End-Users and provide OIDC tokens as proof. We'll use [Google](https://developers.google.com/identity/openid-connect/openid-connect) as an example. +* **OIDC Provider**: a provider able to authenticate your End-Users and provide OIDC tokens as proof. We'll use [Google](https://developers.google.com/identity/openid-connect/openid-connect) as an example. ## OAuth step-by-step ### Registration (signup) -

- OAuth signup flow -

+ + OAuth signup flow + 1. **End-User** enters the signup flow on the app, gets redirected to Google for authentication. -1. Upon completion, the **Parent**'s backend receives the OIDC token authenticating **End-User**. -1. This token is used inside of a `CREATE_SUB_ORGANIZATION` activity to register Google as the Oauth provider under the root user. -1. **Turnkey** verifies the OIDC token and creates a new sub-organization. +2. Upon completion, the **Parent**'s backend receives the OIDC token authenticating **End-User**. +3. This token is used inside of a `CREATE_SUB_ORGANIZATION` activity to register Google as the Oauth provider under the root user. +4. **Turnkey** verifies the OIDC token and creates a new sub-organization. The user is now registered: a sub-organization under the parent organization has been created with a a root user, authenticated via an OAuth Provider. Concretely: -- `issuer` is set to `https://accounts.google.com` -- `audience` is set to `` (your Oauth app ID) -- `subject` is set `` (the user ID of `End-User` on Google's side) +* `issuer` is set to `https://accounts.google.com` +* `audience` is set to `` (your Oauth app ID) +* `subject` is set `` (the user ID of `End-User` on Google's side) ### Authentication (login) -

- OAuth login flow -

+ + OAuth login flow + 1. **End-User** enters the login flow on the app, gets redirected to Google for authentication. -1. Upon completion, `Parent backend` receives the OIDC token authenticating **End-User**. -1. This token is used inside of an `OAUTH` activity, signed by the **Parent**'s backend. -1. **Turnkey** verifies the OIDC token and encrypts an expiring API key credential to **End-User**. -1. **End-User** decrypts the credential. +2. Upon completion, `Parent backend` receives the OIDC token authenticating **End-User**. +3. This token is used inside of an `OAUTH` activity, signed by the **Parent**'s backend. +4. **Turnkey** verifies the OIDC token and encrypts an expiring API key credential to **End-User**. +5. **End-User** decrypts the credential. The user is now authenticated and able to perform Turnkey activities. @@ -68,17 +60,17 @@ We've designed a new secure enclave to fetch TLS content securely and bring [non To verify an OIDC token, other Turnkey enclaves receive the OIDC token as well as: -- the signed content of the issuer's OpenId configuration. OpenId configuration **must** be hosted under `/.well-known/openid-configuration` for each domain. For Google for example, the issuer configuration is at [`accounts.google.com/.well-known/openid-configuration`](https://accounts.google.com/.well-known/openid-configuration). This JSON document contains, among other thing, a `jwksUri` key. The value for this key is a URL hosting the list of currently-valid OIDC token signers. -- the signed content of the issuer's `jwksUri` (e.g., for Google, the `jwksUri` is [`googleapis.com/oauth2/v3/cert`](https://www.googleapis.com/oauth2/v3/certs)). This is a list of public keys against which the secure enclave can verify tokens. Note: **these public keys rotate periodically** (every ~6hrs), hence it's not possible to hardcode these public keys in our secure enclave code directly. We have to fetch them dynamically! +* the signed content of the issuer's OpenId configuration. OpenId configuration **must** be hosted under `/.well-known/openid-configuration` for each domain. For Google for example, the issuer configuration is at [`accounts.google.com/.well-known/openid-configuration`](https://accounts.google.com/.well-known/openid-configuration). This JSON document contains, among other thing, a `jwksUri` key. The value for this key is a URL hosting the list of currently-valid OIDC token signers. +* the signed content of the issuer's `jwksUri` (e.g., for Google, the `jwksUri` is [`googleapis.com/oauth2/v3/cert`](https://www.googleapis.com/oauth2/v3/certs)). This is a list of public keys against which the secure enclave can verify tokens. Note: **these public keys rotate periodically** (every \~6hrs), hence it's not possible to hardcode these public keys in our secure enclave code directly. We have to fetch them dynamically! With all of that, an enclave can independently verify an OIDC token without making outbound requests. Once the token is parsed and considered authentic, our enclaves match the `iss`, `aud` and `sub` attributes against the registered OAuth providers on the Turnkey sub-organization. We also check `exp` to make sure the OIDC token is not expired, and the `nonce` attribute (see next section). ## Nonce restrictions in OIDC tokens -Our [`OAUTH`](/api#tag/Users/operation/Oauth) activity requires 2 parameters minimum: +Our [`OAUTH`](/api-reference/user-auth/oauth) activity requires 2 parameters minimum: -- `oidcToken`: the base64 OIDC token -- `targetPublicKey`: the client-side public key generated by the user +* `oidcToken`: the base64 OIDC token +* `targetPublicKey`: the client-side public key generated by the user In order to prevent OIDC tokens from being used against multiple public keys, our enclaves parse the OIDC token and, as part of the validation logic, enforce that the `nonce` claim is set to `sha256(targetPublicKey)`. @@ -92,8 +84,8 @@ If your OAuth provider does not allow you to customize `nonce` claims, Turnkey a [OAuth2.0](https://datatracker.ietf.org/doc/html/rfc6749) is a separate protocol from [OIDC](https://openid.net/specs/openid-connect-core-1_0.html), with distinct goals: -- "OAuth2.0" is an authorization framework -- "OIDC" is an authentication framework +* "OAuth2.0" is an authorization framework +* "OIDC" is an authentication framework We chose to name this feature "OAuth" because of the term familiarity: most Turnkey customers will have to setup an "OAuth" app with Google, and the user experience is often referred to as "OAuth" flows regardless of the protocol underneath. @@ -103,11 +95,11 @@ Below, some details and pointers about specific providers we've worked with befo ### Google -This provider is extensively tested and supported. We've integrated it in our demo wallet (hosted at https://wallet.tx.xyz), along with Apple and Facebook: +This provider is extensively tested and supported. We've integrated it in our demo wallet (hosted at [https://wallet.tx.xyz](https://wallet.tx.xyz)), along with Apple and Facebook: -

- -

+ + OAuth demo wallet + The code is open-source, feel free to [check it out](https://github.com/tkhq/demo-embedded-wallet) for reference. The exact line where the OAuth component is loaded is here: [ui/src/screens/LandingScreen.tsx](https://github.com/tkhq/demo-embedded-wallet/blob/d4ec308e9ce0bf0da7b64da2b39e1a80c077eb82/ui/src/screens/LandingScreen.tsx#L384). @@ -115,7 +107,7 @@ The main documentation for Google OIDC is available [here](https://github.com/tk ### Apple -Apple integration is also extensively tested and supported, and is integrated into our demo wallet (hosted at https://wallet.tx.xyz). The code provides an [example component](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/components/apple-auth.tsx) as well as an [example redirect handler](). +Apple integration is also extensively tested and supported, and is integrated into our demo wallet (hosted at [https://wallet.tx.xyz](https://wallet.tx.xyz)). The code provides an [example component](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/components/apple-auth.tsx) as well as an [example redirect handler](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/app/\(landing\)/oauth-callback/apple/page.tsx). Documentation for Apple OIDC can be found [here](https://developer.apple.com/documentation/sign_in_with_apple/sign_in_with_apple_rest_api/authenticating_users_with_sign_in_with_apple). @@ -123,17 +115,17 @@ Documentation for Apple OIDC can be found [here](https://developer.apple.com/doc Facebook OIDC requires a [manual flow with PFKE](https://developers.facebook.com/docs/facebook-login/guides/advanced/oidc-token/) (Proof for Key Exchange). This flow requires a few extra steps compared with Apple or Google. Specifically: -- You will need to generate a **code verifier** that can either be recalled (e.g. from a database) or reassembled in a later request. -- You will need to provide a **code challenge** as a parameter of the OAuth redirect that is either the code verifier itself or the hash of the code verifier. -- Instead of receiving the OIDC token after the OAuth flow, you will receive an **auth code** that must be exchanged for an OIDC token in a subsequent request. The code verifier and your app's ID are also required in this exchange. +* You will need to generate a **code verifier** that can either be recalled (e.g. from a database) or reassembled in a later request. +* You will need to provide a **code challenge** as a parameter of the OAuth redirect that is either the code verifier itself or the hash of the code verifier. +* Instead of receiving the OIDC token after the OAuth flow, you will receive an **auth code** that must be exchanged for an OIDC token in a subsequent request. The code verifier and your app's ID are also required in this exchange. In our example demo wallet, we opt to avoid using a database in the authentication process and instead generate our verification code serverside using the hash of a nonce and a secret salt value. The nonce is then passed to and returned from the Facebook API as a **state** parameter (see [the API spec](https://developers.facebook.com/docs/facebook-login/guides/advanced/oidc-token/) for details). Finally, the server reconstructs the verification code by re-hashing the nonce and the the salt. The full flow is displayed below: -

- Facebook OAuth flow -

+ + Facebook OAuth flow + -Code for the [redirect component](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/components/facebook-auth.tsx), [OAuth callback](), and [code exchange](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/actions/turnkey.ts#L54) are all available in the example wallet repo. +Code for the [redirect component](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/components/facebook-auth.tsx), [OAuth callback](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/app/\(landing\)/oauth-callback/facebook/page.tsx), and [code exchange](https://github.com/tkhq/demo-embedded-wallet/blob/bf0e2292cbd2ee9cde6b241591b077fadf7ee71b/src/actions/turnkey.ts#L54) are all available in the example wallet repo. If you prefer to use a database such as Redis instead of reassembling the verification code, you can store the verification code and retrieve it in the exchange stage using a lookup key either passed as **state** or stored in local browser storage. diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index bfd75dbd..00000000 --- a/babel.config.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - presets: [require.resolve("@docusaurus/core/lib/babel/preset")], -}; diff --git a/category/advanced.mdx b/category/advanced.mdx new file mode 100644 index 00000000..02494552 --- /dev/null +++ b/category/advanced.mdx @@ -0,0 +1,24 @@ +--- +title: "Advanced" +description: "Use Turnkey's low-level http libraries directly" +sidebarTitle: "Overview" +--- + + + + Detailed guide on installing and initializing the TurnkeyClient + + + Guide on using the ApiKeyStamper + + + + Guide on using the WalletStamper + + + Guide on using the WebauthnStamper + + + Guide on using the IframeStamper + + diff --git a/category/code-examples-1.mdx b/category/code-examples-1.mdx new file mode 100644 index 00000000..6d47205b --- /dev/null +++ b/category/code-examples-1.mdx @@ -0,0 +1,11 @@ +--- +title: "Code Examples" +sidebarTitle: "Overview" +mode: wide +--- + + + + Signing Transactions + + diff --git a/category/code-examples.mdx b/category/code-examples.mdx new file mode 100644 index 00000000..722a6806 --- /dev/null +++ b/category/code-examples.mdx @@ -0,0 +1,44 @@ +--- +title: "Code Examples" +sidebarTitle: "Overview" +mode: wide +--- + + + + Create a Sub-Org with a Passkey User + + + + Authenticate a User with a Passkey Credential + + + + Create a User Passkey Session + + + + Create a User with Email Only + + + Authenticate a User with Email + + + Recover a User with Email + + + Add an Additional Passkey + + + Authenticate a User with an Ethereum Wallet + + + Signing Transactions + + + Import Wallet or Private Key + + + Export Wallet or Private Key + + diff --git a/category/security.mdx b/category/security.mdx new file mode 100644 index 00000000..23a18ace --- /dev/null +++ b/category/security.mdx @@ -0,0 +1,43 @@ +--- +title: Security +sidebarTitle: Overview +mode: wide +description: "Learn how Turnkey achieves innovative, cloud scale, no single point of failure security." +--- + + + + Learn about Turnkey's unique security framework + + + + Learn how Turnkey handles private keys + + + + Overview of secure enclaves and how we use them + + + + Learn how we deploy our secure applications + + + + Learn how we ensure an end-to-end audit trail + + + Turnkey's disaster recovery process + + + + Learn about Turnkey's enclave to end-user secure channels + + + + Read about Turnkey's ambitious foundations with the Turnkey Whitepaper + + + + Overview of Turnkey's responsible disclosure program + + diff --git a/category/web3-libraries.mdx b/category/web3-libraries.mdx new file mode 100644 index 00000000..9cb4a9ba --- /dev/null +++ b/category/web3-libraries.mdx @@ -0,0 +1,28 @@ +--- +title: Web3 Libraries +description: "Turnkey Web3 Libraries" +mode: wide +sidebarTitle: "Overview" +--- + + + + Ethers Wrapper + + + + Viem Wrapper + + + + CosmJS Wrapper + + + + EIP 1193 Provider + + + + Solana Web3 Wrapper + + diff --git a/concepts/organizations.mdx b/concepts/organizations.mdx new file mode 100644 index 00000000..69211320 --- /dev/null +++ b/concepts/organizations.mdx @@ -0,0 +1,54 @@ +--- +title: "Organizations" +description: "An organization is a logical grouping of resources (e.g. users, policies, wallets). These resources can only be accessed by authorized and permissioned users within the organization. Resources are not shared between organizations." +--- + +## Root Quorum + +All organizations are controlled by a [Root Quorum](/concepts/users/root-quorum) which contains the root users and the required threshold of approvals to take any action. Only the root quorum can update the root quorum or feature set. + +## Features + +Organization features are Turnkey product offerings that organizations can opt-in to or opt-out of. Note that these features can be set and updated using the activities `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` and `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`. The following is a list of such features: + +| Name | Description | Default | Notes | +| -------------------------------- | --------------------------------------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| FEATURE\_NAME\_EMAIL\_AUTH | Enables email authentication activities | Enabled | Can only be initiated by a parent organization for a sub-organization. | +| FEATURE\_NAME\_EMAIL\_RECOVERY | Enables email recovery activities | Enabled | Can only be initiated by a parent organization for a sub-organization. | +| FEATURE\_NAME\_WEBAUTHN\_ORIGINS | The origin Webauthn credentials are scoped to | Disabled | Parent organization feature applies to all sub-organizations. If not enabled, sub-organizations default to allowing all origins: "\*". For Passkey WaaS, we highly recommend enabling this feature. Example value: "[https://www.turnkey.com"](https://www.turnkey.com%22) | +| FEATURE\_NAME\_WEBHOOK | A URL to receive activity notification events | Disabled | This feature is currently experimental. Example value: "[https://your.service.com/webhook"](https://your.service.com/webhook%22) | + +## Permissions + +All activity requests are subject to enforcement by Turnkey's policy engine. The policy engine determines if a request is allowed by checking the following: + +* Does this request violate our feature set? + + * Email recovery cannot be initiated if disabled + * Email auth cannot be initiated if disabled + +* Should this request be denied by default? + * All import requests must target your own user + +* Does this request meet the root quorum threshold? + +* What is the outcome of evaluating this request against all organization policies? Outcomes include: + + * `OUTCOME_ALLOW`: the request is allowed to process + * `OUTCOME_REQUIRES_CONSENSUS`: the request needs additional approvals + * `OUTCOME_REJECTED`: the request should be rejected + * `OUTCOME_DENY_EXPLICIT`: the request has been explicitly denied via policies + * `OUTCOME_DENY_IMPLICIT`: the request has been implicity denied as no policies grant the required permissions + +* Should this request be allowed by default? + * Users can manage their own credentials unless policies explicitly deny this + +## Resource Limits + +Organizations have [resource limits](/concepts/resource-limits) for performance and security considerations. If you're bumping into these limits, check out sub-organizations below. + +## Sub-Organizations + +A sub-organization is an isolated organization that has a pointer to a parent organization. The parent organization has **read** access to all sub-organizations, but no **write** access. This means users within the parent organization have no ability to use wallets or alter any resources in the sub-organization. + +For more information on sub-organizations and common use cases for this functionality, follow along in the next section . diff --git a/docs/documentation/concepts/Introduction.md b/concepts/overview.mdx similarity index 79% rename from docs/documentation/concepts/Introduction.md rename to concepts/overview.mdx index 87d473fc..fa1eed35 100644 --- a/docs/documentation/concepts/Introduction.md +++ b/concepts/overview.mdx @@ -1,31 +1,19 @@ --- -sidebar_position: 1 -sidebar_label: Overview -description: Understand Turnkey's core features and fundamentals. -slug: /concepts/overview +title: "Overview" +description: "Turnkey is flexible, scalable, and secure wallet infrastructure that can be used for transaction automation (e.g., payments flows, smart contract management), or non-custodial embedded wallets. Turnkey offers low-level primitives that can be combined to accomplish a variety of goals." --- -import DocCardList from '@theme/DocCardList'; - -# Overview - -Turnkey is flexible, scalable, and secure wallet infrastructure that can be used for transaction automation (e.g., payments flows, smart contract management), or non-custodial embedded wallets. Turnkey offers low-level primitives that can be combined to accomplish a variety of goals. - When you sign up to Turnkey, you create an **[organization](/concepts/organizations)**, which is a segregated collection of users (including root users), wallets, and policies that are controlled by your business. This top level organization that is initially created, often referred to as your parent organization, is generally meant to represent an entire Turnkey-powered application. **[Users](/concepts/users/introduction)** can access Turnkey via their **[credentials](/concepts/users/credentials)** (e.g., API key, passkey). There are two primary ways for users to interact with Turnkey -- via the [Turnkey Dashboard](https://app.turnkey.com/dashboard), and by submitting activity requests via our public API. The Turnkey Dashboard, which is where you'll first create your Turnkey parent organization, is where root users of your parent organization will typically manage administrative activities. It supports passkey authentication only. On the other hand, interactions with Turnkey at scale (primarily, interactions initiated by end users) can be done via programmatically calling the Turnkey public API and submitting activity requests, with a variety of authentication methods supported. Users can submit **[activities](/developer-reference/api-overview/submissions)** (e.g. sign transaction, create user) based on the permissions granted by **[policies](/concepts/policies/overview)**. Root users are a special type of user that can bypass our policy engine and take any action if the threshold of **[root quorum](/concepts/users/root-quorum)** is met. Finally, **[wallets](/concepts/wallets)** are HD seed phrases that can derive many wallet accounts (i.e., individual addresses) which are used for signing operations. Parent organizations can create **[sub-organizations](/concepts/sub-organizations)**, a segregated set of users, policies, and wallets to which the parent has read access, but not write access. These sub-organizations typically map to an end user in an embedded wallet setup, but can be used wherever you may need full segregation of Turnkey resources. -

- all concepts screenshot -

+ + all concepts screenshot + -# Concepts dictionary +## Concepts dictionary -## Organizations +### Organizations An organization is a logical grouping of resources like users, policies, and wallets. There are two types of organizations: @@ -34,44 +22,44 @@ An organization is a logical grouping of resources like users, policies, and wal | Parent Organization | When you first setup your implementation of Turnkey by signing up on the dashboard you create a parent organization controlled by your business. In most implementations, a top-level organization represents an entire Turnkey-powered implementation. For more information on Turnkey parent organizations [look here](/concepts/organizations). | | Sub-Organization | A fully segregated organization nested under the parent organization. Parent organizations have read access to all their sub-organizations, but do not have write access. Each sub-organization typically maps to an individual end user in a Turnkey-powered application. Parent organizations can initiate limited actions for sub-organizations that then must be completed by the sub-organization, or without the need for completion by the sub-organization (e.g. `INIT_OTP_AUTH` or `INIT_USER_EMAIL_RECOVERY` require completion by sub-organization, `EMAIL_AUTH` does not). For more information on Turnkey sub-organizations [look here](/concepts/sub-organizations). | -## Users +### Users -Turnkey users are resources within organizations or sub-organizations that can submit activities to Turnkey via a valid credential (e.g., API key, passkey). These requests can be made either by making direct API calls or through the Turnkey Dashboard. Users must be set up to authenticate to Turnkey with credentials (API keys, passkeys), or via other authentication methods such as OAuth, or email auth, with upper limits on credentials defined here in our [resource limits](/concepts/resource-limits). Users can also have associated "tags" which are logical groupings that can be referenced in policies. Users can only submit activities within their given organization — they cannot take action across organizations. +Turnkey users are resources within organizations or sub-organizations that can submit activities to Turnkey via a valid credential (e.g., API key, passkey). These requests can be made either by making direct API calls or through the Turnkey Dashboard. Users must be set up to authenticate to Turnkey with credentials (API keys, passkeys), or via other authentication methods such as OAuth, or email auth, with upper limits on credentials defined here in our [resource limits](/concepts/resource-limits). Users can also have associated “tags” which are logical groupings that can be referenced in policies. Users can only submit activities within their given organization — they cannot take action across organizations. There are two main types of users: | User type | Description | | :----------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Root Users | The first user(s) created in an organization will have root permissions, meaning they can bypass the policy engine to take any action within that specific organization. This ability can be limited via root quorum, which requires a threshold of root users to access root permissions. For example, if there are five root users and the threshold is three, at least three users must approve an activity for the root quorum threshold to be reached. When you first create a Turnkey organization, your user is automatically created as the sole member of the root quorum by default. | -| Normal Users | Other than managing their own credentials, non-root users have no permissions unless explicitly granted by [policies](/concepts/policies/overview). By combining non-root users with policies granting permission for specific actions, you can build support for experiences providing [delegated access](/concepts/policies/delegated-access) to business controlled service account. | +| Normal Users | Other than managing their own credentials, non-root users have no permissions unless explicitly granted by [policies](/concepts/policies/overview). By combining non-root users with policies granting permission for specific actions, you can build support for experiences providing [delegated access](/concepts/policies/delegated-access) to business controlled service account. | In parent organizations, a user often maps to an individual from your team with administrative privileges and responsibilities. In sub-organizations, which are often used to manage an end user's resources, a user can represent an end user and their credentials. If there is only one user representing the end user with only end-user controlled credentials then this would be more akin to a standard non-custodial setup. However, this flexible primitive can often represent other aspects of your backend or application. For example, a Turnkey user might map to a: -- Backend service used to automate certain transactions -- Service with delegated access to take action on behalf of an end user -- Required co-signer for all end user transactions +* Backend service used to automate certain transactions +* Service with delegated access to take action on behalf of an end user +* Required co-signer for all end user transactions For more information on Turnkey users [look here](/concepts/users/introduction). -## Credentials +### Credentials Interacting with the Turnkey API requires each API call to be authenticated by cryptographically stamping it with a credential. This process is abstracted away in our SDKs and ensures that the request cannot be tampered with as it travels to the secure enclave. Credentials include API keys and passkeys / Webauthn devices for all Users, while sub-organization users can also use email or OAuth to authenticate. Email and OAuth leverage API keys under the hood. For more information on Turnkey user credentials [look here](/concepts/users/credentials). -## Activities +### Activities -Activities are specific actions taken by users, such as signing a transaction, adding a new user, or creating a sub-organization. Activity requests are always evaluated through our policy engine, and can evaluate to ALLOW, DENY, or REQUIRES_CONSENSUS (i.e., requires additional approvals before being allowed). +Activities are specific actions taken by users, such as signing a transaction, adding a new user, or creating a sub-organization. Activity requests are always evaluated through our policy engine, and can evaluate to ALLOW, DENY, or REQUIRES\_CONSENSUS (i.e., requires additional approvals before being allowed). For more information on Turnkey activities [look here](/developer-reference/api-overview/submissions). -## Policies +### Policies -Policies, enforced by Turnkey's policy engine, grant users permissions to perform activities. These policies are a series of logical statements (e.g., User ID == 123 or ETH address == 0x543…9b34) that evaluate to either "ALLOW" or "DENY." Through these policies you can set granular controls on which users can take which actions with which wallets. Policies can also require multi-party approval / consensus, meaning a threshold of certain users will be required to approve the activity. As mentioned above, the root quorum will bypass the policy engine. +Policies, enforced by Turnkey’s policy engine, grant users permissions to perform activities. These policies are a series of logical statements (e.g., User ID == 123 or ETH address == 0x543…9b34) that evaluate to either “ALLOW” or “DENY.” Through these policies you can set granular controls on which users can take which actions with which wallets. Policies can also require multi-party approval / consensus, meaning a threshold of certain users will be required to approve the activity. As mentioned above, the root quorum will bypass the policy engine. For more information on Turnkey policies [look here](/concepts/policies/overview). -## Wallets and Private Keys +### Wallets and Private Keys Resources used to generate crypto addresses and sign transactions or messages. We currently support secp256k1 and ed25519 curves and have two main types: @@ -82,45 +70,65 @@ Resources used to generate crypto addresses and sign transactions or messages. W Learn more about leveraging Wallets across different crypto ecosystems on our [Ecosystem Support](/ecosystems/framework) page. -# Typical implementations +## Typical implementations -## Transaction Automation +### Transaction Automation Transaction automation entails a business signing transactions on its own behalf. For example, automating payments flows, managing smart contract deployment or programmatically trading in DeFi. -

- transaction automation screenshot -

+ + transaction automation screenshot + In this setup, the business is in full control of its wallets at all times. This use case typically does not require the use of sub-organizations and everything can be managed from the parent organization. We suggest the following setup: -- **Root Users:** After initial setup of your parent organization, set a reasonable root quorum (e.g., 2 of 3), attach backup credentials to each user for safekeeping, and only use the root users in a "break glass" scenario. -- **Service Users:** Create different users for separate services and/or approval workflows. For example, you might have user A that can automatically sign any transaction with Wallet X, but require both user A and user B to approve transactions with Wallet B. -- **Service Policies:** Set appropriately restrictive policies based on your security needs. -- **Wallets:** Create separate wallets where differentiated policies are needed, otherwise just leverage multiple wallet accounts within a single wallet. +* **Root Users:** After initial setup of your parent organization, set a reasonable root quorum (e.g., 2 of 3), attach backup credentials to each user for safekeeping, and only use the root users in a “break glass” scenario. +* **Service Users:** Create different users for separate services and/or approval workflows. For example, you might have user A that can automatically sign any transaction with Wallet X, but require both user A and user B to approve transactions with Wallet B. +* **Service Policies:** Set appropriately restrictive policies based on your security needs. +* **Wallets:** Create separate wallets where differentiated policies are needed, otherwise just leverage multiple wallet accounts within a single wallet. -## Embedded Wallets +### Embedded Wallets Embedded wallets entail a business creating non-custodial wallets controlled by its end users. For example, allowing an end user to create and use a wallet via Web2 authentication methods like email or OAuth. -

- embedded wallets screenshot -

+ + embedded wallets screenshot + This is a non-custodial setup where the end user is in control of its wallet at all times. This use case requires the use of sub-organizations which map to an individual end user, and does not require any wallets in the parent organization. The parent organization will be used by your backend service for onboarding new users and initiating certain authentication methods (e.g., email, SMS), while the sub-organizations will be used by the end users for day-to-day signing. We suggest the following setup: -- **Root Users:** After initial setup of your parent organization, set a reasonable root quorum (e.g., 2 of 3), attach backup credentials to each user for safekeeping, and only use the root users in a "break glass" scenario. -- **Normal Users:** Create a single service user used for user onboarding and authentication. -- **Policies:** Set a policy granting the user permission to `CREATE_SUB_ORGANIZATION`, `EMAIL_AUTH`, `OAUTH`, `OTP_AUTH`. For examples of how to create such policies [look here](/concepts/policies/examples). -- **Sub-organizations:** Create individual sub-organizations for each user that contain a single root user with any relevant credentials, and a single wallet with any relevant wallet accounts. +* **Root Users:** After initial setup of your parent organization, set a reasonable root quorum (e.g., 2 of 3), attach backup credentials to each user for safekeeping, and only use the root users in a “break glass” scenario. +* **Normal Users:** Create a single service user used for user onboarding and authentication. +* **Policies:** Set a policy granting the user permission to `CREATE_SUB_ORGANIZATION`, `EMAIL_AUTH`, `OAUTH`, `OTP_AUTH`. For examples of how to create such policies [look here](/concepts/policies/examples). +* **Sub-organizations:** Create individual sub-organizations for each user that contain a single root user with any relevant credentials, and a single wallet with any relevant wallet accounts. For more details on each individual concepts, refer to the pages below: - + + + + Understand Turnkey's core features and fundamentals. + + + + Learn about Organizations on Turnkey + + + Learn about sub-organizations on Turnkey + + + + 3 items + + + + Learn about Wallets on Turnkey + + + + Organization resource limits + + + + 5 items + + diff --git a/docs/documentation/concepts/policy-management/delegated-access.md b/concepts/policies/delegated-access.mdx similarity index 68% rename from docs/documentation/concepts/policy-management/delegated-access.md rename to concepts/policies/delegated-access.mdx index 608b2b53..712ca769 100644 --- a/docs/documentation/concepts/policy-management/delegated-access.md +++ b/concepts/policies/delegated-access.mdx @@ -1,23 +1,18 @@ --- -sidebar_position: 4 -description: Learn about setting up delegated access to user wallets on Turnkey. -slug: /concepts/policies/delegated-access -sidebar_label: Delegated Access +title: "Delegated Access" +description: "With Turnkey you can create multi-user accounts with flexible co-ownership controls. This primitive enables you to establish delegated access to a user’s wallet, reducing or removing the need for them to manually approve each action. You can provide a smoother user experience while ensuring that end-users maintain full control over their wallets." --- -# Delegated access - -With Turnkey you can create multi-user accounts with flexible co-ownership controls. This primitive enables you to establish delegated access to a user’s wallet, reducing or removing the need for them to manually approve each action. You can provide a smoother user experience while ensuring that end-users maintain full control over their wallets. - To set up delegated access, here’s one example of how you can create a limited-permissions user within the end-user’s sub-organization: -### Step 1: Create a sub-organization with two root users +### Step 1: Create a sub-organization with two root users[​](#step-1-create-a-sub-organization-with-two-root-users "Direct link to Step 1: Create a sub-organization with two root users") + +* Create your sub-organization with the two root users being: -- Create your sub-organization with the two root users being: - - The end-user - - A user you control (let’s call it the ‘Service Account’) + * The end-user + * A user you control (let’s call it the ‘Service Account’) -```sh +```json { "type": "ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7", "timestampMs": "", @@ -41,7 +36,7 @@ To set up delegated access, here’s one example of how you can create a limited } ], "apiKeys": [], - "oidcProviders": [] + "oidcProviders": [] }, { "userName": "Service Account", @@ -53,7 +48,7 @@ To set up delegated access, here’s one example of how you can create a limited "publicKey": "" } ], - "oidcProviders": [] + "oidcProviders": [] } ], "rootQuorumThreshold": 1, @@ -74,16 +69,18 @@ To set up delegated access, here’s one example of how you can create a limited ### Step 2: Create a new Delegated Access user using the Service Account -- Create a new user, the ‘Delegated Account’ -- Create a custom policy granting the Delegated Account specific permissions. You might grant that user permissions to: - - Sign any transaction - - Sign only transactions to a specific address - - Create new users in the sub-org - - Or any other activity you want to be able to take using your Delegated Account +* Create a new user, the ‘Delegated Account’ + +* Create a custom policy granting the Delegated Account specific permissions. You might grant that user permissions to: + + * Sign any transaction + * Sign only transactions to a specific address + * Create new users in the sub-org + * Or any other activity you want to be able to take using your Delegated Account Here’s one example, creating a Delegated Account that only has permission to sign transactions to a specific receiver address: -```sh +```json // 1. Create the Delegated Account { "type": "ACTIVITY_TYPE_CREATE_USER", @@ -118,9 +115,10 @@ Here’s one example, creating a Delegated Account that only has permission to s ### Step 3: Remove the Service Account from the root quorum. -- Using the Service Account: - - Create a new policy that explicitly grants the Service Account permission to delete users. This is necessary because, once removed from the Root Quorum, the Service Account will have no permissions by default. - - [Update the root quorum](https://docs.turnkey.com/api#tag/Organizations/operation/UpdateRootQuorum) to remove the Service Account from the root quorum - - Delete the Service Account user from the organization +* Using the Service Account: + + * Create a new policy that explicitly grants the Service Account permission to delete users. This is necessary because, once removed from the Root Quorum, the Service Account will have no permissions by default. + * [Update the root quorum](/api-reference/organizations/update-root-quorum) to remove the Service Account from the root quorum + * Delete the Service Account user from the organization After completing these steps, the sub-organization will have two users: the end-user (the only root-user) and the Delegated Account user, which has the permissions granted earlier. diff --git a/docs/documentation/concepts/policy-management/Policy-examples.mdx b/concepts/policies/examples.mdx similarity index 75% rename from docs/documentation/concepts/policy-management/Policy-examples.mdx rename to concepts/policies/examples.mdx index de073bc7..119451f1 100644 --- a/docs/documentation/concepts/policy-management/Policy-examples.mdx +++ b/concepts/policies/examples.mdx @@ -1,17 +1,13 @@ --- -sidebar_position: 3 -description: Check out some example policies to help write your own -slug: /concepts/policies/examples -sidebar_label: Examples +title: "Policy examples" +sidebarTitle: "Examples" --- -# Policy examples - ## Access control #### Allow a specific user to create wallets -```json JSON +```json { "policyName": "Allow user to create wallets", "effect": "EFFECT_ALLOW", @@ -22,7 +18,7 @@ sidebar_label: Examples #### Allow users with a specific tag to create users -```json JSON +```json { "policyName": "Allow user_tag to create users", "effect": "EFFECT_ALLOW", @@ -33,7 +29,7 @@ sidebar_label: Examples #### Require two users with a specific tag to add policies -```json JSON +```json { "policyName": "Require two users with user_tag to create policies", "effect": "EFFECT_ALLOW", @@ -44,7 +40,7 @@ sidebar_label: Examples #### Deny all delete actions for users with a specific tag -```json JSON +```json { "policyName": "Only user_tag can take actions", "effect": "EFFECT_DENY", @@ -55,7 +51,7 @@ sidebar_label: Examples #### Allow a specific user (e.g. API-only user) to create a sub-org -```json JSON +```json { "policyName": "Allow user to create a sub-org", "effect": "EFFECT_ALLOW", @@ -64,10 +60,11 @@ sidebar_label: Examples } ``` -#### Allow a specific user to perform auth type activities (full list [here](Policy-language.md#activity-breakdown)) -Note: The activity.resource portion determines which activities can be performed. The activity.action determines what types of actions can be taken upon those resources. +#### Allow a specific user to perform auth type activities (full list [here](/concepts/policies/language#activity-breakdown)) -```json JSON +Note: The `activity.resource` portion determines which activities can be performed. The `activity.action` determines what types of actions can be taken upon those resources. + +```json { "policyName": "Allow user to initiate auth type activities", "effect": "EFFECT_ALLOW", @@ -76,8 +73,12 @@ Note: The activity.resource portion determines which activities can be performed } ``` -#### Allow a specific user to perform a specific activity type (full list [here](Policy-language.md#activity-breakdown)) -Note: Activities may be upgraded over time, and thus new versions may be introduced. These policies will NOT be valid if an activity type is upgraded and requests are made on the new activity type. For example, if Turnkey introduces `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3` (upgraded from `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2`) and a request is made with the newer `V3` version, this policy with not allow that user to perform `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3` activities. +#### Allow a specific user to perform a specific activity type (full list [here](/concepts/policies/language#activity-breakdown)) + +Note: Activities may be upgraded over time, and thus new versions may be introduced. +These policies will NOT be valid if an activity type is upgraded and requests are made on the new activity type. +For example, if Turnkey introduces `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3` (upgraded from `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2`) +and a request is made with the newer `V3` version, this policy with not allow that user to perform `ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V3` activities. ```json JSON { @@ -92,7 +93,7 @@ Note: Activities may be upgraded over time, and thus new versions may be introdu #### Allow a specific user to sign transactions with any account address within a specific wallet -```json +```JSON { "policyName": "Allow to sign transactions with ", "effect": "EFFECT_ALLOW", @@ -125,11 +126,11 @@ Note: Activities may be upgraded over time, and thus new versions may be introdu ### Ethereum (EVM) -Note: see the [language section](Policy-language.md#appendix) for more details. +Note: see the [language section](/concepts/policies/language#appendix) for more details. #### Allow ERC-20 transfers for a specific token smart contract -```json JSON +```json { "policyName": "Enable ERC-20 transfers for ", "effect": "EFFECT_ALLOW", @@ -139,7 +140,7 @@ Note: see the [language section](Policy-language.md#appendix) for more details. #### Allow anyone to sign transactions for testnet (Sepolia) -```json JSON +```json { "policyName": "Allow signing ethereum sepolia transactions", "effect": "EFFECT_ALLOW", @@ -149,7 +150,7 @@ Note: see the [language section](Policy-language.md#appendix) for more details. #### Allow ETH transactions with a specific nonce range -```json JSON +```json { "policyName": "Allow signing Ethereum transactions with an early nonce", "effect": "EFFECT_ALLOW", @@ -159,11 +160,11 @@ Note: see the [language section](Policy-language.md#appendix) for more details. ### Solana -Note: see the [language section](Policy-language.md#appendix) for various approaches on writing Solana policies. +Note: see the [language section](/concepts/policies/language#appendix) for various approaches on writing Solana policies. #### Allow Solana transactions that include a transfer from one specific sender -```json JSON +```json { "policyName": "Enable transactions with a transfer sent by ", "effect": "EFFECT_ALLOW", @@ -173,7 +174,7 @@ Note: see the [language section](Policy-language.md#appendix) for various approa #### Allow Solana transactions that include a transfer to only one specific recipient -```json JSON +```json { "policyName": "Enable transactions with a single transfer sent to ", "effect": "EFFECT_ALLOW", @@ -183,7 +184,7 @@ Note: see the [language section](Policy-language.md#appendix) for various approa #### Allow Solana transactions that have exactly one transfer, to one specific recipient -```json JSON +```json { "policyName": "Enable transactions with a transfer sent to ", "effect": "EFFECT_ALLOW", @@ -193,7 +194,7 @@ Note: see the [language section](Policy-language.md#appendix) for various approa #### Allow Solana transactions that only use the Solana System Program -```json JSON +```json { "policyName": "Enable transactions that only use the system program", "effect": "EFFECT_ALLOW", @@ -203,7 +204,7 @@ Note: see the [language section](Policy-language.md#appendix) for various approa #### Deny all Solana transactions transferring to an undesired address -```json JSON +```json { "policyName": "Reject transactions with a transfer sent to ", "effect": "EFFECT_DENY", @@ -213,7 +214,7 @@ Note: see the [language section](Policy-language.md#appendix) for various approa #### Allow Solana transactions with specific expected instruction data -```json JSON +```json { "policyName": "Enable transactions where the first instruction has precisely ", "effect": "EFFECT_ALLOW", @@ -223,7 +224,7 @@ Note: see the [language section](Policy-language.md#appendix) for various approa #### Allow Solana transactions whose first instruction involves a specific address -```json JSON +```json { "policyName": "Enable transactions where the first instruction has a first account involving
", "effect": "EFFECT_ALLOW", @@ -237,58 +238,51 @@ Turnkey’s policy engine supports policies for SPL token transfers. Specificall Some important context for using SPL token policies with Turnkey: -**Token Account Addresses** -For context, Solana implements SPL token balances for a particular wallet address by creating a whole new account called a "token account" which has a pointer in its data field labeled "owner" that points back to the wallet address in question. So to hold a particular token in your Solana wallet, you have to have to create a new token account meant to hold that token, owned by your Solana wallet. For policies related to the receiving token address of an SPL transfer, the token address receiving the tokens will have to be used, NOT the wallet address that is the owner for the receiving token address. This is because, while both the owning wallet address and the receiving token address are specified in the transfer instruction, the owning wallet address of the recipient token address is not specified. For this we highly recommend using the convention of “associated token addresses” to set policies that, for example, allow SPL token transfers to a particular wallet address. +**Token Account Addresses** For context, Solana implements SPL token balances for a particular wallet address by creating a whole new account called a "token account" which has a pointer in its data field labeled "owner" that points back to the wallet address in question. So to hold a particular token in your Solana wallet, you have to have to create a new token account meant to hold that token, owned by your Solana wallet. For policies related to the receiving token address of an SPL transfer, the token address receiving the tokens will have to be used, NOT the wallet address that is the owner for the receiving token address. This is because, while both the owning wallet address and the receiving token address are specified in the transfer instruction, the owning wallet address of the recipient token address is not specified. For this we highly recommend using the convention of “associated token addresses” to set policies that, for example, allow SPL token transfers to a particular wallet address. -For further context on associated token addresses check out Solana’s documentation on it: https://spl.solana.com/associated-token-account +For further context on associated token addresses check out Solana’s documentation on it: [https://spl.solana.com/associated-token-account](https://spl.solana.com/associated-token-account) -:::info + + An example implementation of using a policy to allow transfers to the associated token address of the intended recipient wallet address can be found in our SDK examples [here](https://github.com/tkhq/sdk/tree/main/examples/with-solana#6-running-the-create-spl-token-transfer-with-policy-example). + -An example implementation of using a policy to allow transfers to the associated token address of the intended recipient wallet address can be found in our SDK examples [here](https://github.com/tkhq/sdk/tree/main/examples/with-solana#6-running-the-create-spl-token-transfer-with-policy-example). - -::: - -**Mint Address Accessibility** -The mint account address of the token will only be accessible when the transaction is constructed using instructions that specify the mint address – `TransferChecked` and `TransferCheckedWithFee`. For transactions constructed using the simple `Transfer` method, the mint account will be considered empty. +**Mint Address Accessibility** The mint account address of the token will only be accessible when the transaction is constructed using instructions that specify the mint address – `TransferChecked` and `TransferCheckedWithFee`. For transactions constructed using the simple `Transfer` method, the mint account will be considered empty. Here are some example policies for SPL transfers: #### Allow a user to sign Solana transactions that include a single instruction which is an SPL token transfer from a particular sending token address -```json JSON +```json { "policyName": "Allow user to sign Solana transactions that include only a single SPL Transfer FROM ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", - "condition": "solana.tx.instructions.count() == 1 && solana.tx.spl_transfers.count() == 1 && solana.tx.spl_transfers.all(transfer, transfer.from == '')" -} + "condition": "solana.tx.instructions.count() == 1 && solana.tx.spl_transfers.count() == 1 && solana.tx.spl_transfers.all(transfer, transfer.from == '')"} ``` #### Allow a user to sign Solana transactions only if ALL of the instructions are SPL transfers TO a particular token address -```json JSON +```json { "policyName": "Allow user to sign Solana transactions only if ALL of the instructions are SPL transfers TO ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", - "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.to == '')" -} + "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.to == '')"} ``` #### Allow users with a specific tag to sign Solana transactions only if ALL of the instructions are SPL token transfers with a specific address as the owner of the sending token address -```json JSON +```json { "policyName": "Allow users with to sign Solana transactions only if ALL of the instructions are SPL token transfers with as the owner of the sending token address", "effect": "EFFECT_ALLOW", - "consensus": "approvers.any(user, user.tags.contains(''))", - "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.owner == '')" -} + "consensus": "approvers.any(user, user.tags.contains('')"} ``` #### Allow a user to sign Solana transactions that include a single instruction which is an SPL token transfer where the atomic units of the transfer are less than a threshold amount -```json Json +```json { "policyName": "Allow user to sign Solana transactions that include a single instruction which is an SPL token transfer where the atomic units of the transfer are less than ", "effect": "EFFECT_ALLOW", @@ -299,18 +293,17 @@ Here are some example policies for SPL transfers: #### Allow a user to sign Solana transactions only if ALL of the instructions are SPL token transfers where the token mint address is a particular address -```json Json +```json { "policyName": "Allow to sign a Solana transaction only if ALL of the instructions are SPL token transfers where the token mint address is ", "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", - "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.token_mint == '')" -} + "condition": "solana.tx.instructions.count() == solana.tx.spl_transfers.count() && solana.tx.spl_transfers.all(transfer, transfer.token_mint == '')"} ``` #### Allow a user to sign Solana transactions that includes a single instruction which is an SPL token transfer where one of the multisig signers of the owner is a particular address -```json Json +```json { "policyName": "Allow to sign a Solana transaction only if ALL of it's instructions are SPL token transfers where one of the multisig signers of the owner is ", "effect": "EFFECT_ALLOW", diff --git a/concepts/policies/language.mdx b/concepts/policies/language.mdx new file mode 100644 index 00000000..291e82f7 --- /dev/null +++ b/concepts/policies/language.mdx @@ -0,0 +1,188 @@ +--- +title: "Policy language" +description: "This page provides an overview of how to author policies using our policy language. To begin, we'll need to get familiar with the language's grammar, keywords, and types." +sidebarTitle: "Language" +--- + +## Grammar + +The grammar has been designed for flexibility and expressiveness. We currently support the following operations: + +| Operation | Operators | Example | Types | +| ---------- | ---------------------------- | ---------------------------- | ------------------------ | +| logical | &&, \|\| | "true && false" | (bool, bool) -> bool | +| comparison | ==, !=, \<, >, \<=, >= | "1 \< 2" | (int, int) -> bool | +| comparison | ==, != | "'a' != 'b'" | (string, string) -> bool | +| comparison | in | "1 in \[1, 2, 3]" | (T, list\) -> bool | +| access | x\[\] | \[1,2,3]\[0] | (list\) -> T | +| access | x\[\] | "'abc'\[0]" | (string) -> string | +| access | x\[\..\] | \[1,2,3]\[0..2] | (list\) -> (list\) | +| access | x\[\..\] | "'abc'\[0..2]" | (string) -> string | +| access | x.\ | "user.tags" | (struct) -> T | +| function | x.all(item, \) | "\[1,1,1].all(x, x == 1)" | (list\) -> bool | +| function | x.any(item, \) | "\[1,2,3].any(x, x == 1)" | (list\) -> bool | +| function | x.contains(\) | "\[1,2,3].contains(1)" | (list\) -> bool | +| function | x.count() | "\[1,2,3].count()" | (list\) -> int | +| function | x.filter(item, \) | "\[1,2,3].filter(x, x == 1)" | (list\) -> (list\) | + +## Keywords + +Keywords are reserved words that are dynamically interchanged for real values at evaluation time. Each field supports a different set of keywords. + +### Consensus + +| Keyword | Type | Description | +| ------------- | ------------ | ---------------------------------------- | +| **approvers** | list\ | The users that have approved an activity | + +### Condition + +| Keyword | Type | Description | +| --------------- | ------------------- | ------------------------------------------------------------ | +| **activity** | Activity | The activity metadata of the request | +| **eth.tx** | EthereumTransaction | The parsed Ethereum transaction payload (see Appendix below) | +| **solana.tx** | SolanaTransaction | The parsed Solana transaction payload (see Appendix below) | +| **wallet** | Wallet | The target wallet used in sign requests | +| **private_key** | PrivateKey | The target private key used in sign requests | + +## Types + +The language is strongly typed which makes policies easy to author and maintain. + +### Primitive + +| Type | Example | Notes | +| ------------- | --------------- | ------------------------------------------------ | +| **bool** | true | | +| **int** | 256 | i128 | +| **string** | 'a' | only single quotes are supported | +| **list\** | \[1, 2, 3] | a list of type T | +| **struct** | \{ id: 'abc' \} | a key-value map of \{ field:T \} (defined below) | + +### Struct + +| Struct | Field | Type | Description | +| ----------------------- | ------------------------ | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| **User** | id | string | The identifier of the user | +| | tags | list\ | The collection of tags for the user | +| | email | string | The email address of the user | +| | alias | string | The alias of the user | +| **Activity** | type | string | The type of the activity (e.g. ACTIVITY_TYPE_SIGN_TRANSACTION_V2) | +| | resource | string | The resource type the activity targets: `USER`, `PRIVATE_KEY`, `POLICY`, `WALLET`, `ORGANIZATION`, `INVITATION`, `CREDENTIAL`, `CONFIG`, `RECOVERY`, `AUTH`, `PAYMENT_METHOD`, `SUBSCRIPTION` | +| | action | string | The action of the activity: `CREATE`, `UPDATE`, `DELETE`, `SIGN`, `EXPORT`, `IMPORT` | +| **Wallet** | id | string | The identifier of the wallet | +| **Wallet Account** | address | string | The wallet account address | +| **PrivateKey** | id | string | The identifier of the private key | +| | tags | list\ | The collection of tags for the private key | +| **EthereumTransaction** | from | string | The sender address of the transaction | +| | to | string | The receiver address of the transaction (can be an EOA or smart contract) | +| | data | string | The arbitrary calldata of the transaction (hex-encoded) | +| | value | int | The amount being sent (in wei) | +| | gas | int | The maximum allowed gas for the transaction | +| | gas_price | int | The price of gas for the transaction (Note: this field was used in legacy transactions and was replaced with max_fee_per_gas in EIP 1559 transactions, however when evaluating policies on EIP 1559 transactions, this field will be populated with the same value as max_fee_per_gas) | +| | chain_id | int | The chain identifier for the transaction | +| | nonce | int | The nonce for the transaction | +| | max_fee_per_gas | int | EIP 1559 field specifying the max amount to pay per unit of gas for the transaction (Note: This is the sum of the gas for the transaction and the priority fee described below) | +| | max_priority_fee_per_gas | int | EIP 1559 field specifying the max amount of the tip to be paid to miners for the transaction | +| **SolanaTransaction** | account_keys | list\ | The accounts (public keys) involved in the transaction | +| | program_keys | list\ | The programs (public keys) involved in the transaction | +| | instructions | list\ | A list of Instructions (see below) | +| | transfers | list\ | A list of Transfers (see below) | +| | recent_blockhash | string | The recent blockhash specified in a transaction | + +#### Nested Structs + +| Struct | Field | Type | Description | +| ---------------------- | --------------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------ | +| **Instruction** | program_key | string | The program (public key) involved in the instruction | +| | accounts | list\ | A list of Accounts involved in the instruction | +| | instruction_data_hex | string | Raw hex bytes corresponding to instruction data | +| | address_table_lookups | list\ | A list of AddressTableLookups used in the instruction. Learn more [here](https://solana.com/docs/advanced/lookup-tables) | +| **Transfer** | sender | string | A Solana account (public key) | +| | recipient | string | A Solana account (public key) | +| | amount | string | The native SOL amount for the transfer (lamports) | +| **Account** | account_key | string | A Solana account (public key) | +| | signer | boolean | An indicator of whether or not the account is a signer | +| | writable | boolean | An indicator of whether or not the account can perform a write operation | +| **AddressTableLookup** | address_table_key | string | A Solana address (public key) corresponding to the address table | +| | writable_indexes | list\ | Indexes corresponding to accounts that can perform writes | +| | readonly_indexes | list\ | Indexes corresponding to accounts that can only perform reads | + +## Activity Breakdown + +| Resource Type | Action | Activity Type | +| ------------------ | ------ | -----------------------------------------: | +| **ORGANIZATION** | CREATE | ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7 | +| | DELETE | ACTIVITY_TYPE_DELETE_ORGANIZATION | +| | DELETE | ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION | +| **INVITATION** | CREATE | ACTIVITY_TYPE_CREATE_INVITATIONS | +| | DELETE | ACTIVITY_TYPE_DELETE_INVITATION | +| **POLICY** | CREATE | ACTIVITY_TYPE_CREATE_POLICY_V3 | +| | CREATE | ACTIVITY_TYPE_CREATE_POLICIES | +| | UPDATE | ACTIVITY_TYPE_UPDATE_POLICY | +| | DELETE | ACTIVITY_TYPE_DELETE_POLICY | +| **WALLET** | CREATE | ACTIVITY_TYPE_CREATE_WALLET | +| | CREATE | ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS | +| | EXPORT | ACTIVITY_TYPE_EXPORT_WALLET | +| | EXPORT | ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT | +| | IMPORT | ACTIVITY_TYPE_INIT_IMPORT_WALLET | +| | IMPORT | ACTIVITY_TYPE_IMPORT_WALLET | +| | DELETE | ACTIVITY_TYPE_DELETE_WALLETS | +| | UPDATE | ACTIVITY_TYPE_UPDATE_WALLET | +| **PRIVATE_KEY** | CREATE | ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2 | +| | CREATE | ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG | +| | UPDATE | ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG | +| | DELETE | ACTIVITY_TYPE_DISABLE_PRIVATE_KEY | +| | DELETE | ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS | +| | DELETE | ACTIVITY_TYPE_DELETE_PRIVATE_KEYS | +| | EXPORT | ACTIVITY_TYPE_EXPORT_PRIVATE_KEY | +| | IMPORT | ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY | +| | IMPORT | ACTIVITY_TYPE_IMPORT_PRIVATE_KEY | +| | SIGN | ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2 | +| | SIGN | ACTIVITY_TYPE_SIGN_RAW_PAYLOADS | +| | SIGN | ACTIVITY_TYPE_SIGN_TRANSACTION_V2 | +| **USER** | CREATE | ACTIVITY_TYPE_CREATE_USERS_V2 | +| | CREATE | ACTIVITY_TYPE_CREATE_USER_TAG | +| | CREATE | ACTIVITY_TYPE_CREATE_API_ONLY_USERS | +| | UPDATE | ACTIVITY_TYPE_UPDATE_USER | +| | UPDATE | ACTIVITY_TYPE_UPDATE_USER_TAG | +| | DELETE | ACTIVITY_TYPE_DELETE_USERS | +| | DELETE | ACTIVITY_TYPE_DELETE_USER_TAGS | +| **CREDENTIAL** | CREATE | ACTIVITY_TYPE_CREATE_API_KEYS_V2 | +| | CREATE | ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2 | +| | DELETE | ACTIVITY_TYPE_DELETE_API_KEYS | +| | DELETE | ACTIVITY_TYPE_DELETE_AUTHENTICATORS | +| | CREATE | ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS | +| | DELETE | ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS | +| **PAYMENT_METHOD** | UPDATE | ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2 | +| | DELETE | ACTIVITY_TYPE_DELETE_PAYMENT_METHOD | +| **SUBSCRIPTION** | CREATE | ACTIVITY_TYPE_ACTIVATE_BILLING_TIER | +| **CONFIG** | UPDATE | ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS | +| **RECOVERY** | CREATE | ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY | +| **AUTH** | CREATE | ACTIVITY_TYPE_EMAIL_AUTH_V2 | +| | CREATE | ACTIVITY_TYPE_INIT_OTP_AUTH | +| | CREATE | ACTIVITY_TYPE_OTP_AUTH | +| | CREATE | ACTIVITY_TYPE_OAUTH | +| | CREATE | ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2 | + +## Appendix + +### Root quorum activities + +There are a select few activities that are not governed by policies, but rather by an organization's [root quorum](/concepts/users/root-quorum). These activities are: `ACTIVITY\_TYPE\_UPDATE\_ROOT\_QUORUM`, `ACTIVITY\_TYPE\_SET\_ORGANIZATION\_FEATURE`, `ACTIVITY\_TYPE\_REMOVE\_ORGANIZATION\_FEATURE`. For example, if a policy is added that allows a specific non-root user to perform `ACTIVITY\_TYPE\_SET\_ORGANIZATION\_FEATURE` activities, these requests will still fail as they are subject specifically to root quorum. + +### Ethereum + +Our Ethereum policy language (accessible via `eth.tx`) allows for the granular governance of signing Ethereum (EVM-compatible) transactions. Our policy engine exposes a [fairly standard set of properties](https://ethereum.org/en/developers/docs/transactions/#typed-transaction-envelope) belonging to a transaction. + +See the [Policy examples](/concepts/policies/examples) for sample scenarios. + +### Solana + +Similarly, our Solana policy language (accessible via `solana.tx`) allows for control over signing Solana transactions. Note that there are some fundamental differences between the architecture of the two types of transactions, hence the resulting differences in policy structure. Notably, within our policy engine, a Solana transaction contains a list of Transfers, currently corresponding to native SOL transfers. Each transfer within a transaction is considered a separate entity. Here are some approaches you might take to govern native SOL transfers: + +- _All_ transfers need to match the policy condition. Useful for allowlists ([example](/concepts/policies/examples#allow-solana-transactions-that-include-a-transfer-with-only-one-specific-recipient)) +- _Just one_ transfer needs to match the policy condition. Useful for blocklists ([example](/concepts/policies/examples#deny-all-solana-transactions-transferring-to-an-undesired-address)) +- Only match if there is a _single_ transfer in the transaction, _and_ that transfer meets the criteria ([example](/concepts/policies/examples#allow-solana-transactions-that-have-exactly-one-transfer-with-one-specific-recipient)). This is the most secure approach, and thus most restrictive. + +See the [Policy examples](/concepts/policies/examples) for sample scenarios. diff --git a/docs/documentation/concepts/policy-management/Policy-overview.md b/concepts/policies/overview.mdx similarity index 50% rename from docs/documentation/concepts/policy-management/Policy-overview.md rename to concepts/policies/overview.mdx index 4573d947..7720f8ce 100644 --- a/docs/documentation/concepts/policy-management/Policy-overview.md +++ b/concepts/policies/overview.mdx @@ -1,14 +1,9 @@ --- -sidebar_position: 1 -description: Learn about Policies on Turnkey and how to manage them -slug: /concepts/policies/overview -sidebar_label: Overview +title: "Policy overview" +description: "Our policy engine is the foundation for flexible controls and permissions within your organization. This page provides an overview of how to author policies." +sidebarTitle: "Overview" --- -# Policy overview - -Our policy engine is the foundation for flexible controls and permissions within your organization. This page provides an overview of how to author policies. - ## Policy structure Our policies are defined using **JSON**. The `effect` determines if an activity should be allowed or denied based on the evaluation of the `consensus` and `condition` fields. @@ -17,7 +12,7 @@ Our policies are defined using **JSON**. The `effect` determines if an activity #### See below for an example policy that allows a single user to send transactions to a single address -```json JSON +```json { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '4b894565-fa11-42fc-b813-5bf4ea3d53f9')", @@ -29,24 +24,30 @@ Our policies are defined using **JSON**. The `effect` determines if an activity All policies defined within an Organization are evaluated on each request. The image below describes how an activity outcome is determined when resolving multiple policies. The rule follows the below steps: -1. If a quorum of root users takes the action, the final outcome is `OUTCOME_ALLOW` -2. Else if any applicable policy has `EFFECT_DENY`, the final outcome is `OUTCOME_DENY`. This is also referred to as "explicit deny." -3. Else if at least one applicable policy has `EFFECT_ALLOW`, then the final outcome is `OUTCOME_ALLOW` -4. Else the final outcome is `OUTCOME_DENY`. This is also referred to as "implicit deny." In cases of conflicts, `EFFECT_DENY` always wins. + + + If a quorum of root users takes the action, the final outcome is `OUTCOME_ALLOW` + + + Else if any applicable policy has `EFFECT_DENY`, the final outcome is `OUTCOME_DENY`. This is also referred to as "explicit deny." + + + Else if at least one applicable policy has `EFFECT_ALLOW`, then the final outcome is `OUTCOME_ALLOW` + + + Else the final outcome is `OUTCOME_DENY`. This is also referred to as "implicit deny." In cases of conflicts, `EFFECT_DENY` always wins. + + Stated differently: -

- policy_overview -

+ + policy overview + Almost all actions on Turnkey are implicitly denied by default. There are a few exceptions, however: -- Root users bypass any policies. -- All users have implicit GET (read) permissions in their own Organization and any associated Sub-Organizations. -- All users have implicit permission to change their own credentials. -- All users have implicit permission to approve an activity if they were included in consensus (i.e., a user specified as part of the consensus required to approve a SIGN_TRANSACTION activity does not need separate, explicit permission to sign transactions). +* Root users bypass any policies. +* All users have implicit GET (read) permissions in their own Organization and any associated Sub-Organizations. +* All users have implicit permission to change their own credentials. +* All users have implicit permission to approve an activity if they were included in consensus (i.e., a user specified as part of the consensus required to approve a SIGN\_TRANSACTION activity does not need separate, explicit permission to sign transactions). diff --git a/docs/documentation/concepts/policy-management/Policy-quickstart.md b/concepts/policies/quickstart.mdx similarity index 64% rename from docs/documentation/concepts/policy-management/Policy-quickstart.md rename to concepts/policies/quickstart.mdx index 648025e7..9d39b53c 100644 --- a/docs/documentation/concepts/policy-management/Policy-quickstart.md +++ b/concepts/policies/quickstart.mdx @@ -1,47 +1,48 @@ --- -sidebar_position: 2 -description: Add a new user to your Org and try out the policy engine -slug: /concepts/policies/quickstart -sidebar_label: Quickstart +title: "Policy quickstart" +description: "This guide will help you add an additional user to your Turnkey organization and set permissions for that user through Policies. Specifically, we will create an API-only user with permissions to sign transactions to an allowlisted address." +sidebarTitle: "Quickstart" --- -# Policy quickstart - -This guide will help you add an additional user to your Turnkey organization and set permissions for that user through Policies. Specifically, we will create an API-only user with permissions to sign transactions to an allowlisted address. - This assumes that you previously completed the [Sign a transaction](/getting-started/quickstart) guide, and thus have already set up: -- Your Turnkey organization -- An API key for the Root User -- A Wallet with an Ethereum account +* Your Turnkey organization +* An API key for the Root User +* A Wallet with an Ethereum account ## Create your new users New users in your Turnkey organization can be created by navigating to the "Users" tab and clicking "Add User". -![](https://files.readme.io/df58484-Screen_Shot_2023-02-17_at_9.42.29_AM.png "Screen Shot 2023-02-17 at 9.42.29 AM.png") + + Screen Shot 2023-02-17 at 9.42.29 AM.png + In the create user flow, you have the option to grant API key or web access to your new user. For this example, we're going to create an API-only user. -![](https://files.readme.io/71a66d5-Screen_Shot_2023-02-21_at_6.17.11_PM.png "Screen Shot 2023-02-21 at 6.17.11 PM.png") + + Screen Shot 2023-02-21 at 6.17.11 PM.png + Under access types, select "API key". Enter the user name "Policy Test". This will be an API-only user, and therefore an email is not required. Click continue and create a new API key to associate with the user using the following command: -```shell +```bash turnkey generate api-key --organization $ORGANIZATION_ID --key-name policy_test ``` -This will create 2 files, "policy_test.public" and "policy_test.private". Copy the contents of the ".public" file and paste it into "API public key". Finish the create user flow and authenticate. Your new user will appear in the Users table. Note down the user ID as you will use it in the next step. +This will create 2 files, "policy\_test.public" and "policy\_test.private". Copy the contents of the ".public" file and paste it into "API public key". Finish the create user flow and authenticate. Your new user will appear in the Users table. Note down the user ID as you will use it in the next step. ## Create policies for your new users. Next we will create a policy to grant permissions to the new user. Navigate to the "Policies" tab and click on "Add new policy". -![](https://files.readme.io/e5cba15-small-Screen_Shot_2023-05-10_at_1.29.00_PM.png) + + Screen Shot 2023-05-10 at 1.29.00 PM.png + Choose a name and note to describe your new policy. Next, enter the following policy, making sure to replace `` with an Ethereum address of your choosing and `` with the user ID of your recently created API user. -```json JSON +```json { "effect": "EFFECT_ALLOW", "consensus": "approvers.any(user, user.id == '')", @@ -55,7 +56,7 @@ Generate sample transactions using our [transaction tool](https://build.tx.xyz). Next, try signing these two different transactions by replacing `` in the code snippet below. As a reminder, this guide assumes you've completed the [Quickstart](/getting-started/quickstart) guide, and have set `$ORGANIZATION_ID` as an environment variable. -```shell +```json turnkey request --path /public/v1/submit/sign_transaction --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", @@ -72,6 +73,6 @@ You'll see that the activity to allowlisted address comes back as `COMPLETED`, w ## Extra credit -- Try out some of our [policy examples](/concepts/policies/examples) -- Check out the [policy overview](/concepts/policies/overview) -- Learn how to author policies with our [policy language](/concepts/policies/overview) +* Try out some of our [policy examples](/concepts/policies/examples) +* Check out the [policy overview](/concepts/policies/overview) +* Learn how to author policies with our [policy language](/concepts/policies/overview) diff --git a/concepts/resource-limits.mdx b/concepts/resource-limits.mdx new file mode 100644 index 00000000..5e1b33bd --- /dev/null +++ b/concepts/resource-limits.mdx @@ -0,0 +1,29 @@ +--- +title: "Resource Limits" +description: "We have limits on the number of resources within a single organization to avoid performance slowdowns and overly complex permission models. You can scale your organizational resources beyond these limits via . You can create an unlimited number of sub-organizations within a single organization." +mode: wide +--- + +Currently, the resource limits within a single organization are as follows: + +| Resource | Maximum parent org allowance | Maximum sub-org allowance | +| :----------------------------- | :--------------------------: | :-----------------------: | +| Private keys | 1,000 | 1,000 | +| HD Wallets | 100 | 100 | +| HD Wallet Accounts | unlimited | unlimited | +| Users | 100 | 100 | +| Policies | 100 | 100 | +| Invitations | 100 | 100 | +| Tags | 100 | 10 | +| Authenticators per user | 10 | 10 | +| API keys per user (long-lived) | 10 | 10 | +| API keys per user (expiring) | 10 | 10 | +| Sub-Organizations | unlimited | 0 | +| OAuth providers per user | 10 | 10 | + +Note that if you create an expiring API key that would exceed the limit above, Turnkey automatically deletes one of your existing keys using the following priority: + +1. Expired API keys are deleted first +2. If no expired keys exist, the oldest unexpired key is deleted + +If you are approaching any of these limits in your implementation and require support, reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)). diff --git a/concepts/sub-organizations.mdx b/concepts/sub-organizations.mdx new file mode 100644 index 00000000..07b7db1b --- /dev/null +++ b/concepts/sub-organizations.mdx @@ -0,0 +1,34 @@ +--- +title: "Sub-Organizations" +description: "Using Turnkey's flexible infrastructure, you can programmatically create and manage sub-organizations for your end-users. sub-organizations aren't subject to size limits: you can create as many sub-organizations as needed. The parent organization has **read-only** visibility into all of its sub-organizations, and activities performed in sub-organizations roll up to the parent for billing purposes." +--- + +We envision sub-organizations being very useful to model your End-Users if you're a business using Turnkey for key management. Let's explore how. + +## Creating Sub-Organizations + +Creating a new sub-organization is an activity performed by the parent organization. The activity itself takes the following attributes as inputs: + +- organization name +- a list of root users +- a root quorum threshold +- \[optional] a wallet (note: in versions prior to V4, this was a private key) + +Root users can be programmatic or human, with one or many credentials attached. + +## Using Sub-Organizations + +[Sub-Organizations as Wallets](/embedded-wallets/sub-organizations-as-wallets) explains how you might want to use this primitive as a way to model end-user controlled wallets, or custodial wallets. If you have another use-case in mind, or questions/feedback on this page, reach out to [welcome@turnkey.com](mailto:welcome@turnkey.com)! + +## Deleting Sub-Organizations + +To delete a sub-organization, you can use the [delete sub-organization activity](/api-reference/organizations/delete-sub-organization). +Before proceeding, ensure that all private keys and wallets within the sub-organization have been exported to prevent any loss of funds. +Alternatively, you can set the `deleteWithoutExport` parameter to `true` to bypass this requirement. +By default, the `deleteWithoutExport` parameter is set to `false`. + + + This activity must be initiated by a root user in the sub-organization that is + to be deleted. A parent org cannot delete a sub-organization without its + participation. + diff --git a/docs/documentation/concepts/user-management/Best-practices.md b/concepts/users/best-practices.mdx similarity index 75% rename from docs/documentation/concepts/user-management/Best-practices.md rename to concepts/users/best-practices.mdx index d2ea90ae..be625e3a 100644 --- a/docs/documentation/concepts/user-management/Best-practices.md +++ b/concepts/users/best-practices.mdx @@ -1,52 +1,54 @@ --- -sidebar_position: 5 -description: Best practices as you set up users and policies -slug: /concepts/users/best-practices +title: "Best Practices" +description: "This page describes some best practices to consider as you set up users and policies while getting ready for production." --- -# Best practices - -This page describes some best practices to consider as you set up users and policies while getting ready for production. - ## Managing users -**Enforce a security policy of least privilege for your users** -Users on Turnkey should have the minimum required privilege to accomplish their job. When setting up users, consider this for their access type and policies that will grant the user permissions. +**Enforce a security policy of least privilege for your users** + Users on Turnkey should have the minimum required privilege to accomplish their job. When setting up users, consider this for their access type and policies that will grant the user permissions. -**Use user tags to create groups of users with equal permissions** +**Use user tags to create groups of users with equal permissions** Referencing user tags in policies instead of individual users allows for clearer management of permissions. -**When creating new users, consider verifying onboarding before adding tags** +**When creating new users, consider verifying onboarding before adding tags** When inviting a web user to your Turnkey organization, you should consider real-life verification to confirm that they have onboarded correctly before granting that user permissions via tags. Granting tags prior to verification could provide an attacker permissions in your Turnkey organization if they are able to access the signup link. -**Regularly review and remove unused users, user tags, and policies** +**Regularly review and remove unused users, user tags, and policies** If a user is unused or the user has left your company, you should remove them from your Turnkey organization to avoid compromise. -**Attach multiple authenticators to web users** +**Attach multiple authenticators to web users** + This ensures you don't lose access to the user. If an authenticator is lost or stolen, log in immediately to remove that authenticator from the user, or notify someone in your organization with permissions to delete the user. It's best to use multiple types of authenticators to ensure the security of your account if one fails. ## Protecting API keys API keys allow programmatic access to Turnkey, and thus anyone with access to your API key has the same level of access to your Turnkey organization as you do. Consider the following to better protect your API keys and Turnkey organization. -**Don't embed API keys directly in your code** +**Don't embed API keys directly in your code** + This reduces the ways that a hacker could acquire your API key. Our SDKs and CLI enable you to reference your API keys so you don't have to put them directly in your code. -**Use different API-only users for different applications** +**Use different API-only users for different applications** + This allows you to isolate permissions and differentiate activities between those applications. In the case that an API key is lost or stolen, it also allows you to revoke access solely for the affected application. -**Use a secret management system to protect your API keys** +**Use a secret management system to protect your API keys** + Tools like Hashicorp Vault or AWS KMS can help you protect your API key from malicious access. -**Regularly remove any unused API keys** +**Regularly remove any unused API keys** + This reduces the chance that an old key can be used to access your Turnkey organization. ## Setting up policies -**Apply least-privilege permissions** +**Apply least-privilege permissions** + Turnkey's policy engine allows you to enforce permissions at a fine-grained level. When setting up your account, we suggest you use the principle of least privilege, meaning that a user only has the minimum permissions that are necessary to perform their job. Create policies that ensure that users have least-privilege permissions. -**Apply consensus to sensitive actions** +**Apply consensus to sensitive actions** + Sensitive actions like changing policies or signing transactions should be carefully controlled as they can lead to funds being moved off of the platform. You can apply consensus to actions like this to ensure that multiple approvals are required. For example, the policy below specifies that 2 total approvals, including the initiating approval, are required to create a new policy. ```json @@ -58,15 +60,17 @@ Sensitive actions like changing policies or signing transactions should be caref } ``` -**Be especially careful with the ability to add policies** +**Be especially careful with the ability to add policies** + Within this principle of least privilege, Some actions should be treated more sensitively: -- Adding policies -- Signing transactions +* Adding policies +* Signing transactions + +**Use allowlisting if you only send to a set of addresses** -**Use allowlisting if you only send to a set of addresses** If your use case for Turnkey only requires you to send funds to a certain set of crypto addresses, you should set a policy that allowlists those addresses. See below for an example policy. ```json diff --git a/docs/documentation/concepts/user-management/credentials.md b/concepts/users/credentials.mdx similarity index 71% rename from docs/documentation/concepts/user-management/credentials.md rename to concepts/users/credentials.mdx index c947d9a9..daf4ddf1 100644 --- a/docs/documentation/concepts/user-management/credentials.md +++ b/concepts/users/credentials.mdx @@ -1,15 +1,11 @@ --- -sidebar_position: 2 -description: Learn about user credentials and authentication on Turnkey -slug: /concepts/users/credentials +title: "Credentials" +description: "Credentials represent ways for Users to authenticate to Turnkey. All Turnkey Credentials are held by you, the end-user. Turnkey only keeps **public keys**." --- +At the moment, Turnkey supports 2 types of Credentials: -# Credentials - -Credentials represent ways for Users to authenticate to Turnkey. All Turnkey Credentials are held by you, the end-user. Turnkey only keeps **public keys**. At the moment, Turnkey supports 2 types of Credentials: - -- Authenticators -- API Keys +* Authenticators +* API Keys Note that every Turnkey user needs at least one long-lived credential (a passkey, or non-expiring API key). This is to prevent users from getting locked out of their accounts. The exception is if the user belongs to a suborg, and [Email Auth](/authentication/email) is enabled for that sub-organization. @@ -25,4 +21,4 @@ Turnkey API requests are authenticated with API key signatures. When you generat Requests made via SDK or CLI use the private API key to sign requests. Turnkey's public API expects all requests (e.g. to get data or to submit activities) to be signed. -See our [API reference](../../api/#tag/API-Keys/operation/CreateApiKeys) for how to programmatically create API keys. +See our [API reference](/api-reference/api-keys/create-api-keys) for how to programmatically create API keys. diff --git a/concepts/users/introduction.mdx b/concepts/users/introduction.mdx new file mode 100644 index 00000000..1fda70e9 --- /dev/null +++ b/concepts/users/introduction.mdx @@ -0,0 +1,18 @@ +--- +title: "Introduction to users" +description: "Turnkey users are resources within organizations or sub-organizations that can submit activities to Turnkey via a valid credential (e.g., API key, passkey)." +mode: wide +sidebarTitle: "Overview" +--- + + These requests can be made either by making direct API calls or through the Turnkey Dashboard. Users must have at least one valid credential (one of API key, passkey), with upper limits on credentials defined here in our [resource limits](/concepts/resource-limits). Users can also have associated “tags” which are logical groupings that can be referenced in policies. Users can only submit activities within their given organization — they cannot take action across organizations. + +A User's attributes are: + +* UUID: a globally unique ID (e.g. `fc6372d1-723d-4f7e-8554-dc3a212e4aec`), used as a unique identifier for a User in the context of Policies or User Tags, or Quorums. +* Name and email +* Authenticators: a list of authenticators (see below for information) +* API key: a list of API keys (see below for information) +* User tags: a list of User Tag UUIDs + +A **user belongs to one organization**, and one organization can have many (**up to 100**) users. If you need to create more users, consider using Sub-Organizations. diff --git a/docs/documentation/concepts/user-management/Root-quorum.md b/concepts/users/root-quorum.mdx similarity index 80% rename from docs/documentation/concepts/user-management/Root-quorum.md rename to concepts/users/root-quorum.mdx index 6fd77fd8..c35482cd 100644 --- a/docs/documentation/concepts/user-management/Root-quorum.md +++ b/concepts/users/root-quorum.mdx @@ -1,21 +1,16 @@ --- -sidebar_position: 4 -description: Learn about the root quorum and how to manage it -slug: /concepts/users/root-quorum +title: "Root Quorum" +description: "When you create a Turnkey organization, your user is created and will default to being the sole member of the root quorum. Because of the wide scope of permissions, it is important to take care when using any users in the root quorum. The following offers a technical overview and some best practices." --- -# Root quorum - -When you create a Turnkey organization, your user is created and will default to being the sole member of the root quorum. Because of the wide scope of permissions, it is important to take care when using any users in the root quorum. The following offers a technical overview and some best practices. - ## Technical overview The root quorum is a group of users who can execute any action and bypass the policy engine. The root quorum is defined by -- `userIds`: the Ids of users who compose the quorum set -- `threshold`: the number of quorum members required to execute an action as root +* `userIds`: the Ids of users who compose the quorum set +* `threshold`: the number of quorum members required to execute an action as root Actions approved by the root quorum do not go through the policy engine; thus it is impossible to limit root quorum actions with any policies. @@ -47,25 +42,25 @@ Ensure that you have scoped policies for day-to-day actions that you expect to c There are primarily two factors to consider when setting the root quorum -- how hard is to get locked out of root? I.E. how many authenticators need to be lost/destroyed so the threshold cannot be met. -- how many authenticators need to be compromised for an attacker to take root actions? +* how hard is to get locked out of root? I.E. how many authenticators need to be lost/destroyed so the threshold cannot be met. +* how many authenticators need to be compromised for an attacker to take root actions? For example, if a quorum is configured as 2/5, then -- if 4 users lost all their authenticators, no root actions could be taken (including updating the quorum itself). -- if 2 different users authenticators are compromised, an attacker could steal all the organizations funds. +* if 4 users lost all their authenticators, no root actions could be taken (including updating the quorum itself). +* if 2 different users authenticators are compromised, an attacker could steal all the organizations funds. **Example Setups** The below examples are provided as a convenience only. It is up to you to ensure that the root quorum setup you design is appropriate for your particular circumstances in order to secure your organization and minimize the risk of lockout of root functionality. Failure to properly configure your root quorom setup could result in complete loss of funds. -_High Value Organization_ +*High Value Organization* Special users should be created that are only used for root actions. Those users' authenticators should be stored in geographically distributed locations that have personal access controls, are natural disaster resistant, and have redundancy in case of hardware failure. These would only be used in the case of a disaster. For day to day admin operations, admin policies that use consensus can be put in place. These can be a set of finely scoped policies. -_Low Value, End-User Directed Organization_ +*Low Value, End-User Directed Organization* The end-user and the business both have one user in the organization. The root quorum would be configured as a 1/2, which includes the business and end-users' Users. This allows the business support channel to unbrick the user if they lose access to their account or otherwise add overly restrictive policies. diff --git a/concepts/wallets.mdx b/concepts/wallets.mdx new file mode 100644 index 00000000..57cf1707 --- /dev/null +++ b/concepts/wallets.mdx @@ -0,0 +1,124 @@ +--- +title: "Wallets" +description: "A [hierarchical deterministic (HD) Wallet](https://learnmeabitcoin.com/technical/hd-wallets) is a collection of cryptographic private/public key pairs that share a common seed. A Wallet is used to generate Accounts." +--- + +```json +{ + "walletId": "eb98ae4c-07eb-4117-9b2d-8a453c0e1e64", + "walletName": "default" +} +``` + +#### Configuration + +Wallet seeds are generated with a default mnemonic length of 12 words. The [BIP-39 specification](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) supports mnemonic lengths of 12, 15, 18, 21, and 24 words. To enhance your Wallet's security, you may consider opting for a longer mnemonic length. This optional `mnemonicLength` field can be set when creating a Wallet. It's important to note that once the Wallet seed is generated, the mnemonic is permanent and cannot be altered. + +## Accounts + +An account contains the directions for deriving a cryptographic key pair and corresponding address from a Wallet. In practice, this looks like: + +* The Wallet seed and Account curve are used to create a root key pair +* The Account path format and path are used to derive an extended key pair from the root key pair +* The Account address format is used to derive the address from the extended public key + +```json +{ + "address": "0x7aAE6F67798D1Ea0b8bFB5b64231B2f12049DB5e", + "addressFormat": "ADDRESS_FORMAT_ETHEREUM", + "curve": "CURVE_SECP256K1", + "path": "m/44'/60'/0'/0/0", + "pathFormat": "PATH_FORMAT_BIP32", + "walletId": "eb98ae4c-07eb-4117-9b2d-8a453c0e1e64" +} +``` + +**The account address is used to sign with the underlying extended private key.** + +#### HD Wallet Default Paths + +HD wallets use standardized derivation paths to generate multiple accounts from a single seed. These paths follow a specific structure that allows for consistent address generation across different wallet implementations. Here are common default paths for some of the ecosystems supported by Turnkey: + +* Ethereum: `m/44'/60'/0'/0/0` +* Cosmos: `m/44'/118'/0'/0/0` +* Solana: `m/44'/501'/0'/0'` + +For a complete list of coin types and possible HD paths, refer to the [SLIP-0044 specification](https://github.com/satoshilabs/slips/blob/master/slip-0044.md). + +#### Address formats and curves + +See below for specific address formats that you can currently derive on Turnkey: + +| Type | Address Format | Curve | Default HD Path | +| -------- | ----------------------------------------- | ---------------- | ------------------ | +| n/a | ADDRESS\_FORMAT\_COMPRESSED | CURVE\_SECP256K1 | m/0'/0 | +| n/a | ADDRESS\_FORMAT\_UNCOMPRESSED | CURVE\_SECP256K1 | m/0'/0 | +| Ethereum | ADDRESS\_FORMAT\_ETHEREUM | CURVE\_SECP256K1 | m/44'/60'/0'/0/0 | +| Cosmos | ADDRESS\_FORMAT\_COSMOS | CURVE\_SECP256K1 | m/44'/118'/0'/0/0 | +| Solana | ADDRESS\_FORMAT\_SOLANA | CURVE\_ED25519 | m/44'/501'/0'/0 | +| Tron | ADDRESS\_FORMAT\_TRON | CURVE\_SECP256K1 | m/44'/195'/0'/0/0 | +| Sui | ADDRESS\_FORMAT\_SUI | CURVE\_ED25519 | m/44'/784'/0'/0/0 | +| Aptos | ADDRESS\_FORMAT\_APTOS | CURVE\_ED25519 | m/44'/637'/0'/0'/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2PKH | CURVE\_SECP256K1 | m/44'/0'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2SH | CURVE\_SECP256K1 | m/49'/0'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2WPKH | CURVE\_SECP256K1 | m/84'/0'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2WSH | CURVE\_SECP256K1 | m/48'/0'/0'/2'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_MAINNET\_P2TR | CURVE\_SECP256K1 | m/86'/0'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2PKH | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2SH | CURVE\_SECP256K1 | m/49'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2WPKH | CURVE\_SECP256K1 | m/84'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2WSH | CURVE\_SECP256K1 | m/48'/1'/0'/2'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_TESTNET\_P2TR | CURVE\_SECP256K1 | m/86'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2PKH | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2SH | CURVE\_SECP256K1 | m/49'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2WPKH | CURVE\_SECP256K1 | m/84'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2WSH | CURVE\_SECP256K1 | m/48'/1'/0'/2'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_SIGNET\_P2TR | CURVE\_SECP256K1 | m/86'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2PKH | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2SH | CURVE\_SECP256K1 | m/49'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2WPKH | CURVE\_SECP256K1 | m/84'/1'/0'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2WSH | CURVE\_SECP256K1 | m/48'/1'/0'/2'/0/0 | +| Bitcoin | ADDRESS\_FORMAT\_BITCOIN\_REGTEST\_P2TR | CURVE\_SECP256K1 | m/86'/1'/0'/0/0 | +| Sei | ADDRESS\_FORMAT\_SEI | CURVE\_ED25519 | m/44'/118'/0'/0/0 | +| Stellar | ADDRESS\_FORMAT\_XLM | CURVE\_ED25519 | m/44'/148'/0'/0'/0 | +| Dogecoin | ADDRESS\_FORMAT\_DOGE\_MAINNET | CURVE\_SECP256K1 | m/44'/3'/0'/0/0 | +| Dogecoin | ADDRESS\_FORMAT\_DOGE\_TESTNET | CURVE\_SECP256K1 | m/44'/1'/0'/0/0 | +| TON | ADDRESS\_FORMAT\_TON\_V3R2 | CURVE\_ED25519 | m/44'/607'/0'/0/0 | +| TON | ADDRESS\_FORMAT\_TON\_V4R2 | CURVE\_ED25519 | m/44'/607'/0'/0/0 | +| XRP | ADDRESS\_FORMAT\_XRP | CURVE\_SECP256K1 | m/44'/144'/0'/0/0 | + +#### Where can I learn more? + +In addition to the guide mentioned above on [HD Wallets](https://learnmeabitcoin.com/technical/hd-wallets), there is also a page specifically on [Derivation Paths](https://learnmeabitcoin.com/technical/derivation-paths). + +#### What if I don't see the address format for my network? + +You can use `ADDRESS_FORMAT_COMPRESSED` to generate a public key which can be used to sign with. + +#### What if I don't see the curve for my network? + +Contact us at [hello@turnkey.com](mailto:hello@turnkey.com). + +## Delete wallets + +To delete wallets you can call the [delete wallets activity](/api-reference/wallets/delete-wallets). Before deleting a wallet it must have been exported to prevent loss of funds, or you can pass in the `deleteWithoutExport` parameter with the value `true` to override this. The `deleteWithoutExport` parameter, if not passed in, is default `false`. Note that this activity must be initiated by the wallet owner. + +## Private Keys + +Turnkey also supports raw private keys, but we recommend using Wallets since they offer several advantages: + +* Wallets can be used across various cryptographic curves +* Wallets can generate millions of addresses for various digital assets +* Wallets can be represented by a checksummed, mnemonic phrase making them easier to backup and recover + +## Export keys + +Exporting on Turnkey enables you or your end users to export a copy of a Wallet or Private Key from our system at any time. While most Turnkey users opt to keep Wallets within Turnkey's secure infrastructure, the export functionality means you are never locked into Turnkey, and gives you the freedom to design your own backup processes as you see fit. Check out our [Export Wallet guide](/wallets/export-wallets) to allow your users to securely export their wallets. + +## Import keys + +Importing on Turnkey enables you or your end users to import a Wallet or Private Key to our system. Check out our [Import Wallet guide](/wallets/import-wallets) to allow your users to securely import their wallets. + +## Delete keys + +To delete prviate keys you can call the [delete private keys activity](/api-reference/private-keys/delete-private-keys). Before deleting a private key it must have been exported to prevent loss of funds, or you can pass in the `deleteWithoutExport` parameter with the value `true` to override this. The `deleteWithoutExport` parameter, if not passed in, is default `false`. Note that this activity must be initiated by the private key owner. diff --git a/docs/documentation/developer-reference/api-overview/errors.md b/developer-reference/api-overview/errors.mdx similarity index 71% rename from docs/documentation/developer-reference/api-overview/errors.md rename to developer-reference/api-overview/errors.mdx index a52be9f3..595b3e35 100644 --- a/docs/documentation/developer-reference/api-overview/errors.md +++ b/developer-reference/api-overview/errors.mdx @@ -1,26 +1,21 @@ --- -sidebar_position: 5 -description: Enumerating all errors received using the Turnkey API -slug: /developer-reference/api-overview/errors +title: "Errors" +description: "An error returned by the Turnkey API might look something like this:" --- -# Errors - -An error returned by the Turnkey API might look something like this: - -``` +```bash Turnkey error 3: organization mismatch: request is targeting organization ("USER SUB ORG"), but voters are in organization ("OUR MAIN ORG") ``` Within this error message there are a few different parts that are worth breaking down. First the GRPC Error code. This looks like this: -``` +```bash Turnkey error 3: ``` This GRPC error wraps what we call a Turnkey Error which looks something like: -``` +```bash organization mismatch: request is targeting organization ("USER SUB ORG"), but voters are in organization ("OUR MAIN ORG") ``` @@ -88,37 +83,37 @@ The below table enumerates all errors across different actions that can be taken ## GRPC Error Codes -Turnkey uses GRPC internally to communicate with our internal services whenever an API request is made. Due to this some errors will be wrapped with GRPC error messages. These error codes are listed below for your convenience, however these will not remain in Turnkey error messages forever and you should **not** do error handling based on these codes as these could be removed at any time. In the following example `Turnkey error 3:` represents a grpc error (error code 3, INVALID_ARGUMENT) wrapping a Turnkey error. +Turnkey uses GRPC internally to communicate with our internal services whenever an API request is made. Due to this some errors will be wrapped with GRPC error messages. These error codes are listed below for your convenience, however these will not remain in Turnkey error messages forever and you should **not** do error handling based on these codes as these could be removed at any time. In the following example `Turnkey error 3:` represents a grpc error (error code 3, INVALID\_ARGUMENT) wrapping a Turnkey error. Example -``` +```bash Turnkey error 3: organization mismatch: request is targeting organization ("USER SUB ORG"), but voters are in organization ("OUR MAIN ORG") ``` ### GRPC Status Codes Reference -| Code | Number | Description | -| ------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| OK | 0 | Not an error; returned on success. | -| CANCELLED | 1 | The operation was cancelled, typically by the caller. | -| UNKNOWN | 2 | Unknown error. For example, this error may be returned when a `Status` value received from another address space belongs to an error space that is not known in this address space. Also errors raised by APIs that do not return enough error information may be converted to this error. | -| INVALID_ARGUMENT | 3 | The client specified an invalid argument. Note that this differs from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments that are problematic regardless of the state of the system (e.g., a malformed file name). | -| DEADLINE_EXCEEDED | 4 | The deadline expired before the operation could complete. For operations that change the state of the system, this error may be returned even if the operation has completed successfully. For example, a successful response from a server could have been delayed long | -| NOT_FOUND | 5 | Some requested entity (e.g., file or directory) was not found. Note to server developers: if a request is denied for an entire class of users, such as gradual feature rollout or undocumented allowlist, `NOT_FOUND` may be used. If a request is denied for some users within a class of users, such as user-based access control, `PERMISSION_DENIED` must be used. | -| ALREADY_EXISTS | 6 | The entity that a client attempted to create (e.g., file or directory) already exists. | -| PERMISSION_DENIED | 7 | The caller does not have permission to execute the specified operation. `PERMISSION_DENIED` must not be used for rejections caused by exhausting some resource (use `RESOURCE_EXHAUSTED` instead for those errors). `PERMISSION_DENIED` must not be used if the caller can not be identified (use `UNAUTHENTICATED` instead for those errors). This error code does not imply the request is valid or the requested entity exists or satisfies other pre-conditions. | -| RESOURCE_EXHAUSTED | 8 | Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space. | -| FAILED_PRECONDITION | 9 | The operation was rejected because the system is not in a state required for the operation's execution. For example, the directory to be deleted is non-empty, an rmdir operation is applied to a non-directory, etc. Service implementors can use the following guidelines to decide between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: (a) Use `UNAVAILABLE` if the client can retry just the failing call. (b) Use `ABORTED` if the client should retry at a higher level (e.g., when a client-specified test-and-set fails, indicating the client should restart a read-modify-write sequence). (c) Use `FAILED_PRECONDITION` if the client should not retry until the system state has been explicitly fixed. E.g., if an "rmdir" fails because the directory is non-empty, `FAILED_PRECONDITION` should be returned since the client should not retry unless the files are deleted from the directory. | -| ABORTED | 10 | The operation was aborted, typically due to a concurrency issue such as a sequencer check failure or transaction abort. See the guidelines above for deciding between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`. | -| OUT_OF_RANGE | 11 | The operation was attempted past the valid range. E.g., seeking or reading past end-of-file. Unlike `INVALID_ARGUMENT`, this error indicates a problem that may be fixed if the system state changes. For example, a 32-bit file system will generate `INVALID_ARGUMENT` if asked to read at an offset that is not in the range [0,2^32-1], but it will generate `OUT_OF_RANGE` if asked to read from an offset past the current file size. There is a fair bit of overlap between `FAILED_PRECONDITION` and `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific error) when it applies so that callers who are iterating through a space can easily look for an `OUT_OF_RANGE` error to detect when they are done. | -| UNIMPLEMENTED | 12 | The operation is not implemented or is not supported/enabled in this service. | -| INTERNAL | 13 | Internal errors. This means that some invariants expected by the underlying system have been broken. This error code is reserved for serious errors. | -| UNAVAILABLE | 14 | The service is currently unavailable. This is most likely a transient condition, which can be corrected by retrying with a backoff. Note that it is not always safe to retry non-idempotent operations. | -| DATA_LOSS | 15 | Unrecoverable data loss or corruption. | -| UNAUTHENTICATED | 16 | The request does not have valid authentication credentials for the operation. | - -Source: https://grpc.io/docs/guides/status-codes/ +| Code | Number | Description | +| -------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| OK | 0 | Not an error; returned on success. | +| CANCELLED | 1 | The operation was cancelled, typically by the caller. | +| UNKNOWN | 2 | Unknown error. For example, this error may be returned when a `Status` value received from another address space belongs to an error space that is not known in this address space. Also errors raised by APIs that do not return enough error information may be converted to this error. | +| INVALID\_ARGUMENT | 3 | The client specified an invalid argument. Note that this differs from `FAILED_PRECONDITION`. `INVALID_ARGUMENT` indicates arguments that are problematic regardless of the state of the system (e.g., a malformed file name). | +| DEADLINE\_EXCEEDED | 4 | The deadline expired before the operation could complete. For operations that change the state of the system, this error may be returned even if the operation has completed successfully. For example, a successful response from a server could have been delayed long | +| NOT\_FOUND | 5 | Some requested entity (e.g., file or directory) was not found. Note to server developers: if a request is denied for an entire class of users, such as gradual feature rollout or undocumented allowlist, `NOT_FOUND` may be used. If a request is denied for some users within a class of users, such as user-based access control, `PERMISSION_DENIED` must be used. | +| ALREADY\_EXISTS | 6 | The entity that a client attempted to create (e.g., file or directory) already exists. | +| PERMISSION\_DENIED | 7 | The caller does not have permission to execute the specified operation. `PERMISSION_DENIED` must not be used for rejections caused by exhausting some resource (use `RESOURCE_EXHAUSTED` instead for those errors). `PERMISSION_DENIED` must not be used if the caller can not be identified (use `UNAUTHENTICATED` instead for those errors). This error code does not imply the request is valid or the requested entity exists or satisfies other pre-conditions. | +| RESOURCE\_EXHAUSTED | 8 | Some resource has been exhausted, perhaps a per-user quota, or perhaps the entire file system is out of space. | +| FAILED\_PRECONDITION | 9 | The operation was rejected because the system is not in a state required for the operation's execution. For example, the directory to be deleted is non-empty, an rmdir operation is applied to a non-directory, etc. Service implementors can use the following guidelines to decide between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`: (a) Use `UNAVAILABLE` if the client can retry just the failing call. (b) Use `ABORTED` if the client should retry at a higher level (e.g., when a client-specified test-and-set fails, indicating the client should restart a read-modify-write sequence). (c) Use `FAILED_PRECONDITION` if the client should not retry until the system state has been explicitly fixed. E.g., if an "rmdir" fails because the directory is non-empty, `FAILED_PRECONDITION` should be returned since the client should not retry unless the files are deleted from the directory. | +| ABORTED | 10 | The operation was aborted, typically due to a concurrency issue such as a sequencer check failure or transaction abort. See the guidelines above for deciding between `FAILED_PRECONDITION`, `ABORTED`, and `UNAVAILABLE`. | +| OUT\_OF\_RANGE | 11 | The operation was attempted past the valid range. E.g., seeking or reading past end-of-file. Unlike `INVALID_ARGUMENT`, this error indicates a problem that may be fixed if the system state changes. For example, a 32-bit file system will generate `INVALID_ARGUMENT` if asked to read at an offset that is not in the range \[0,2^32-1], but it will generate `OUT_OF_RANGE` if asked to read from an offset past the current file size. There is a fair bit of overlap between `FAILED_PRECONDITION` and `OUT_OF_RANGE`. We recommend using `OUT_OF_RANGE` (the more specific error) when it applies so that callers who are iterating through a space can easily look for an `OUT_OF_RANGE` error to detect when they are done. | +| UNIMPLEMENTED | 12 | The operation is not implemented or is not supported/enabled in this service. | +| INTERNAL | 13 | Internal errors. This means that some invariants expected by the underlying system have been broken. This error code is reserved for serious errors. | +| UNAVAILABLE | 14 | The service is currently unavailable. This is most likely a transient condition, which can be corrected by retrying with a backoff. Note that it is not always safe to retry non-idempotent operations. | +| DATA\_LOSS | 15 | Unrecoverable data loss or corruption. | +| UNAUTHENTICATED | 16 | The request does not have valid authentication credentials for the operation. | + +Source: [https://grpc.io/docs/guides/status-codes/](https://grpc.io/docs/guides/status-codes/) ## Troubleshooting @@ -126,37 +121,35 @@ Source: https://grpc.io/docs/guides/status-codes/ Common causes: -- An unknown organization ID was passed in a request made to the Turnkey API +* An unknown organization ID was passed in a request made to the Turnkey API Troubleshooting tips: -- Confirm that you are using the proper Organization ID. All Turnkey resources are identified with a UUID, so confirm you are not passing a different resource's UUID as the organization ID in your request. +* Confirm that you are using the proper Organization ID. All Turnkey resources are identified with a UUID, so confirm you are not passing a different resource's UUID as the organization ID in your request. ---- ### malformed organization ID provided Common causes: -- An improperly formatted organization ID UUID was passed in a request made to the Turnkey API +* An improperly formatted organization ID UUID was passed in a request made to the Turnkey API Troubleshooting tips: -- Confirm the the UUID conforms to the UUID standard `XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` +* Confirm the the UUID conforms to the UUID standard `XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX` ---- ### bad request body Common causes: -- A malformed request body was passed in a request made to the Turnky API +* A malformed request body was passed in a request made to the Turnky API Troubleshooting tips: -- A typical activity request has the `type`, `timestampMS`, and `organizationId` parameters at the top level and then a `parameters` parameter with more specific parameters based on the request type. For example a CREATE_WALLET activity request body might look something like this: +* A typical activity request has the `type`, `timestampMS`, and `organizationId` parameters at the top level and then a `parameters` parameter with more specific parameters based on the request type. For example a CREATE\_WALLET activity request body might look something like this: -``` +```json { "type": "ACTIVITY_TYPE_CREATE_WALLET", "timestampMs": "", @@ -176,653 +169,556 @@ Troubleshooting tips: } ``` -- A get resource request body might look slightly different with less fields. An example of a GET_WALLET request body looks something like this: +* A get resource request body might look slightly different with less fields. An example of a GET\_WALLET request body looks something like this: -``` +```json { "organizationId": "string", "walletId": "string" } ``` ---- - ### api operations disabled Common causes: -- Turnkey has disabled API operations globally. +* Turnkey has disabled API operations globally. Troubleshooting tips: -- This situation will only happen in the most extreme case and should not be something you need to worry about. +* This situation will only happen in the most extreme case and should not be something you need to worry about. ---- -### this organization cannot execute activities because it is over its allotted quota. Please reach out to the Turnkey team (help@turnkey.com) for more information. +### this organization cannot execute activities because it is over its allotted quota. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: -- You have exceeded your monthly signing quota. The first 25 signatures a month are free for "free" users. -- You have reached a resource limit on a particular resource. You can find out about our resource limits [here](/concepts/resource-limits). +* You have exceeded your monthly signing quota. The first 25 signatures a month are free for "free" users. +* You have reached a resource limit on a particular resource. You can find out about our resource limits [here](/concepts/resource-limits). Troubleshooting tips: -- If you need to increase your signature limit take a look at our [pricing page](https://www.turnkey.com/pricing) and contact us at help@turnkey.com! -- Resource limits are imposed globally and cannot be increased, speak with our team at help@turnkey.com to understand how to better integrate Turnkey with your system to utilize Turnkey to its highest potential. +* If you need to increase your signature limit take a look at our [pricing page](https://www.turnkey.com/pricing) and contact us at [help@turnkey.com](mailto:help@turnkey.com)! +* Resource limits are imposed globally and cannot be increased, speak with our team at [help@turnkey.com](mailto:help@turnkey.com) to understand how to better integrate Turnkey with your system to utilize Turnkey to its highest potential. ---- - -### this sub-organization cannot execute activities because its parent is over its allotted quota. Please reach out to the Turnkey team (help@turnkey.com) for more information. +### this sub-organization cannot execute activities because its parent is over its allotted quota. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: -- You have exceeded your monthly signing quota. The first 25 signatures a month are free for "free" users. -- You have reached a resource limit on a particular resource. You can find out about our resource limits [here](/concepts/resource-limits). +* You have exceeded your monthly signing quota. The first 25 signatures a month are free for "free" users. +* You have reached a resource limit on a particular resource. You can find out about our resource limits [here](/concepts/resource-limits). Troubleshooting tips: -- If you need to increase your signature limit take a look at our [pricing page](https://www.turnkey.com/pricing) and contact us at help@turnkey.com! -- Resource limits are imposed globally and cannot be increased, speak with our team at help@turnkey.com to understand how to better integrate Turnkey with your system to utilize Turnkey to its highest potential. - ---- - -### this organization cannot execute activities because it has been rate limited. Please reach out to the Turnkey team (help@turnkey.com) for more information. +* If you need to increase your signature limit take a look at our [pricing page](https://www.turnkey.com/pricing) and contact us at [help@turnkey.com](mailto:help@turnkey.com)! +* Resource limits are imposed globally and cannot be increased, speak with our team at [help@turnkey.com](mailto:help@turnkey.com) to understand how to better integrate Turnkey with your system to utilize Turnkey to its highest potential. +### this organization cannot execute activities because it has been rate limited. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: -- You have exceeded your rate limit. We need to maintain a per-customer rate limit to ensure that the service we provide to all of our customers service can be exceptional. +* You have exceeded your rate limit. We need to maintain a per-customer rate limit to ensure that the service we provide to all of our customers service can be exceptional. Troubleshooting tips: -- If you are interested in increasing your rate limit reach out to us at help@turnkey.com! +* If you are interested in increasing your rate limit reach out to us at [help@turnkey.com](mailto:help@turnkey.com)! ---- -### this sub-organization cannot execute activities because its parent has been rate limited. Please reach out to the Turnkey team (help@turnkey.com) for more information. +### this sub-organization cannot execute activities because its parent has been rate limited. Please reach out to the Turnkey team ([help@turnkey.com](mailto:help@turnkey.com)) for more information. Common causes: -- You have exceeded your rate limit. We need to maintain a per-customer rate limit to ensure that the service we provide to all of our customers service can be exceptional. +* You have exceeded your rate limit. We need to maintain a per-customer rate limit to ensure that the service we provide to all of our customers service can be exceptional. Troubleshooting tips: -- If you are interested in increasing your rate limit reach out to us at help@turnkey.com! +* If you are interested in increasing your rate limit reach out to us at [help@turnkey.com](mailto:help@turnkey.com)! ---- ### request not authorized - Common causes: -- A user that created a request is not allowed to complete the action that was requested. -- For example a parent-organization trying to create a wallet within a sub-organization that does not have a delegated access API key. +* A user that created a request is not allowed to complete the action that was requested. +* For example a parent-organization trying to create a wallet within a sub-organization that does not have a delegated access API key. Troubleshooting tips: -- Confirm that you are using the correct credentials for the request you are making. -- Confirm that all necessary [policies](/concepts/policies/overview) are in place so that the action that is requested can be performed. +* Confirm that you are using the correct credentials for the request you are making. +* Confirm that all necessary [policies](/concepts/policies/overview) are in place so that the action that is requested can be performed. ---- ### no valid authentication signature found for request Common causes: -- No signature, or [stamp](/developer-reference/api-overview/stamps), is attached to a request. All requests made to Turnkey's api must be stamped so that Turnkey can authenticate and authorize the user who performed the request. +* No signature, or [stamp](/developer-reference/api-overview/stamps), is attached to a request. All requests made to Turnkey's api must be stamped so that Turnkey can authenticate and authorize the user who performed the request. Troubleshooting tips: -- Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some inforamtion about stamps, what they are, and how they are created. -- At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! - ---- +* Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some inforamtion about stamps, what they are, and how they are created. +* At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### could not find public key in organization Common causes: -- The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. +* The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticators to the organization you are targeting. -- Ensure that you are targeting the proper organization. +* Ensure that you have added the proper authenticators to the organization you are targeting. +* Ensure that you are targeting the proper organization. ---- ### failed while looking up public key in parent organization Common causes: -- The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. +* The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticators to the organization you are targeting. -- Ensure that you are targeting the proper organization. - ---- +* Ensure that you have added the proper authenticators to the organization you are targeting. +* Ensure that you are targeting the proper organization. ### could not find public key in organization or its parent organization Common causes: -- The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. +* The public key corresponding to the signature in a stamp is not found in the organization the request is targeting. This means that a request was formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticators to the organization you are targeting. -- Ensure that you are targeting the proper organization. +* Ensure that you have added the proper authenticators to the organization you are targeting. +* Ensure that you are targeting the proper organization. ---- ### could not verify WebAuthN signature Common causes: -- The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. Again this means the request is formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. +* The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. Again this means the request is formatted properly, but the authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticators to the organization you are targeting. -- Ensure that you are targeting the proper organization. - ---- +* Ensure that you have added the proper authenticators to the organization you are targeting. +* Ensure that you are targeting the proper organization. ### credential ID could not be found in organization or its parent organization Common causes: -- Turnkey cannot translate a public key obtained from a stamp that was created with a WebAuthn authenticator to a parent organization or one of its corresponding sub-organizations that the request was made for. +* Turnkey cannot translate a public key obtained from a stamp that was created with a WebAuthn authenticator to a parent organization or one of its corresponding sub-organizations that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticators to the organization you are targeting. -- Ensure that you are targeting the proper organization. - ---- +* Ensure that you have added the proper authenticators to the organization you are targeting. +* Ensure that you are targeting the proper organization. ### public key could not be found in organization or its parent organization Common causes: -- Turnkey cannot translate a public key obtained from a stamp to a parent organization or one of its corresponding sub-organizations that the request was made for. +* Turnkey cannot translate a public key obtained from a stamp to a parent organization or one of its corresponding sub-organizations that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticators to the organization you are targeting. -- Ensure that you are targeting the proper organization. - ---- +* Ensure that you have added the proper authenticators to the organization you are targeting. +* Ensure that you are targeting the proper organization. ### more than one suborg associated with a credential ID - Common causes: -- This error occurs for requests like [whoami](https://docs.turnkey.com/api#tag/Sessions/operation/GetWhoami). In particular this request tries to go backwards from the stamp to the public key then to a corresponding sub-orgnaization under a parent organization. If there are multiple sub-organizations with the same public key corresponding to an authenticator it is unknown who is initiating that particular request without more context. +* This error occurs for requests like [whoami](/api-reference/sessions/who-am-i). In particular this request tries to go backwards from the stamp to the public key then to a corresponding sub-orgnaization under a parent organization. If there are multiple sub-organizations with the same public key corresponding to an authenticator it is unknown who is initiating that particular request without more context. Troubleshooting tips: -- Inlcude the sub-organization ID in the whoami request body. -- Avoid including the same authenticator in multiple sub-organizations - ---- +* Inlcude the sub-organization ID in the whoami request body. +* Avoid including the same authenticator in multiple sub-organizations ### more than one suborg associated with a public key Common causes: -- This error occurs for requests like [whoami](https://docs.turnkey.com/api#tag/Sessions/operation/GetWhoami). In particular this request tries to go backwards from the stamp to the public key then to a corresponding sub-orgnaization under a parent organization. If there are multiple sub-organizations with the same public key it is unknown who is initiating that particular request without more context. +* This error occurs for requests like [whoami](/api-reference/sessions/who-am-i). In particular this request tries to go backwards from the stamp to the public key then to a corresponding sub-orgnaization under a parent organization. If there are multiple sub-organizations with the same public key it is unknown who is initiating that particular request without more context. Troubleshooting tips: -- Inlcude the sub-organization ID in the whoami request body. -- Avoid including the same authenticator in multiple sub-organizations - ---- +* Inlcude the sub-organization ID in the whoami request body. +* Avoid including the same authenticator in multiple sub-organizations ### could not verify api key signature Common causes: -- The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the api-key used to create the request is not associated with the organization that the request was made for. +* The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the api-key used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper api-keys to the organization you are targeting. -- Ensure that you are targeting the proper organization. - ---- +* Ensure that you have added the proper api-keys to the organization you are targeting. +* Ensure that you are targeting the proper organization. ### expired api key Common causes: -- The API key used for the request has expired +* The API key used for the request has expired Troubleshooting tips: -- Create a new API key to use for the request -- Create an API key that doesn't expire +* Create a new API key to use for the request +* Create an API key that doesn't expire ---- ### malformed activity stamp Common causes: -- The stamp attached to a request is not formatted properly. +* The stamp attached to a request is not formatted properly. Troubleshooting tips: -- Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some inforamtion about stamps, what they are, and how they are created. -- At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! - ---- +* Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some inforamtion about stamps, what they are, and how they are created. +* At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### could not extract webauthn stamp Common causes: -- A stamp is not attached to a request. +* A stamp is not attached to a request. Troubleshooting tips: -- Take a look at the page on [stamps](../api-overview/stamps.md) to get some inforamtion about stamps, what they are, and how they are created. -- At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! - ---- +* Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some inforamtion about stamps, what they are, and how they are created. +* At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### could not extract api key stamp Common causes: -- A stamp is not attached to a request. +* A stamp is not attached to a request. Troubleshooting tips: -- Take a look at the page on [stamps](../api-overview/stamps.md) to get some inforamtion about stamps, what they are, and how they are created. -- At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! +* Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some inforamtion about stamps, what they are, and how they are created. +* At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ---- ### cannot authenticate public API activity request without a stamp (X-Stamp/X-Stamp-Webauthn header) Common causes: -- A stamp is not attached to a request. +* A stamp is not attached to a request. Troubleshooting tips: -- Take a look at the page on [stamps](../api-overview/stamps.md) to get some inforamtion about stamps, what they are, and how they are created. -- At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! - ---- +* Take a look at the page on [stamps](/developer-reference/api-overview/stamps) to get some inforamtion about stamps, what they are, and how they are created. +* At a base level our SDK's abstract away the complicated stamping process for you. [Here](https://github.com/tkhq/sdk/tree/main/examples) are some example projects with our JS/TS SDK to get you started! ### webauthn authenticator not found in organization Common causes: -- The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the webauthn authenticator used to create the request is not associated with the organization that the request was made for. +* The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the webauthn authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticator to the organization you are targeting. -- Ensure that you are targeting the proper organization. - ---- +* Ensure that you have added the proper authenticator to the organization you are targeting. +* Ensure that you are targeting the proper organization. ### webauthn authenticator not found in organization or parent organization Common causes: -- The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the webauthn authenticator used to create the request is not associated with the organization that the request was made for. +* The signature used to create a stamp for a request cannot be verified for the organization the request is targeting. This means the request is formatted properly, but the webauthn authenticator used to create the request is not associated with the organization that the request was made for. Troubleshooting tips: -- Ensure that you have added the proper authenticator to the organization you are targeting. -- Ensure that you are targeting the proper organization. - ---- +* Ensure that you have added the proper authenticator to the organization you are targeting. +* Ensure that you are targeting the proper organization. ### invalid payload encoding Common causes: -- This error is specific to the [sign_raw_payload](https://docs.turnkey.com/api#tag/Signing/operation/SignRawPayload) endpoint. A valid encoding needs to be passed so that Turnkey can properly sign the requested message. +* This error is specific to the [sign\_raw\_payload](/api-reference/signing/sign-raw-payload) endpoint. A valid encoding needs to be passed so that Turnkey can properly sign the requested message. Troubleshooting tips: -- Use a valid encoding scheme from the following: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8` - ---- +* Use a valid encoding scheme from the following: `PAYLOAD_ENCODING_HEXADECIMAL`, `PAYLOAD_ENCODING_TEXT_UTF8` ### invalid hash function Common causes: -- This error is specific to the [sign_raw_payload](https://docs.turnkey.com/api#tag/Signing/operation/SignRawPayload) endpoint. A valid hash function needs to be passed so that Turnkey can properly hash and sign the requested message. +* This error is specific to the [sign\_raw\_payload](/api-reference/signing/sign-raw-payload) endpoint. A valid hash function needs to be passed so that Turnkey can properly hash and sign the requested message. Troubleshooting tips: -- Use a valid hash function scheme from the following: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` -- More information about `HASH_FUNCTION_NO_OP` [here](/faq#what-does-hash_function_no_op-mean) -- More information about `HASH_FUNCTION_NOT_APPLICABLE` [here](/faq#what-is-hash_function_not_applicable-and-how-does-it-differ-from-hash_function_no_op) - ---- +* Use a valid hash function scheme from the following: `HASH_FUNCTION_NO_OP`, `HASH_FUNCTION_SHA256`, `HASH_FUNCTION_KECCAK256`, `HASH_FUNCTION_NOT_APPLICABLE` +* More information about `HASH_FUNCTION_NO_OP` [here](/faq#what-does-hash_function_no_op-mean) +* More information about `HASH_FUNCTION_NOT_APPLICABLE` [here](/faq#what-is-hash_function_not_applicable-and-how-does-it-differ-from-hash_function_no_op) ### invalid magic link template Common causes: -- The email template provided for specific activities is invalid. +* The email template provided for specific activities is invalid. Troubleshooting tips: -- Read more about [bespoke email templates](/embedded-wallets/sub-organization-auth#bespoke-email-templates) -- Reach out to Turnkey at help@turnkey.com! - ---- +* Read more about [bespoke email templates](/embedded-wallets/sub-organization-auth#bespoke-email-templates) +* Reach out to Turnkey at [help@turnkey.com](mailto:help@turnkey.com)! ### failed to get email template contents Common causes: -- There was an error getting the email template for an associated activity +* There was an error getting the email template for an associated activity Troubleshooting tips: -- Reach out to Turnkey at help@turnkey.com! - ---- +* Reach out to Turnkey at [help@turnkey.com](mailto:help@turnkey.com)! ### failed to unmarshal template variables Common causes: -- There are invalid template variables used in your email template. +* There are invalid template variables used in your email template. Troubleshooting tips: -- Read more about [bespoke email templates](/embedded-wallets/sub-organization-auth#bespoke-email-templates) -- Reach out to Turnkey at help@turnkey.com! - ---- +* Read more about [bespoke email templates](/embedded-wallets/sub-organization-auth#bespoke-email-templates) +* Reach out to Turnkey at [help@turnkey.com](mailto:help@turnkey.com)! ### authentication failed Common causes: -- Turnkey was unable to authenticate the user based on the stamp provided. +* Turnkey was unable to authenticate the user based on the stamp provided. Troubleshooting tips: -- Ensure that all proper authenticators and api-keys have been added to the organization. -- Read more about how to create a stamp for a request [here](/developer-reference/api-overview/stamps) - ---- +* Ensure that all proper authenticators and api-keys have been added to the organization. +* Read more about how to create a stamp for a request [here](/developer-reference/api-overview/stamps) ### failed to load organizations Common causes: -- A request is targeting an unknown organization ID. +* A request is targeting an unknown organization ID. Troubleshooting tips: -- Ensure that the passed organization ID in the request is valid. - ---- +* Ensure that the passed organization ID in the request is valid. ### policy label must be unique Common causes: -- A new policy that is to be created shares the same name as a different policy. Policy names must be unique, and names in general must be unique per resource, so that they can be properly identified. +* A new policy that is to be created shares the same name as a different policy. Policy names must be unique, and names in general must be unique per resource, so that they can be properly identified. Troubleshooting tips: -- Change the label/name that will be used for the new policy. -- Delete the old policy. -- Update the old policy to have a new name. - ---- +* Change the label/name that will be used for the new policy. +* Delete the old policy. +* Update the old policy to have a new name. ### invalid policy consensus Common causes: -- An invalid consensus expression is passed. +* An invalid consensus expression is passed. Troubleshooting tips: -- Read more about policy structure [here](/concepts/policies/overview#policy-structure) - ---- +* Read more about policy structure [here](/concepts/policies/overview#policy-structure) ### invalid policy condition Common causes: -- An invalid condition expression is passed. +* An invalid condition expression is passed. Troubleshooting tips: -- Read more about policy structure [here](/concepts/policies/overview#policy-structure) - ---- +* Read more about policy structure [here](/concepts/policies/overview#policy-structure) ### quorum threshold must be non-zero integer Common causes: -- Quorum is the required amount of approvals by [root quorum members](/concepts/users/root-quorum) needed for an action to take place within an organization. +* Quorum is the required amount of approvals by [root quorum members](/concepts/users/root-quorum) needed for an action to take place within an organization. Troubleshooting tips: -- When creating a sub-organization or updating the root quroum amount, use a non-zero positive integer. - ---- +* When creating a sub-organization or updating the root quroum amount, use a non-zero positive integer. ### quorum users missing Common causes: -- A user marked as part of the root quorum is missing from the set of users within an organization. This is a validation error that can occur when trying to delete a user that is part of the root quorum. +* A user marked as part of the root quorum is missing from the set of users within an organization. This is a validation error that can occur when trying to delete a user that is part of the root quorum. Troubleshooting tips: -- Before deleting the user, remove them from the root quroum using [Update Root Quorum](https://docs.turnkey.com/api#tag/Organizations/operation/UpdateRootQuorum) - ---- +* Before deleting the user, remove them from the root quroum using [Update Root Quorum](/api-reference/organizations/update-root-quorum) ### invalid api key expiration Common causes: -- An invalid expiration time was passed in for an api key's expiration time parameter when using [Create API Key](https://docs.turnkey.com/api#tag/API-Keys/operation/CreateApiKeys) +* An invalid expiration time was passed in for an api key's expiration time parameter when using [Create API Key](/api-reference/api-keys/create-api-keys) Troubleshooting tips: -- The `expirationSeconds` parameter is passed as string of seconds of how long the key should last. Any non-positive non-integer string will be considered invalid. - ---- +* The `expirationSeconds` parameter is passed as string of seconds of how long the key should last. Any non-positive non-integer string will be considered invalid. ### missing parameter: user authenticator attestation Common causes: -- An attestation parameter is not passed when performing a request regarding an authenticator. For example [Create Authenticators](https://docs.turnkey.com/api#tag/Authenticators/operation/CreateAuthenticators) +* An attestation parameter is not passed when performing a request regarding an authenticator. For example [Create Authenticators](/api-reference/authenticators/create-authenticators) Troubleshooting tips: -- The attestation generated by the authenticator includes a new key pair, the challenge, and device metadata that is signed, read more about attestations [here](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Attestation_and_Assertion). -- An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example - ---- +* The attestation generated by the authenticator includes a new key pair, the challenge, and device metadata that is signed, read more about attestations [here](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Attestation_and_Assertion). +* An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example ### invalid authenticator attestation Common causes: -- An attestation parameter is not valid when performing a request regarding an authenticator. For example [Create Authenticators](https://docs.turnkey.com/api#tag/Authenticators/operation/CreateAuthenticators) +* An attestation parameter is not valid when performing a request regarding an authenticator. For example [Create Authenticators](/api-reference/authenticators/create-authenticators) Troubleshooting tips: -- The attestation generated by the authenticator includes a new key pair, the challenge, and device metadata that is signed, read more about attestations [here](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Attestation_and_Assertion). -- An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example - ---- +* The attestation generated by the authenticator includes a new key pair, the challenge, and device metadata that is signed, read more about attestations [here](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API/Attestation_and_Assertion). +* An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example ### missing parameter: user authenticator attestation auth data Common causes: -- The attestation auth data parameter is not valid when performing a request regarding an authenticator. For example [Create Authenticators](https://docs.turnkey.com/api#tag/Authenticators/operation/CreateAuthenticators). This parameter is obtained as part of the attestation object. +* The attestation auth data parameter is not valid when performing a request regarding an authenticator. For example [Create Authenticators](/api-reference/authenticators/create-authenticators). This parameter is obtained as part of the attestation object. Troubleshooting tips: -- An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example - ---- +* An example of getting the correct parameters needed to use the Create Authenticators endpoint can be found within our [react-components](https://github.com/tkhq/sdk/blob/main/examples/react-components/src/app/dashboard/page.tsx#L246-L276) SDK example ### user has exceeded maximum authenticators Common causes: -- Turnkey allows up to 10 authenticators per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). +* Turnkey allows up to 10 authenticators per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). Troubleshooting Tips: -- Delete any unecessary authenticators attached to a user. -- Create a new user within the same organization and attach the authenicator to that user. - ---- +* Delete any unecessary authenticators attached to a user. +* Create a new user within the same organization and attach the authenicator to that user. ### user has exceeded maximum long-lived api keys Common causes: -- Turnkey allows up to 10 long-lived api keys per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). +* Turnkey allows up to 10 long-lived api keys per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). Troubleshooting Tips: -- Delete any unecessary long-lived API keys attached to a user. -- Create a new user within the same organization and attach the API key to that user. - ---- +* Delete any unecessary long-lived API keys attached to a user. +* Create a new user within the same organization and attach the API key to that user. ### user has exceeded maximum short-lived api keys Common causes: -- Turnkey allows up to 10 short-lived api keys per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). Short-lived API keys will automatically be deleted from an organization when they are expired. +* Turnkey allows up to 10 short-lived api keys per user. This is a hard resource limit. More information on resource limits [here](/concepts/resource-limits). Short-lived API keys will automatically be deleted from an organization when they are expired. Troubleshooting Tips: -- Delete any unecessary short-lived API keys attached to a user. -- Create a new user within the same organization and attach the API key to that user. - ---- +* Delete any unecessary short-lived API keys attached to a user. +* Create a new user within the same organization and attach the API key to that user. ### missing wallet params Common causes: -- Some wallet/wallet account parameters have been omitted when creating a sub-organization +* Some wallet/wallet account parameters have been omitted when creating a sub-organization Troubleshooting tips: -- Include all of the required parameters when creating a wallet during sub-organization creation. More info on the parameters [here](https://docs.turnkey.com/api#tag/Organizations/operation/CreateSubOrganization). - ---- +* Include all of the required parameters when creating a wallet during sub-organization creation. More info on the parameters [here](/api-reference/organizations/create-sub-organization). ### invalid path format Common causes: -- This error occurs when an invalid path format parameter is passed to a request like [Create Wallet Accounts](https://docs.turnkey.com/api#tag/Wallets/operation/CreateWalletAccounts). +* This error occurs when an invalid path format parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: -- For now the path format must be: `PATH_FORMAT_BIP32`. - ---- +* For now the path format must be: `PATH_FORMAT_BIP32`. ### invalid path Common causes: -- An invalid path parameter is passed to a request like [Create Wallet Accounts](https://docs.turnkey.com/api#tag/Wallets/operation/CreateWalletAccounts). Paths cannot be reused within the same HD wallet. +* An invalid path parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Paths cannot be reused within the same HD wallet. Troubleshooting tips: -- The path is a string that is used to derive a new account within an HD wallet. A list of default paths per address format can be found [here](/concepts/wallets#hd-wallet-default-paths) -- Paths cannot be reused within the same HD wallet. - ---- +* The path is a string that is used to derive a new account within an HD wallet. A list of default paths per address format can be found [here](/concepts/wallets#hd-wallet-default-paths) +* Paths cannot be reused within the same HD wallet. ### invalid address format Common causes: -- An invalid address format parameter is passed to a request like [Create Wallet Accounts](https://docs.turnkey.com/api#tag/Wallets/operation/CreateWalletAccounts). +* An invalid address format parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: -- Turnkey offers a wide range of support for many ecosystems. A list of valid address formats can be found in the table [here](/concepts/wallets#address-formats-and-curves). -- More about Turnkey and general ecosystem support can be found [here](/ecosystems/framework). - ---- +* Turnkey offers a wide range of support for many ecosystems. A list of valid address formats can be found in the table [here](/concepts/wallets#address-formats-and-curves). +* More about Turnkey and general ecosystem support can be found [here](/ecosystems/framework). ### invalid curve Common causes: -- An invalid curve parameter is passed to a request like [Create Wallet Accounts](https://docs.turnkey.com/api#tag/Wallets/operation/CreateWalletAccounts). +* An invalid curve parameter is passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: -- Before ecosystem level integrations Turnkey offers support on a curve level. This makes us extendable to any ecosystem that is based on a curve we support. A list of valid curve parameters can be found in the table [here](/concepts/wallets#address-formats-and-curves). -- More about Turnkey and general ecosystem support can be found [here](/ecosystems/framework). - ---- +* Before ecosystem level integrations Turnkey offers support on a curve level. This makes us extendable to any ecosystem that is based on a curve we support. A list of valid curve parameters can be found in the table [here](/concepts/wallets#address-formats-and-curves). +* More about Turnkey and general ecosystem support can be found [here](/ecosystems/framework). ### curve required Common causes: -- The curve parameter is not passed to a request like [Create Wallet Accounts](https://docs.turnkey.com/api#tag/Wallets/operation/CreateWalletAccounts). +* The curve parameter is not passed to a request like [Create Wallet Accounts](/api-reference/wallets/create-wallet-accounts). Troubleshooting tips: -- Before ecosystem level integrtaions Turnkey offers support on a curve level. This makes us extendable to any ecosystem that is based on a curve we support. A list of valid curve parameters can be found in the table [here](/concepts/wallets#address-formats-and-curves). -- More about Turnkey and general ecosystem support can be found [here](/ecosystems/framework). - ---- +* Before ecosystem level integrtaions Turnkey offers support on a curve level. This makes us extendable to any ecosystem that is based on a curve we support. A list of valid curve parameters can be found in the table [here](/concepts/wallets#address-formats-and-curves). +* More about Turnkey and general ecosystem support can be found [here](/ecosystems/framework). ### No activity found with fingerprint. Consensus activities must target an existing activity by fingerprint Common causes: -- This error occurs during the [Approve/Reject Activity](https://docs.turnkey.com/api#tag/Consensus/operation/ApproveActivity) activity. The fingerprint parameter must be a fingerprint of a valid activity. +* This error occurs during the [Approve/Reject Activity](/api-reference/consensus/approve-activity) activity. The fingerprint parameter must be a fingerprint of a valid activity. Troubleshooting tips: -- Confirm that a valid fingerprint of an activity that requires approval or rejection is passed as part of this activity. - ---- +* Confirm that a valid fingerprint of an activity that requires approval or rejection is passed as part of this activity. ### internal server error Common causes: -- This error is thrown for a variety of internal server errors that are not due to user error. These activities will have an error id passed with them like: `internal server error (9fbfda54-7141-4192-ae72-8bac3512149a)` that can be used for troubleshooting. +* This error is thrown for a variety of internal server errors that are not due to user error. These activities will have an error id passed with them like: `internal server error (9fbfda54-7141-4192-ae72-8bac3512149a)` that can be used for troubleshooting. Troubleshooting tips: -- Retry the activity. This could be a fluke case and the following activity could pass without failure. -- If you think there is problem or if your service is degraded, please reach out to Turnkey help@turnkey.com and provide the error id in the error message. - ---- +* Retry the activity. This could be a fluke case and the following activity could pass without failure. +* If you think there is problem or if your service is degraded, please reach out to Turnkey [help@turnkey.com](mailto:help@turnkey.com) and provide the error id in the error message. diff --git a/developer-reference/api-overview/intro.mdx b/developer-reference/api-overview/intro.mdx new file mode 100644 index 00000000..1d68b594 --- /dev/null +++ b/developer-reference/api-overview/intro.mdx @@ -0,0 +1,29 @@ +--- +title: "Introduction" +description: "Turnkey's API is a remote procedure call (RPC) API." +--- + +## RPC/HTTP + +We chose RPC-over-HTTP for convenience and ease-of-use. Most of our users should be able to integrate with our API without a major re-architecture of their existing systems. + +Many client libraries are available to make requests to a RPC/HTTP API, across many languages. Turnkey will provide SDKs for the most popular programming languages. For other languages, a RPC/HTTP API ensures there is an easy integration path available via raw http clients. + +## POST-only + +If you look at the [API reference](/api-reference/overview) you'll notice that all API calls to Turnkey are HTTP POST requests. Requests contain a POST body and a header with a digital signature over the POST body. We call this digitial signature a [Stamp](/developer-reference/api-overview/stamps). + +Requests must be stamped by registered user credentials and verified by Turnkey's secure enclaves before they are processed. This ensures cryptographic integrity end-to-end which eliminates the ability for any party to modify a user's request. + +### Queries and Submissions + +Turnkey's API is divided into 2 broad categories: queries and submissions. + +* Queries are read requests (e.g. `get_users`, `list_users`) +* Submissions are requests to execute a workload (e.g. `create_policy`, `sign_transaction`, `delete_user`) + +## Dive Deeper + +* Creating your first [Stamp](/developer-reference/api-overview/stamps) +* Fetching data with [Queries](/developer-reference/api-overview/queries) +* Executing workloads with [Submissions](/developer-reference/api-overview/submissions) diff --git a/developer-reference/api-overview/queries.mdx b/developer-reference/api-overview/queries.mdx new file mode 100644 index 00000000..a70479f3 --- /dev/null +++ b/developer-reference/api-overview/queries.mdx @@ -0,0 +1,7 @@ +--- +title: "Queries" +description: "Queries are read requests to Turnkey's API. Query URL paths are prefixed with `/public/v1/query`. Queries are not subject to enforcement of the policy engine. All users within an organization can read any data within the organization." +mode: wide +--- + +Additionally, parent organizations have the ability to query data for all of their sub-organizations. diff --git a/developer-reference/api-overview/stamps.mdx b/developer-reference/api-overview/stamps.mdx new file mode 100644 index 00000000..547fc526 --- /dev/null +++ b/developer-reference/api-overview/stamps.mdx @@ -0,0 +1,101 @@ +--- +title: "Stamps" +description: "Every request made to Turnkey must include a signature over the POST body attached as a HTTP header. Our secure enclave applications use this signature to verify the integrity and authenticity of the request." +--- + +### API Keys + +To create a valid, API key stamped request follow these steps: + + + Sign the JSON-encoded POST body with your API key to produce a `signature` (DER-encoded) + + + Hex encode the `signature` + + + + Create a JSON-encoded stamp: + + * `publicKey`: the public key of API key + * `signature`: the signature produced by the API key + * `scheme`: `SIGNATURE_SCHEME_TK_API_P256` + + + Base64URL encode the stamp + + + Attach the encoded string to your request as a `X-Stamp` header + + + Submit the stamped request to Turnkey's API + + + +### WebAuthn + +To create a valid, Webauthn authenticator stamped request follow these steps: + + + Compute the webauthn challenge by hashing the POST body bytes (JSON encoded) with SHA256. For example, if the POST body is `{"organization_id": "1234", "type": "ACTIVITY_TYPE_CREATE_API_KEYS", "params": {"for": "example"}`, the webauthn challenge is the string `7e8b4653fc7e51dc119cea031942f4693b4742ceca4dda269b925802b38b2147` + + + Include the challenge amongst WebAuthn signing options. Refer to the existing stamper implementations in the [following section](#stampers)) for examples + + + * Note that if you need to pass the challenge as bytes, you'll need to utf8-encode the challenge string (in JS, the challenge bytes will be `TextEncoder().encode("7e8b4653fc7e51dc119cea031942f4693b4742ceca4dda269b925802b38b2147")`) + * Additional note for React Native contexts: the resulting string should then additionally be base64-encoded. See [implementation](https://github.com/tkhq/sdk/blob/b52db566e79a65eec8d8e7066053d6a3ac5f3943/packages/react-native-passkey-stamper/src/util.ts#L5-L10) + + + + + Create a JSON-encoded stamp: + + * `credentialId`: the id of the webauthn authenticator + * `authenticatorData`: the authenticator data produced by Webauthn assertion + * `clientDataJson`: the client data produced by the Webauthn assertion + * `signature`: the signature produced by the Webauthn assertion + + + + Attach the JSON-encoded stamp to your request as a `X-Stamp-Webauthn` header + + * Header names are case-insensitive (so `X-Stamp-Webauthn` and `X-Stamp-WebAuthn` are considered equivalent) + + * Unlike API key stamps, the format is just JSON; no base64URL encoding necessary! For example: `X-Stamp-Webauthn: {"authenticatorData":"UaQZ...","clientDataJson":"eyJ0...","credentialId":"Grf...","signature":"MEQ..."}` + + + + Submit the stamped request to Turnkey's API. If you would like your client request to be proxied through a backend, refer to the patterns mentioned [here](/authentication/passkeys/integration#proxying-signed-requests). An example application that uses this pattern can be found at wallet.tx.xyz (code [here](https://github.com/tkhq/demo-embedded-wallet/)) + + + +### Stampers + +Our [JS SDK](https://github.com/tkhq/sdk) and [CLI](https://github.com/tkhq/tkcli) abstract request stamping for you. If you choose to use an independent client, you will need to implement this yourself. For reference, check out our implementations: + + + + + + + + + + + + + + + + +Our CLI has a `--no-post` option to generate stamps without sending anything over the network. This is a useful tool should you have trouble with debugging stamping-related logic. A sample command might look something like: + +```json +turnkey request --no-post --host api.turnkey.com --path /api/v1/sign --body '{"payload": "hello from TKHQ"}' +{ + "curlCommand": "curl -X POST -d'{\"payload\": \"hello from TKHQ\"}' -H'X-Stamp: eyJwdWJsaWNLZXkiOiIwMzI3YTUwMDMyZTZmMDYzMWQ1NjA1YjZhZGEzMmI3NzkwNzRmMzQ2ZTgxYjY4ZTEyODAxNjQwZjFjOWVlMDNkYWUiLCJzaWduYXR1cmUiOiIzMDQ0MDIyMDM2MjNkZWZkNjE4ZWIzZTIxOTk3MDQ5NjQwN2ViZTkyNDQ3MzE3ZGFkNzVlNDEyYmQ0YTYyNjdjM2I1ZTIyMjMwMjIwMjQ1Yjc0MDg0OGE3MmQwOGI2MGQ2Yzg0ZjMzOTczN2I2M2RiM2JjYmFkYjNiZDBkY2IxYmZiODY1NzE1ZDhiNSIsInNjaGVtZSI6IlNJR05BVFVSRV9TQ0hFTUVfVEtfQVBJX1AyNTYifQ' -v 'https://api.turnkey.com/api/v1/sign'", + "message": "{\"payload\": \"hello from TKHQ\"}", + "stamp": "eyJwdWJsaWNLZXkiOiIwMzI3YTUwMDMyZTZmMDYzMWQ1NjA1YjZhZGEzMmI3NzkwNzRmMzQ2ZTgxYjY4ZTEyODAxNjQwZjFjOWVlMDNkYWUiLCJzaWduYXR1cmUiOiIzMDQ0MDIyMDM2MjNkZWZkNjE4ZWIzZTIxOTk3MDQ5NjQwN2ViZTkyNDQ3MzE3ZGFkNzVlNDEyYmQ0YTYyNjdjM2I1ZTIyMjMwMjIwMjQ1Yjc0MDg0OGE3MmQwOGI2MGQ2Yzg0ZjMzOTczN2I2M2RiM2JjYmFkYjNiZDBkY2IxYmZiODY1NzE1ZDhiNSIsInNjaGVtZSI6IlNJR05BVFVSRV9TQ0hFTUVfVEtfQVBJX1AyNTYifQ" +} +``` diff --git a/docs/documentation/developer-reference/api-overview/submissions.md b/developer-reference/api-overview/submissions.mdx similarity index 61% rename from docs/documentation/developer-reference/api-overview/submissions.md rename to developer-reference/api-overview/submissions.mdx index 1dde2a39..6a74dcb9 100644 --- a/docs/documentation/developer-reference/api-overview/submissions.md +++ b/developer-reference/api-overview/submissions.mdx @@ -1,26 +1,21 @@ --- -sidebar_position: 4 -description: Secure execution with Turnkey -slug: /developer-reference/api-overview/submissions +title: "Submissions" +description: "Submissions are requests to securely execute a workload. Submission URL paths are prefixed with `/public/v1/submit`. Submissions requests, if valid, produce an `Activity`." --- -# Submissions - -Submissions are requests to securely execute a workload. Submission URL paths are prefixed with `/public/v1/submit`. Submissions requests, if valid, produce an `Activity`. - ### Activites Activities typically create, modify, or utilize a resource within Turnkey and are subject to consensus or condition enforcement via the policy engine. Activities are executed optimistically synchronous. This means that if we can process the request synchronously, we will. Otherwise, we'll fallback to asynchronous processing. Your services or applications should account for this by checking the response for the activity state: -- If `activity.status == ACTIVITY_STATUS_COMPLETED`, `activity.result` field will be populated with a successful response. -- If `activity.status == ACTIVITY_STATUS_FAILED`, `activity.failure` field will be populated with a failure reason. -- If `activity.status == ACTIVITY_STATUS_CONSENSUS_NEEDED`, additional signatures are required to process the request. -- If `activity.status == ACTIVITY_STATUS_PENDING`, the request is processing asynchronously. +* If `activity.status == ACTIVITY_STATUS_COMPLETED`, `activity.result` field will be populated with a successful response. +* If `activity.status == ACTIVITY_STATUS_FAILED`, `activity.failure` field will be populated with a failure reason. +* If `activity.status == ACTIVITY_STATUS_CONSENSUS_NEEDED`, additional signatures are required to process the request. +* If `activity.status == ACTIVITY_STATUS_PENDING`, the request is processing asynchronously. You can get activity status updates by: -- Re-submitting the request. See the notes on idempotency below. -- Polling `get_activity` with the `activity.id` +* Re-submitting the request. See the notes on idempotency below. +* Polling `get_activity` with the `activity.id` ### Idempotency diff --git a/docs/documentation/developer-reference/webhooks.md b/developer-reference/webhooks.mdx similarity index 70% rename from docs/documentation/developer-reference/webhooks.md rename to developer-reference/webhooks.mdx index a0b1ee8f..fa81c5e1 100644 --- a/docs/documentation/developer-reference/webhooks.md +++ b/developer-reference/webhooks.mdx @@ -1,13 +1,8 @@ --- -sidebar_position: 1 -description: Activity webhooks -slug: /developer-reference/webhooks +title: "Activity Webhooks" +description: "Webhooks provide a powerful mechanism to receive real-time notifications about activity requests in your Turnkey organization. Additionally, you'll be able to receive all activity requests for both the parent organization and all its child organizations. This functionality can be enabled via the organization feature capabilities of our platform, as detailed in the section on [organization features](/concepts/organizations#features)." --- -# Activity Webhooks - -Webhooks provide a powerful mechanism to receive real-time notifications about activity requests in your Turnkey organization. Additionally, you'll be able to receive all activity requests for both the parent organization and all its child organizations. This functionality can be enabled via the organization feature capabilities of our platform, as detailed in the section on [organization features](/concepts/organizations#features). - This guide is designed to walk you through the process of setting up webhooks, from environment preparation to verification of successful event capturing. ## Prerequisites @@ -18,31 +13,35 @@ Before diving into webhook configuration, ensure you have completed the necessar Begin by setting the necessary environment variables: -```shell -ORGANIZATION_ID= -KEY_NAME=webhook-test +```bash +ORGANIZATION_ID=KEY_NAME=webhook-test ``` ### API Key Generation Generate an new API key using the Turnkey CLI with the following command: -```shell +```bash turnkey generate api-key --organization $ORGANIZATION_ID --key-name $KEY_NAME ``` ### Ngrok Installation and Setup Ngrok is a handy tool that allows you to expose your local server to the internet. Follow these steps to set it up: - -1. Download Ngrok from [their website](https://ngrok.com/download). -2. Follow the provided instructions to install Ngrok and configure your auth token. + + + Download Ngrok from [their website](https://ngrok.com/download). + + + Follow the provided instructions to install Ngrok and configure your auth token. + + ### Local Server Setup Open a new terminal window and set up a local server to listen for incoming webhook events: -```shell +```bash nc -l 8000 ``` @@ -50,13 +49,13 @@ nc -l 8000 In another terminal, initiate Ngrok to forward HTTP requests to your local server: -```shell +```bash ngrok http 8000 ``` Here's an output of the above command: -``` +```bash Session Status online Account Satoshi Nakamoto (Plan: Free) Update update available (version 3.7.0, Ctrl-U to update) @@ -72,7 +71,7 @@ Connections ttl opn rt1 rt5 p50 p90 Save the ngrok URL as an environment variable: -```shell +```bash WEBHOOK_URL=https://04•••35.ngrok-free.app # Replace with the URL provided by ngrok ``` @@ -80,13 +79,13 @@ WEBHOOK_URL=https://04•••35.ngrok-free.app # Replace with the URL provided To ensure Ngrok is correctly forwarding requests, perform a test using curl: -```shell +```bash curl -X POST $WEBHOOK_URL -d "{}" ``` Example output: -```shell +```bash POST / HTTP/1.1 Host:04b2-121-74-183-35.ngrok-free.app User-Agent: curl/8.4.0 @@ -100,14 +99,13 @@ Accept-Encoding: gzip {} ``` -After executing this command, you should see the request appear in the terminal where `nc` is running. -Terminate the `nc` session by pressing CTRL+C and restart it by rerunning the `nc` command. +After executing this command, you should see the request appear in the terminal where `nc` is running. Terminate the `nc` session by pressing CTRL+C and restart it by rerunning the `nc` command. ## Configuring the Webhook URL Set your webhook URL using the Turnkey CLI with the following command: -```shell +```bash turnkey request --path /public/v1/submit/set_organization_feature --body '{ "timestampMs": "'"$(date +%s)"'000", "type": "ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE", @@ -121,11 +119,8 @@ turnkey request --path /public/v1/submit/set_organization_feature --body '{ ### Testing Your Webhook -Assuming the previous request executed successfully it's time to test out your webhook! -In order to verify that your webhook is correctly configured and receiving data, -we can simply execute the previous turnkey request command again which creates a new activity request that will be captured by your webhook. -Monitor the terminal with `nc` running to observe the incoming webhook data. +Assuming the previous request executed successfully it's time to test out your webhook! In order to verify that your webhook is correctly configured and receiving data, we can simply execute the previous turnkey request command again which creates a new activity request that will be captured by your webhook. Monitor the terminal with `nc` running to observe the incoming webhook data. ## Conclusion -By following these steps, you should now have a functioning webhook setup that captures all activity requests for your organization and its sub-organizations. If you encounter any issues or have feedback about this feature, reach out on [slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-2837d2isy-gbH60kJ~XnXSSFHiqVOrqw)! +By following these steps, you should now have a functioning webhook setup that captures all activity requests for your organization and its sub-organizations. If you encounter any issues or have feedback about this feature, reach out on [slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-31v4yhgw6-PwBzyNsWCCBTk2xft3EoHQ)! diff --git a/docs.json b/docs.json new file mode 100644 index 00000000..0459881a --- /dev/null +++ b/docs.json @@ -0,0 +1,653 @@ +{ + "$schema": "https://mintlify.com/docs.json", + "theme": "mint", + "name": "Turnkey", + "colors": { + "primary": "#6a5bf5", + "light": "#6a5bf5", + "dark": "#050a0b" + }, + "favicon": "/favicon.svg", + "navigation": { + "tabs": [ + { + "tab": "Documentation", + "groups": [ + { + "group": "Documentation", + "pages": [ + "home", + { + "group": "Getting Started", + "pages": [ + "getting-started", + { + "group": "Quickstart", + "pages": [ + "getting-started/quickstart", + "getting-started/embedded-wallet-quickstart", + "getting-started/signing-automation-quickstart" + ] + }, + "getting-started/examples", + "getting-started/launch-checklist" + ] + }, + { + "group": "Concepts", + "pages": [ + "concepts/overview", + "concepts/organizations", + "concepts/sub-organizations", + { + "group": "Users", + "pages": [ + "concepts/users/introduction", + "concepts/users/credentials", + "concepts/users/root-quorum", + "concepts/users/best-practices" + ] + }, + "concepts/wallets", + "concepts/resource-limits", + { + "group": "Policies", + "pages": [ + "concepts/policies/overview", + "concepts/policies/quickstart", + "concepts/policies/examples", + "concepts/policies/delegated-access", + "concepts/policies/language" + ] + } + ] + }, + { + "group": "Authentication", + "pages": [ + { + "group": "Passkeys", + "pages": [ + "authentication/passkeys/introduction", + "authentication/passkeys/integration", + "authentication/passkeys/options", + "authentication/passkeys/native", + "authentication/passkeys/discoverable-vs-non-discoverable" + ] + }, + "authentication/email", + "authentication/social-logins", + "authentication/sms", + "authentication/sessions" + ] + }, + { + "group": "Wallets", + "pages": [ + "wallets/pregenerated-wallets", + "wallets/import-wallets", + "wallets/export-wallets" + ] + }, + { + "group": "Ecosystem", + "pages": [ + "ecosystems/framework", + "ecosystems/ethereum", + "ecosystems/solana", + "ecosystems/bitcoin", + "ecosystems/others" + ] + }, + { + "group": "Developer Reference", + "pages": [ + { + "group": "API Overview", + "pages": [ + "developer-reference/api-overview/intro", + "developer-reference/api-overview/stamps", + "developer-reference/api-overview/queries", + "developer-reference/api-overview/submissions", + "developer-reference/api-overview/errors" + ] + }, + "developer-reference/webhooks" + ] + }, + { + "group": "Security", + "pages": [ + "category/security", + "security/our-approach", + "security/non-custodial-key-mgmt", + "security/secure-enclaves", + "security/quorum-deployments", + "security/verifiable-data", + "security/disaster-recovery", + "security/enclave-secure-channels", + "security/whitepaper", + "security/reporting-a-vulnerability" + ] + }, + "faq" + ] + } + ] + }, + { + "tab": "Solutions", + "groups": [ + { + "group": "Solutions", + "pages": [ + { + "group": "Embedded Wallets", + "pages": [ + "embedded-wallets/overview", + "embedded-wallets/sub-organizations-as-wallets", + "embedded-wallets/sub-organization-auth", + "embedded-wallets/sub-organization-recovery", + "reference/aa-wallets", + "reference/embedded-wallet-kit", + { + "group": "Code Examples", + "pages": [ + "category/code-examples", + "embedded-wallets/code-examples/create-sub-org-passkey", + "embedded-wallets/code-examples/authenticate-user-passkey", + "embedded-wallets/code-examples/create-passkey-session", + "embedded-wallets/code-examples/create-user-email", + "embedded-wallets/code-examples/authenticate-user-email", + "embedded-wallets/code-examples/email-recovery", + "embedded-wallets/code-examples/add-credential", + "embedded-wallets/code-examples/wallet-auth", + "embedded-wallets/code-examples/signing-transactions", + "embedded-wallets/code-examples/import", + "embedded-wallets/code-examples/export" + ] + } + ] + }, + { + "group": "Signing Automation", + "pages": [ + "signing-automation/overview", + { + "group": "Code Examples", + "pages": [ + "category/code-examples-1", + "signing-automation/code-examples/signing-transactions" + ] + } + ] + } + ] + } + ] + }, + { + "tab": "SDK Reference", + "groups": [ + { + "group": "SDK Reference", + "pages": [ + "sdks/introduction", + "sdks/javascript-browser", + "sdks/javascript-server", + "sdks/react", + "sdks/react-native", + "sdks/golang", + "sdks/rust", + "sdks/Ruby", + "sdks/cli", + "sdks/flutter", + { + "group": "Swift", + "pages": [ + "sdks/swift", + "sdks/swift/proxy-middleware", + "sdks/swift/register-passkey" + ] + }, + { + "group": "Web3 Libraries", + "pages": [ + "category/web3-libraries", + "sdks/web3/ethers", + "sdks/web3/viem", + "sdks/web3/cosmjs", + "sdks/web3/eip-1193", + "sdks/web3/solana" + ] + }, + { + "group": "Advanced", + "pages": [ + "category/advanced", + "sdks/advanced/turnkey-client", + "sdks/advanced/api-key-stamper", + "sdks/advanced/wallet-stamper", + "sdks/advanced/webauthn-stamper", + "sdks/advanced/iframe-stamper" + ] + }, + "sdks/migration-path" + ] + } + ] + }, + { + "tab": "API Reference", + "pages": [ + { + "group": "API Reference", + "pages": [ + "api-reference/overview", + { + "group": "Organizations", + "pages": [ + "api-reference/organizations/overview", + "api-reference/organizations/get-configs", + "api-reference/organizations/get-suborgs", + "api-reference/organizations/get-verified-suborgs", + "api-reference/organizations/create-sub-organization", + "api-reference/organizations/delete-sub-organization", + "api-reference/organizations/update-root-quorum" + ] + }, + { + "group": "Invitations", + "pages": [ + "api-reference/invitations/overview", + "api-reference/invitations/create-invitations", + "api-reference/invitations/delete-invitation" + ] + }, + { + "group": "Policies", + "pages": [ + "api-reference/policies/overview", + "api-reference/policies/get-policy", + "api-reference/policies/list-policies", + "api-reference/policies/create-policies", + "api-reference/policies/create-policy", + "api-reference/policies/delete-policy", + "api-reference/policies/update-policy" + ] + }, + { + "group": "Features", + "pages": [ + "api-reference/features/remove-organization-feature", + "api-reference/features/set-organization-feature" + ] + } + ] + }, + { + "group": "Wallets and Private Keys", + "pages": [ + { + "group": "Wallets", + "pages": [ + "api-reference/wallets/overview", + "api-reference/wallets/get-wallet", + "api-reference/wallets/get-wallet-account", + "api-reference/wallets/list-wallets-accounts", + "api-reference/wallets/list-wallets", + "api-reference/wallets/create-wallet", + "api-reference/wallets/create-wallet-accounts", + "api-reference/wallets/delete-wallets", + "api-reference/wallets/export-wallet", + "api-reference/wallets/export-wallet-account", + "api-reference/wallets/import-wallet", + "api-reference/wallets/init-import-wallet", + "api-reference/wallets/update-wallet" + ] + }, + { + "group": "Signing", + "pages": [ + "api-reference/signing/overview", + "api-reference/signing/sign-raw-payload", + "api-reference/signing/sign-raw-payloads", + "api-reference/signing/sign-transaction" + ] + }, + { + "group": "Private Keys", + "pages": [ + "api-reference/private-keys/overview", + "api-reference/private-keys/get-private-key", + "api-reference/private-keys/list-private-keys", + "api-reference/private-keys/create-private-keys", + "api-reference/private-keys/delete-private-keys", + "api-reference/private-keys/export-private-key", + "api-reference/private-keys/import-private-key", + "api-reference/private-keys/init-import-private-key" + ] + }, + { + "group": "Private Key Tags", + "pages": [ + "api-reference/private-key-tags/overview", + "api-reference/private-key-tags/list-private-key-tags", + "api-reference/private-key-tags/create-private-key-tag", + "api-reference/private-key-tags/delete-private-key-tags", + "api-reference/private-key-tags/update-private-key-tag" + ] + } + ] + }, + { + "group": "Users", + "pages": [ + { + "group": "Users", + "pages": [ + "api-reference/users/overview", + "api-reference/users/get-user", + "api-reference/users/list-users", + "api-reference/users/create-users", + "api-reference/users/delete-users", + "api-reference/users/update-user" + ] + }, + { + "group": "User Tags", + "pages": [ + "api-reference/user-tags/list-user-tags", + "api-reference/user-tags/create-user-tag", + "api-reference/user-tags/delete-user-tags", + "api-reference/user-tags/update-user-tag" + ] + }, + { + "group": "User Recovery", + "pages": [ + "api-reference/user-recovery/init-email-recovery", + "api-reference/user-recovery/recover-a-user" + ] + }, + { + "group": "User Auth", + "pages": [ + "api-reference/user-auth/get-oauth-providers", + "api-reference/user-auth/create-oauth-providers", + "api-reference/user-auth/delete-oauth-providers", + "api-reference/user-auth/perform-email-auth", + "api-reference/user-auth/init-otp-auth", + "api-reference/user-auth/oauth", + "api-reference/user-auth/otp-auth" + ] + } + ] + }, + { + "group": "Credentials", + "pages": [ + { + "group": "Authenticators", + "pages": [ + "api-reference/authenticators/overview", + "api-reference/authenticators/get-authenticator", + "api-reference/authenticators/get-authenticators", + "api-reference/authenticators/create-authenticators", + "api-reference/authenticators/delete-authenticators" + ] + }, + { + "group": "API keys", + "pages": [ + "api-reference/api-keys/overview", + "api-reference/api-keys/get-api-key", + "api-reference/api-keys/get-api-key-1" + ] + }, + { + "group": "Sessions", + "pages": [ + "api-reference/sessions/who-am-i", + "api-reference/sessions/create-read-only-session", + "api-reference/sessions/create-read-write-session" + ] + } + ] + }, + { + "group": "Activities", + "pages": [ + { + "group": "Activities", + "pages": [ + "api-reference/activities/overview", + "api-reference/activities/get-activity", + "api-reference/activities/list-activities" + ] + }, + { + "group": "Consensus", + "pages": [ + "api-reference/consensus/overview", + "api-reference/consensus/approve-activity", + "api-reference/consensus/reject-activity" + ] + } + ] + } + ] + } + ], + "global": { + "anchors": [ + { + "anchor": "Community", + "href": "https://join.slack.com/t/clubturnkey/shared_invite/zt-31v4yhgw6-PwBzyNsWCCBTk2xft3EoHQ", + "icon": "slack" + }, + { + "anchor": "Blog", + "href": "https://mirror.xyz/turnkeyhq.eth/", + "icon": "newspaper" + }, + { + "anchor": "Contact Us", + "href": "https://www.turnkey.com/contact-us", + "icon": "headset" + } + ] + } + }, + "logo": { + "light": "/logo/light.svg", + "dark": "/logo/dark.svg", + "href": "https://www.turnkey.com/" + }, + "styling": { + "codeblocks": "system" + }, + "navbar": { + "links": [ + { + "label": "Login", + "href": "https://app.turnkey.com/dashboard" + } + ], + "primary": { + "type": "button", + "label": "Get Started", + "href": "https://app.turnkey.com/dashboard/auth/initial" + } + }, + "footer": { + "socials": { + "x": "https://x.com/turnkeyhq", + "github": "https://github.com/tkhq", + "slack": "https://join.slack.com/t/clubturnkey/shared_invite/zt-31v4yhgw6-PwBzyNsWCCBTk2xft3EoHQ", + "linkedin": "https://www.linkedin.com/company/turnkeyhq/" + } + }, + "redirects": [ + { + "source": "/users/sessions", + "destination": "/features/sessions", + "permanent": true + }, + { + "source": "/users/:slug*", + "destination": "/concepts/users/:slug*", + "permanent": true + }, + { + "source": "/api-introduction", + "destination": "/developer-reference/api-overview/intro", + "permanent": true + }, + { + "source": "/api-design/:slug*", + "destination": "/api-overview/:slug*", + "permanent": true + }, + { + "source": "/managing-policies/:slug*", + "destination": "/concepts/policies/:slug*", + "permanent": true + }, + { + "source": "/managing-users/:slug*", + "destination": "/concepts/users/:slug*", + "permanent": true + }, + { + "source": "/getting-started/email-auth", + "destination": "/features/email-auth", + "permanent": true + }, + { + "source": "/concepts/email-auth", + "destination": "/features/email-auth", + "permanent": true + }, + { + "source": "/concepts/email-recovery", + "destination": "/features/email-recovery", + "permanent": true + }, + { + "source": "/integration-guides/export-wallets", + "destination": "/features/export-wallets", + "permanent": true + }, + { + "source": "/integration-guides/import-wallets", + "destination": "/features/import-wallets", + "permanent": true + }, + { + "source": "/integration-guides/aa-wallets", + "destination": "/reference/aa-wallets", + "permanent": true + }, + { + "source": "/integration-guides/sub-organization-auth", + "destination": "/embedded-wallets/sub-organization-auth", + "permanent": true + }, + { + "source": "/integration-guides/sub-organization-recovery", + "destination": "/embedded-wallets/sub-organization-recovery", + "permanent": true + }, + { + "source": "/integration-guides/sub-organizations-as-wallets", + "destination": "/embedded-wallets/sub-organizations-as-wallets", + "permanent": true + }, + { + "source": "/integration-guides/webhooks", + "destination": "/features/webhooks", + "permanent": true + }, + { + "source": "/reference/react-components", + "destination": "/reference/embedded-wallet-kit", + "permanent": true + }, + { + "source": "/getting-started/resource-limits", + "destination": "/concepts/resource-limits", + "permanent": true + }, + { + "source": "/ecosystem-integrations/ethereum", + "destination": "/ecosystems/ethereum", + "permanent": true + }, + { + "source": "/ecosystem-integrations/solana", + "destination": "/ecosystems/solana", + "permanent": true + }, + { + "source": "/ecosystem-integrations/bitcoin", + "destination": "/ecosystems/bitcoin", + "permanent": true + }, + { + "source": "/ecosystem-integrations/index", + "destination": "/ecosystems/framework", + "permanent": true + }, + { + "source": "/passkeys/discoverable-vs-non-discoverable", + "destination": "/authentication/passkeys/discoverable-vs-non-discoverable", + "permanent": true + }, + { + "source": "/passkeys/integration", + "destination": "/authentication/passkeys/integration", + "permanent": true + }, + { + "source": "/passkeys/introduction", + "destination": "/authentication/passkeys/introduction", + "permanent": true + }, + { + "source": "/passkeys/native", + "destination": "/authentication/passkeys/native", + "permanent": true + }, + { + "source": "/passkeys/options", + "destination": "/authentication/passkeys/options", + "permanent": true + }, + { + "source": "/features/oauth", + "destination": "/authentication/social-logins", + "permanent": true + }, + { + "source": "/concepts/introduction", + "destination": "/concepts/overview", + "permanent": true + }, + { + "source": "/features/email-auth", + "destination": "/authentication/email", + "permanent": true + }, + { + "source": "/features/email-recovery", + "destination": "/authentication/email", + "permanent": true + }, + { + "source": "/api-overview/:slug*", + "destination": "/developer-reference/api-overview/:slug*", + "permanent": true + } + ] +} diff --git a/docs/documentation/_category_.json b/docs/documentation/_category_.json deleted file mode 100644 index 94e9cfac..00000000 --- a/docs/documentation/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Documentation", - "position": 3, - "collapsed": false -} diff --git a/docs/documentation/authentication/_category_.json b/docs/documentation/authentication/_category_.json deleted file mode 100644 index f1f310b8..00000000 --- a/docs/documentation/authentication/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Authentication", - "position": 4, - "collapsed": true -} diff --git a/docs/documentation/authentication/passkeys/_category_.json b/docs/documentation/authentication/passkeys/_category_.json deleted file mode 100644 index 40480212..00000000 --- a/docs/documentation/authentication/passkeys/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Passkeys", - "position": 1, - "collapsed": true -} diff --git a/docs/documentation/concepts/Wallets.md b/docs/documentation/concepts/Wallets.md deleted file mode 100644 index a455855f..00000000 --- a/docs/documentation/concepts/Wallets.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -sidebar_position: 5 -sidebar_label: Wallets -description: Learn about Wallets on Turnkey -slug: /concepts/wallets ---- - -# Wallets - -A [hierarchical deterministic (HD) Wallet](https://learnmeabitcoin.com/technical/hd-wallets) is a collection of cryptographic private/public key pairs that share a common seed. A Wallet is used to generate Accounts. - -```json -{ - "walletId": "eb98ae4c-07eb-4117-9b2d-8a453c0e1e64", - "walletName": "default" -} -``` - -#### Configuration - -Wallet seeds are generated with a default mnemonic length of 12 words. The [BIP-39 specification](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki) supports mnemonic lengths of 12, 15, 18, 21, and 24 words. To enhance your Wallet's security, you may consider opting for a longer mnemonic length. This optional `mnemonicLength` field can be set when creating a Wallet. It's important to note that once the Wallet seed is generated, the mnemonic is permanent and cannot be altered. - -## Accounts - -An account contains the directions for deriving a cryptographic key pair and corresponding address from a Wallet. In practice, this looks like: - -- The Wallet seed and Account curve are used to create a root key pair -- The Account path format and path are used to derive an extended key pair from the root key pair -- The Account address format is used to derive the address from the extended public key - -```json -{ - "address": "0x7aAE6F67798D1Ea0b8bFB5b64231B2f12049DB5e", - "addressFormat": "ADDRESS_FORMAT_ETHEREUM", - "curve": "CURVE_SECP256K1", - "path": "m/44'/60'/0'/0/0", - "pathFormat": "PATH_FORMAT_BIP32", - "walletId": "eb98ae4c-07eb-4117-9b2d-8a453c0e1e64" -} -``` - -**The account address is used to sign with the underlying extended private key.** - -#### HD Wallet Default Paths - -HD wallets use standardized derivation paths to generate multiple accounts from a single seed. These paths follow a specific structure that allows for consistent address generation across different wallet implementations. Here are common default paths for some of the ecosystems supported by Turnkey: - -- Ethereum: `m/44'/60'/0'/0/0` -- Cosmos: `m/44'/118'/0'/0/0` -- Solana: `m/44'/501'/0'/0'` - -For a complete list of coin types and possible HD paths, refer to the [SLIP-0044 specification](https://github.com/satoshilabs/slips/blob/master/slip-0044.md). - -#### Address formats and curves - -See below for specific address formats that you can currently derive on Turnkey: - -| Type | Address Format | Curve | Default HD Path | -| -------- | ------------------------------------- | --------------- | ------------------ | -| n/a | ADDRESS_FORMAT_COMPRESSED | CURVE_SECP256K1 | m/0'/0 | -| n/a | ADDRESS_FORMAT_UNCOMPRESSED | CURVE_SECP256K1 | m/0'/0 | -| Ethereum | ADDRESS_FORMAT_ETHEREUM | CURVE_SECP256K1 | m/44'/60'/0'/0/0 | -| Cosmos | ADDRESS_FORMAT_COSMOS | CURVE_SECP256K1 | m/44'/118'/0'/0/0 | -| Solana | ADDRESS_FORMAT_SOLANA | CURVE_ED25519 | m/44'/501'/0'/0 | -| Tron | ADDRESS_FORMAT_TRON | CURVE_SECP256K1 | m/44'/195'/0'/0/0 | -| Sui | ADDRESS_FORMAT_SUI | CURVE_ED25519 | m/44'/784'/0'/0/0 | -| Aptos | ADDRESS_FORMAT_APTOS | CURVE_ED25519 | m/44'/637'/0'/0'/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_MAINNET_P2PKH | CURVE_SECP256K1 | m/44'/0'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH | CURVE_SECP256K1 | m/49'/0'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_MAINNET_P2WPKH | CURVE_SECP256K1 | m/84'/0'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_MAINNET_P2WSH | CURVE_SECP256K1 | m/48'/0'/0'/2'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_MAINNET_P2TR | CURVE_SECP256K1 | m/86'/0'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_TESTNET_P2PKH | CURVE_SECP256K1 | m/44'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_TESTNET_P2SH | CURVE_SECP256K1 | m/49'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_TESTNET_P2WPKH | CURVE_SECP256K1 | m/84'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_TESTNET_P2WSH | CURVE_SECP256K1 | m/48'/1'/0'/2'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR | CURVE_SECP256K1 | m/86'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_SIGNET_P2PKH | CURVE_SECP256K1 | m/44'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_SIGNET_P2SH | CURVE_SECP256K1 | m/49'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_SIGNET_P2WPKH | CURVE_SECP256K1 | m/84'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_SIGNET_P2WSH | CURVE_SECP256K1 | m/48'/1'/0'/2'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_SIGNET_P2TR | CURVE_SECP256K1 | m/86'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_REGTEST_P2PKH | CURVE_SECP256K1 | m/44'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_REGTEST_P2SH | CURVE_SECP256K1 | m/49'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_REGTEST_P2WPKH | CURVE_SECP256K1 | m/84'/1'/0'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_REGTEST_P2WSH | CURVE_SECP256K1 | m/48'/1'/0'/2'/0/0 | -| Bitcoin | ADDRESS_FORMAT_BITCOIN_REGTEST_P2TR | CURVE_SECP256K1 | m/86'/1'/0'/0/0 | -| Sei | ADDRESS_FORMAT_SEI | CURVE_SECP256K1 | m/44'/118'/0'/0/0 | -| Stellar | ADDRESS_FORMAT_XLM | CURVE_ED25519 | m/44'/148'/0'/0'/0 | -| Dogecoin | ADDRESS_FORMAT_DOGE_MAINNET | CURVE_SECP256K1 | m/44'/3'/0'/0/0 | -| Dogecoin | ADDRESS_FORMAT_DOGE_TESTNET | CURVE_SECP256K1 | m/44'/1'/0'/0/0 | -| TON | ADDRESS_FORMAT_TON_V3R2 | CURVE_ED25519 | m/44'/607'/0'/0/0 | -| TON | ADDRESS_FORMAT_TON_V4R2 | CURVE_ED25519 | m/44'/607'/0'/0/0 | -| XRP | ADDRESS_FORMAT_XRP | CURVE_SECP256K1 | m/44'/144'/0'/0/0 | - -#### Where can I learn more? - -In addition to the guide mentioned above on [HD Wallets](https://learnmeabitcoin.com/technical/hd-wallets), there is also a page specifically on [Derivation Paths](https://learnmeabitcoin.com/technical/derivation-paths). - -#### What if I don't see the address format for my network? - -You can use `ADDRESS_FORMAT_COMPRESSED` to generate a public key which can be used to sign with. - -#### What if I don't see the curve for my network? - -Contact us at hello@turnkey.com. - -## Delete wallets - -To delete wallets you can call the [delete wallets activity](https://docs.turnkey.com/api#tag/Wallets/operation/DeleteWallets). Before deleting a wallet it must have been exported to prevent loss of funds, or you can pass in the `deleteWithoutExport` parameter with the value `true` to override this. The `deleteWithoutExport` parameter, if not passed in, is default `false`. Note that this activity must be initiated by the wallet owner. - -## Private Keys - -Turnkey also supports raw private keys, but we recommend using Wallets since they offer several advantages: - -- Wallets can be used across various cryptographic curves -- Wallets can generate millions of addresses for various digital assets -- Wallets can be represented by a checksummed, mnemonic phrase making them easier to backup and recover - -## Export keys - -Exporting on Turnkey enables you or your end users to export a copy of a Wallet or Private Key from our system at any time. While most Turnkey users opt to keep Wallets within Turnkey's secure infrastructure, the export functionality means you are never locked into Turnkey, and gives you the freedom to design your own backup processes as you see fit. Check out our [Export Wallet guide](/wallets/export-wallets) to allow your users to securely export their wallets. - -## Import keys - -Importing on Turnkey enables you or your end users to import a Wallet or Private Key to our system. Check out our [Import Wallet guide](/wallets/import-wallets) to allow your users to securely import their wallets. - -## Delete keys - -To delete prviate keys you can call the [delete private keys activity](https://docs.turnkey.com/api#tag/Private-Keys/operation/DeletePrivateKeys). Before deleting a private key it must have been exported to prevent loss of funds, or you can pass in the `deleteWithoutExport` parameter with the value `true` to override this. The `deleteWithoutExport` parameter, if not passed in, is default `false`. Note that this activity must be initiated by the private key owner. diff --git a/docs/documentation/concepts/_category_.json b/docs/documentation/concepts/_category_.json deleted file mode 100644 index 6e81e196..00000000 --- a/docs/documentation/concepts/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Concepts", - "position": 3, - "collapsed": true -} diff --git a/docs/documentation/concepts/organizations.md b/docs/documentation/concepts/organizations.md deleted file mode 100644 index 0d6bd18b..00000000 --- a/docs/documentation/concepts/organizations.md +++ /dev/null @@ -1,54 +0,0 @@ ---- -sidebar_position: 2 -sidebar_label: Organizations -description: Understanding Turnkey organizations -slug: /concepts/organizations ---- - -# Organizations - -An organization is a logical grouping of resources (e.g. users, policies, wallets). These resources can only be accessed by authorized and permissioned users within the organization. Resources are not shared between organizations. - -## Root Quorum - -All organizations are controlled by a [Root Quorum](/concepts/users/root-quorum) which contains the root users and the required threshold of approvals to take any action. Only the root quorum can update the root quorum or feature set. - -## Features - -Organization features are Turnkey product offerings that organizations can opt-in to or opt-out of. Note that these features can be set and updated using the activities `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` and `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`. The following is a list of such features: - -| Name | Description | Default | Notes | -| ----------------------------- | --------------------------------------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| FEATURE_NAME_EMAIL_AUTH | Enables email authentication activities | Enabled | Can only be initiated by a parent organization for a sub-organization. | -| FEATURE_NAME_EMAIL_RECOVERY | Enables email recovery activities | Enabled | Can only be initiated by a parent organization for a sub-organization. | -| FEATURE_NAME_WEBAUTHN_ORIGINS | The origin Webauthn credentials are scoped to | Disabled | Parent organization feature applies to all sub-organizations.



If not enabled, sub-organizations default to allowing all origins: "\*". For Passkey WaaS, we highly recommend enabling this feature.



Example value: "https://www.turnkey.com" | -| FEATURE_NAME_WEBHOOK | A URL to receive activity notification events | Disabled | This feature is currently experimental.



Example value: "https://your.service.com/webhook" | - -## Permissions - -All activity requests are subject to enforcement by Turnkey's policy engine. The policy engine determines if a request is allowed by checking the following: - -- Does this request violate our feature set? - - Email recovery cannot be initiated if disabled - - Email auth cannot be initiated if disabled -- Should this request be denied by default? - - All import requests must target your own user -- Does this request meet the root quorum threshold? -- What is the outcome of evaluating this request against all organization policies? Outcomes include: - - `OUTCOME_ALLOW`: the request is allowed to process - - `OUTCOME_REQUIRES_CONSENSUS`: the request needs additional approvals - - `OUTCOME_REJECTED`: the request should be rejected - - `OUTCOME_DENY_EXPLICIT`: the request has been explicitly denied via policies - - `OUTCOME_DENY_IMPLICIT`: the request has been implicity denied as no policies grant the required permissions -- Should this request be allowed by default? - - Users can manage their own credentials unless policies explicitly deny this - -## Resource Limits - -Organizations have [resource limits](/concepts/resource-limits) for performance and security considerations. If you're bumping into these limits, check out sub-organizations below. - -## Sub-Organizations - -A sub-organization is an isolated organization that has a pointer to a parent organization. The parent organization has **read** access to all sub-organizations, but no **write** access. This means users within the parent organization have no ability to use wallets or alter any resources in the sub-organization. - -For more information on sub-organizations and common use cases for this functionality, follow along in the next section 👉. diff --git a/docs/documentation/concepts/policy-management/Policy-language.md b/docs/documentation/concepts/policy-management/Policy-language.md deleted file mode 100644 index e8e71d27..00000000 --- a/docs/documentation/concepts/policy-management/Policy-language.md +++ /dev/null @@ -1,192 +0,0 @@ ---- -description: A guide to authoring policies with our policy lanugage -slug: /concepts/policies/language -sidebar_label: Language ---- - -# Policy language - -This page provides an overview of how to author policies using our policy language. To begin, we'll need to get familiar with the language's grammar, keywords, and types. - -## Grammar - -The grammar has been designed for flexibility and expressiveness. We currently support the following operations: - -| Operation | Operators | Example | Types | -| ---------- | ---------------------------- | --------------------------- | ------------------------ | -| logical | &&, \|\| | "true && false" | (bool, bool) -> bool | -| comparison | ==, !=, <, >, <=, >= | "1 < 2" | (int, int) -> bool | -| comparison | ==, != | "'a' != 'b'" | (string, string) -> bool | -| comparison | in | "1 in [1, 2, 3]" | (T, list) -> bool | -| access | x[] | \[1,2,3\]\[0\] | (list) -> T | -| access | x[] | "'abc'[0]" | (string) -> string | -| access | x[..] | \[1,2,3\]\[0..2\] | (list) -> (list) | -| access | x[..] | "'abc'[0..2]" | (string) -> string | -| access | x. | "user.tags" | (struct) -> T | -| function | x.all(item, ) | "[1,1,1].all(x, x == 1)" | (list) -> bool | -| function | x.any(item, ) | "[1,2,3].any(x, x == 1)" | (list) -> bool | -| function | x.contains() | "[1,2,3].contains(1)" | (list) -> bool | -| function | x.count() | "[1,2,3].count()" | (list) -> int | -| function | x.filter(item, ) | "[1,2,3].filter(x, x == 1)" | (list) -> (list) | - -## Keywords - -Keywords are reserved words that are dynamically interchanged for real values at evaluation time. Each field supports a different set of keywords. - -### Consensus - -| Keyword | Type | Description | -| ------------- | ----------- | ---------------------------------------- | -| **approvers** | list | The users that have approved an activity | - -### Condition - -| Keyword | Type | Description | -| --------------- | ------------------- | ------------------------------------------------------------ | -| **activity** | Activity | The activity metadata of the request | -| **eth.tx** | EthereumTransaction | The parsed Ethereum transaction payload (see Appendix below) | -| **solana.tx** | SolanaTransaction | The parsed Solana transaction payload (see Appendix below) | -| **wallet** | Wallet | The target wallet used in sign requests | -| **private_key** | PrivateKey | The target private key used in sign requests | - -## Types - -The language is strongly typed which makes policies easy to author and maintain. - -### Primitive - -| Type | Example | Notes | -| ------------ | ------------- | ---------------------------------------------- | -| **bool** | true | | -| **int** | 256 | i128 | -| **string** | 'a' | only single quotes are supported | -| **list** | [1, 2, 3] | a list of type T | -| **struct** | { id: 'abc' } | a key-value map of { field:T } (defined below) | - -### Struct - -| Struct | Field | Type | Description | -| ----------------------- | ---------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| **User** | id | string | The identifier of the user | -| | tags | list | The collection of tags for the user | -| | email | string | The email address of the user | -| | alias | string | The alias of the user | -| **Activity** | type | string | The type of the activity (e.g. ACTIVITY_TYPE_SIGN_TRANSACTION_V2) | -| | resource | string | The resource type the activity targets: `USER`, `PRIVATE_KEY`, `POLICY`, `WALLET`, `ORGANIZATION`, `INVITATION`, `CREDENTIAL`, `CONFIG`, `RECOVERY`, `AUTH`, `PAYMENT_METHOD`, `SUBSCRIPTION` | -| | action | string | The action of the activity: `CREATE`, `UPDATE`, `DELETE`, `SIGN`, `EXPORT`, `IMPORT` | -| **Wallet** | id | string | The identifier of the wallet | -| **Wallet Account** | address | string | The wallet account address | -| **PrivateKey** | id | string | The identifier of the private key | -| | tags | list | The collection of tags for the private key | -| **EthereumTransaction** | from | string | The sender address of the transaction | -| | to | string | The receiver address of the transaction (can be an EOA or smart contract) | -| | data | string | The arbitrary calldata of the transaction (hex-encoded) | -| | value | int | The amount being sent (in wei) | -| | gas | int | The maximum allowed gas for the transaction | -| | gas_price | int | The price of gas for the transaction (Note: this field was used in legacy transactions and was replaced with max_fee_per_gas in EIP 1559 transactions, however when evaluating policies on EIP 1559 transactions, this field will be populated with the same value as max_fee_per_gas) | -| | chain_id | int | The chain identifier for the transaction | -| | nonce | int | The nonce for the transaction | -| | max_fee_per_gas | int | EIP 1559 field specifying the max amount to pay per unit of gas for the transaction (Note: This is the sum of the gas for the transaction and the priority fee described below) | -| | max_priority_fee_per_gas | int | EIP 1559 field specifying the max amount of the tip to be paid to miners for the transaction | -| **SolanaTransaction** | account_keys | list | The accounts (public keys) involved in the transaction | -| | program_keys | list | The programs (public keys) involved in the transaction | -| | instructions | list | A list of Instructions (see below) | -| | transfers | list | A list of Transfers (see below) | -| | recent_blockhash | string | The recent blockhash specified in a transaction | - -#### Nested Structs - -| Struct | Field | Type | Description | -| ---------------------- | --------------------- | ------------------------- | ------------------------------------------------------------------------------------------------------------------------ | -| **Instruction** | program_key | string | The program (public key) involved in the instruction | -| | accounts | list | A list of Accounts involved in the instruction | -| | instruction_data_hex | string | Raw hex bytes corresponding to instruction data | -| | address_table_lookups | list | A list of AddressTableLookups used in the instruction. Learn more [here](https://solana.com/docs/advanced/lookup-tables) | -| **Transfer** | sender | string | A Solana account (public key) | -| | recipient | string | A Solana account (public key) | -| | amount | string | The native SOL amount for the transfer (lamports) | -| **Account** | account_key | string | A Solana account (public key) | -| | signer | boolean | An indicator of whether or not the account is a signer | -| | writable | boolean | An indicator of whether or not the account can perform a write operation | -| **AddressTableLookup** | address_table_key | string | A Solana address (public key) corresponding to the address table | -| | writable_indexes | list | Indexes corresponding to accounts that can perform writes | -| | readonly_indexes | list | Indexes corresponding to accounts that can only perform reads | - -## Activity Breakdown - -| Resource Type | Action | Activity Type | -|--------------------|--------|-:------------------------------------------| -| **ORGANIZATION** | CREATE | ACTIVITY_TYPE_CREATE_SUB_ORGANIZATION_V7 | -| | DELETE | ACTIVITY_TYPE_DELETE_ORGANIZATION | -| | DELETE | ACTIVITY_TYPE_DELETE_SUB_ORGANIZATION | -| **INVITATION** | CREATE | ACTIVITY_TYPE_CREATE_INVITATIONS | -| | DELETE | ACTIVITY_TYPE_DELETE_INVITATION | -| **POLICY** | CREATE | ACTIVITY_TYPE_CREATE_POLICY_V3 | -| | CREATE | ACTIVITY_TYPE_CREATE_POLICIES | -| | UPDATE | ACTIVITY_TYPE_UPDATE_POLICY | -| | DELETE | ACTIVITY_TYPE_DELETE_POLICY | -| **WALLET** | CREATE | ACTIVITY_TYPE_CREATE_WALLET | -| | CREATE | ACTIVITY_TYPE_CREATE_WALLET_ACCOUNTS | -| | EXPORT | ACTIVITY_TYPE_EXPORT_WALLET | -| | EXPORT | ACTIVITY_TYPE_EXPORT_WALLET_ACCOUNT | -| | IMPORT | ACTIVITY_TYPE_INIT_IMPORT_WALLET | -| | IMPORT | ACTIVITY_TYPE_IMPORT_WALLET | -| | DELETE | ACTIVITY_TYPE_DELETE_WALLETS | -| | UPDATE | ACTIVITY_TYPE_UPDATE_WALLET | -| **PRIVATE_KEY** | CREATE | ACTIVITY_TYPE_CREATE_PRIVATE_KEYS_V2 | -| | CREATE | ACTIVITY_TYPE_CREATE_PRIVATE_KEY_TAG | -| | UPDATE | ACTIVITY_TYPE_UPDATE_PRIVATE_KEY_TAG | -| | DELETE | ACTIVITY_TYPE_DISABLE_PRIVATE_KEY | -| | DELETE | ACTIVITY_TYPE_DELETE_PRIVATE_KEY_TAGS | -| | DELETE | ACTIVITY_TYPE_DELETE_PRIVATE_KEYS | -| | EXPORT | ACTIVITY_TYPE_EXPORT_PRIVATE_KEY | -| | IMPORT | ACTIVITY_TYPE_INIT_IMPORT_PRIVATE_KEY | -| | IMPORT | ACTIVITY_TYPE_IMPORT_PRIVATE_KEY | -| | SIGN | ACTIVITY_TYPE_SIGN_RAW_PAYLOAD_V2 | -| | SIGN | ACTIVITY_TYPE_SIGN_RAW_PAYLOADS | -| | SIGN | ACTIVITY_TYPE_SIGN_TRANSACTION_V2 | -| **USER** | CREATE | ACTIVITY_TYPE_CREATE_USERS_V2 | -| | CREATE | ACTIVITY_TYPE_CREATE_USER_TAG | -| | CREATE | ACTIVITY_TYPE_CREATE_API_ONLY_USERS | -| | UPDATE | ACTIVITY_TYPE_UPDATE_USER | -| | UPDATE | ACTIVITY_TYPE_UPDATE_USER_TAG | -| | DELETE | ACTIVITY_TYPE_DELETE_USERS | -| | DELETE | ACTIVITY_TYPE_DELETE_USER_TAGS | -| **CREDENTIAL** | CREATE | ACTIVITY_TYPE_CREATE_API_KEYS_V2 | -| | CREATE | ACTIVITY_TYPE_CREATE_AUTHENTICATORS_V2 | -| | DELETE | ACTIVITY_TYPE_DELETE_API_KEYS | -| | DELETE | ACTIVITY_TYPE_DELETE_AUTHENTICATORS | -| | CREATE | ACTIVITY_TYPE_CREATE_OAUTH_PROVIDERS | -| | DELETE | ACTIVITY_TYPE_DELETE_OAUTH_PROVIDERS | -| **PAYMENT_METHOD** | UPDATE | ACTIVITY_TYPE_SET_PAYMENT_METHOD_V2 | -| | DELETE | ACTIVITY_TYPE_DELETE_PAYMENT_METHOD | -| **SUBSCRIPTION** | CREATE | ACTIVITY_TYPE_ACTIVATE_BILLING_TIER | -| **CONFIG** | UPDATE | ACTIVITY_TYPE_UPDATE_ALLOWED_ORIGINS | -| **RECOVERY** | CREATE | ACTIVITY_TYPE_INIT_USER_EMAIL_RECOVERY | -| **AUTH** | CREATE | ACTIVITY_TYPE_EMAIL_AUTH_V2 | -| | CREATE | ACTIVITY_TYPE_INIT_OTP_AUTH | -| | CREATE | ACTIVITY_TYPE_OTP_AUTH | -| | CREATE | ACTIVITY_TYPE_OAUTH | -| | CREATE | ACTIVITY_TYPE_CREATE_READ_WRITE_SESSION_V2 | - -## Appendix - -### Root quorum activities - -There are a select few activities that are not governed by policies, but rather by an organization's [root quorum](../../concepts/user-management/Root-quorum.md). These activities are: `ACTIVITY_TYPE_UPDATE_ROOT_QUORUM`, `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE`, `ACTIVITY_TYPE_REMOVE_ORGANIZATION_FEATURE`. For example, if a policy is added that allows a specific non-root user to perform `ACTIVITY_TYPE_SET_ORGANIZATION_FEATURE` activities, these requests will still fail as they are subject specifically to root quorum. - -### Ethereum - -Our Ethereum policy language (accessible via `eth.tx`) allows for the granular governance of signing Ethereum (EVM-compatible) transactions. Our policy engine exposes a [fairly standard set of properties](https://ethereum.org/en/developers/docs/transactions/#typed-transaction-envelope) belonging to a transaction. - -See the [Policy examples](./Policy-examples.mdx) for sample scenarios. - -### Solana - -Similarly, our Solana policy language (accessible via `solana.tx`) allows for control over signing Solana transactions. Note that there are some fundamental differences between the architecture of the two types of transactions, hence the resulting differences in policy structure. Notably, within our policy engine, a Solana transaction contains a list of Transfers, currently corresponding to native SOL transfers. Each transfer within a transaction is considered a separate entity. Here are some approaches you might take to govern native SOL transfers: - -- _All_ transfers need to match the policy condition. Useful for allowlists ([example](./Policy-examples.mdx#allow-solana-transactions-that-include-a-transfer-with-only-one-specific-recipient)) -- _Just one_ transfer needs to match the policy condition. Useful for blocklists ([example](./Policy-examples.mdx#deny-all-solana-transactions-transferring-to-an-undesired-address)) -- Only match if there is a _single_ transfer in the transaction, _and_ that transfer meets the criteria ([example](./Policy-examples.mdx#allow-solana-transactions-that-have-exactly-one-transfer-with-one-specific-recipient)). This is the most secure approach, and thus most restrictive. - -See the [Policy examples](./Policy-examples.mdx) for sample scenarios. diff --git a/docs/documentation/concepts/policy-management/_category_.json b/docs/documentation/concepts/policy-management/_category_.json deleted file mode 100644 index 049be11d..00000000 --- a/docs/documentation/concepts/policy-management/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Policies", - "position": 7, - "collapsed": true -} diff --git a/docs/documentation/concepts/resource-limits.md b/docs/documentation/concepts/resource-limits.md deleted file mode 100644 index 404a1625..00000000 --- a/docs/documentation/concepts/resource-limits.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -sidebar_position: 6 -sidebar_label: Resource Limits -description: Organization resource limits -slug: /concepts/resource-limits ---- - -# Resource Limits - -We have limits on the number of resources within a single organization to avoid performance slowdowns and overly complex permission models. You can scale your organizational resources beyond these limits via [sub-organizations](/concepts/Sub-Organizations). You can create an unlimited number of sub-organizations within a single organization. - -Currently, the resource limits within a single organization are as follows: - -| Resource | Maximum parent org allowance | Maximum sub-org allowance | -| :----------------------------- | :--------------------------: | :-----------------------: | -| Private keys | 1,000 | 1,000 | -| HD Wallets | 100 | 100 | -| HD Wallet Accounts | unlimited | unlimited | -| Users | 100 | 100 | -| Policies | 100 | 100 | -| Invitations | 100 | 100 | -| Tags | 100 | 10 | -| Authenticators per user | 10 | 10 | -| API keys per user (long-lived) | 10 | 10 | -| API keys per user (expiring) | 10 | 10 | -| Sub-Organizations | unlimited | 0 | -| OAuth providers per user | 10 | 10 | - -Note that if you create an expiring API key that would exceed the limit above, Turnkey automatically deletes one of your existing keys using the following priority: - -1. Expired API keys are deleted first -2. If no expired keys exist, the oldest unexpired key is deleted - -If you are approaching any of these limits in your implementation and require support, reach out to the Turnkey team (). diff --git a/docs/documentation/concepts/sub-organizations.md b/docs/documentation/concepts/sub-organizations.md deleted file mode 100644 index 880babc3..00000000 --- a/docs/documentation/concepts/sub-organizations.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -sidebar_position: 3 -sidebar_label: Sub-Organizations -description: Learn about sub-orgs and how you can use them -slug: /concepts/sub-organizations ---- - -# Sub-Organizations - -Using Turnkey's flexible infrastructure, you can programmatically create and manage sub-organizations for your end-users. sub-organizations aren't subject to size limits: you can create as many sub-organizations as needed. The parent organization has **read-only** visibility into all of its sub-organizations, and activities performed in sub-organizations roll up to the parent for billing purposes. - -We envision sub-organizations being very useful to model your End-Users if you're a business using Turnkey for key management. Let's explore how. - -## Creating Sub-Organizations - -Creating a new sub-organization is an activity performed by the parent organization. The activity itself takes the following attributes as inputs: - -- organization name -- a list of root users -- a root quorum threshold -- [optional] a wallet (note: in versions prior to V4, this was a private key) - -Root users can be programmatic or human, with one or many credentials attached. - -## Using Sub-Organizations - -[Sub-Organizations as Wallets](/embedded-wallets/sub-organizations-as-wallets) explains how you might want to use this primitive as a way to model end-user controlled wallets, or custodial wallets. If you have another use-case in mind, or questions/feedback on this page, reach out to [welcome@turnkey.com](mailto:welcome@turnkey.com)! - -## Deleting Sub-Organizations - -To delete sub-organizations you can call the [delete sub-organization activity](https://docs.turnkey.com/api#tag/Organizations/operation/DeleteSubOrganization). Before deleting a sub-organization all private keys and wallets within the sub-organization must have been exported to prevent loss of funds, or you can pass in the `deleteWithoutExport` parameter with the value `true` to override this. The `deleteWithoutExport` parameter, if not passed in, is default `false`. - -Note that this activity must be initiated by a root user in the sub-organization that is to be deleted. A parent org cannot delete a sub-organization without its participation. diff --git a/docs/documentation/concepts/user-management/Introduction.md b/docs/documentation/concepts/user-management/Introduction.md deleted file mode 100644 index 01e07809..00000000 --- a/docs/documentation/concepts/user-management/Introduction.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -sidebar_position: 1 -description: Learn about Users on Turnkey -slug: /concepts/users/introduction ---- - -# Introduction to users - -Turnkey users are resources within organizations or sub-organizations that can submit activities to Turnkey via a valid credential (e.g., API key, passkey). These requests can be made either by making direct API calls or through the Turnkey Dashboard. Users must have at least one valid credential (one of API key, passkey), with upper limits on credentials defined here in our [resource limits](/concepts/resource-limits). Users can also have associated “tags” which are logical groupings that can be referenced in policies. Users can only submit activities within their given organization — they cannot take action across organizations. - -A User's attributes are: - -- UUID: a globally unique ID (e.g. `fc6372d1-723d-4f7e-8554-dc3a212e4aec`), used as a unique identifier for a User in the context of Policies or User Tags, or Quorums. -- Name and email -- Authenticators: a list of authenticators (see below for information) -- API key: a list of API keys (see below for information) -- User tags: a list of User Tag UUIDs - -A **user belongs to one organization**, and one organization can have many (**up to 100**) users. If you need to create more users, consider using Sub-Organizations. diff --git a/docs/documentation/concepts/user-management/_category_.json b/docs/documentation/concepts/user-management/_category_.json deleted file mode 100644 index d84639e0..00000000 --- a/docs/documentation/concepts/user-management/_category_.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "Users", - "position": 4, - "collapsed": true, - "link": { - "type": "doc", - "id": "documentation/concepts/user-management/Introduction" - } -} diff --git a/docs/documentation/developer-reference/_category_.json b/docs/documentation/developer-reference/_category_.json deleted file mode 100644 index fe657389..00000000 --- a/docs/documentation/developer-reference/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Developer Reference", - "position": 7, - "collapsed": true -} diff --git a/docs/documentation/developer-reference/api-overview/_category_.json b/docs/documentation/developer-reference/api-overview/_category_.json deleted file mode 100644 index 2cadcc0b..00000000 --- a/docs/documentation/developer-reference/api-overview/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "API Overview", - "position": 1, - "collapsed": true -} diff --git a/docs/documentation/developer-reference/api-overview/intro.md b/docs/documentation/developer-reference/api-overview/intro.md deleted file mode 100644 index 3d2e8556..00000000 --- a/docs/documentation/developer-reference/api-overview/intro.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -sidebar_position: 1 -description: Getting started with the Turnkey API -slug: /developer-reference/api-overview/intro ---- - -# Introduction - -## RPC/HTTP - -Turnkey's API is a remote procedure call (RPC) API. We chose RPC-over-HTTP for convenience and ease-of-use. Most of our users should be able to integrate with our API without a major re-architecture of their existing systems. - -Many client libraries are available to make requests to a RPC/HTTP API, across many languages. Turnkey will provide SDKs for the most popular programming languages. For other languages, a RPC/HTTP API ensures there is an easy integration path available via raw http clients. - -## POST-only - -If you look at the [API reference](/api) you'll notice that all API calls to Turnkey are HTTP POST requests. Requests contain a POST body and a header with a digital signature over the POST body. We call this digitial signature a [Stamp](./stamps.md). - -Requests must be stamped by registered user credentials and verified by Turnkey's secure enclaves before they are processed. This ensures cryptographic integrity end-to-end which eliminates the ability for any party to modify a user's request. - -### Queries and Submissions - -Turnkey's API is divided into 2 broad categories: queries and submissions. - -- Queries are read requests (e.g. `get_users`, `list_users`) -- Submissions are requests to execute a workload (e.g. `create_policy`, `sign_transaction`, `delete_user`) - -## Dive Deeper - -- Creating your first [Stamp](./stamps.md) -- Fetching data with [Queries](./queries.md) -- Executing workloads with [Submissions](./submissions.md) diff --git a/docs/documentation/developer-reference/api-overview/queries.md b/docs/documentation/developer-reference/api-overview/queries.md deleted file mode 100644 index 639c11fd..00000000 --- a/docs/documentation/developer-reference/api-overview/queries.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 3 -description: Fetching data from Turnkey -slug: /developer-reference/api-overview/queries ---- - -# Queries - -Queries are read requests to Turnkey's API. Query URL paths are prefixed with `/public/v1/query`. Queries are not subject to enforcement of the policy engine. All users within an organization can read any data within the organization. - -Additionally, parent organizations have the ability to query data for all of their sub-organizations. diff --git a/docs/documentation/developer-reference/api-overview/stamps.md b/docs/documentation/developer-reference/api-overview/stamps.md deleted file mode 100644 index c982f3fb..00000000 --- a/docs/documentation/developer-reference/api-overview/stamps.md +++ /dev/null @@ -1,65 +0,0 @@ ---- -sidebar_position: 2 -description: Creating your first signed request -slug: /developer-reference/api-overview/stamps ---- - -# Stamps - -Every request made to Turnkey must include a signature over the POST body attached as a HTTP header. Our secure enclave applications use this signature to verify the integrity and authenticity of the request. - -### API Keys - -To create a valid, API key stamped request follow these steps: - -1. Sign the JSON-encoded POST body with your API key to produce a `signature` (DER-encoded) -2. Hex encode the `signature` -3. Create a JSON-encoded stamp: - - `publicKey`: the public key of API key - - `signature`: the signature produced by the API key - - `scheme`: `SIGNATURE_SCHEME_TK_API_P256` -4. Base64URL encode the stamp -5. Attach the encoded string to your request as a `X-Stamp` header -6. Submit the stamped request to Turnkey's API - -### WebAuthn - -To create a valid, Webauthn authenticator stamped request follow these steps: - -1. Compute the webauthn challenge by hashing the POST body bytes (JSON encoded) with SHA256. For example, if the POST body is `{"organization_id": "1234", "type": "ACTIVITY_TYPE_CREATE_API_KEYS", "params": {"for": "example"}`, the webauthn challenge is the string `7e8b4653fc7e51dc119cea031942f4693b4742ceca4dda269b925802b38b2147` -2. Include the challenge amongst WebAuthn signing options. Refer to the existing stamper implementations in the [following section](#stampers)) for examples - -- Note that if you need to pass the challenge as bytes, you'll need to utf8-encode the challenge string (in JS, the challenge bytes will be `TextEncoder().encode("7e8b4653fc7e51dc119cea031942f4693b4742ceca4dda269b925802b38b2147")`) -- Additional note for React Native contexts: the resulting string should then additionally be base64-encoded. See [implementation](https://github.com/tkhq/sdk/blob/b52db566e79a65eec8d8e7066053d6a3ac5f3943/packages/react-native-passkey-stamper/src/util.ts#L5-L10) - -3. Create a JSON-encoded stamp: - - `credentialId`: the id of the webauthn authenticator - - `authenticatorData`: the authenticator data produced by Webauthn assertion - - `clientDataJson`: the client data produced by the Webauthn assertion - - `signature`: the signature produced by the Webauthn assertion -4. Attach the JSON-encoded stamp to your request as a `X-Stamp-Webauthn` header - - Header names are case-insensitive (so `X-Stamp-Webauthn` and `X-Stamp-WebAuthn` are considered equivalent) - - Unlike API key stamps, the format is just JSON; no base64URL encoding necessary! For example: `X-Stamp-Webauthn: {"authenticatorData":"UaQZ...","clientDataJson":"eyJ0...","credentialId":"Grf...","signature":"MEQ..."}` -5. Submit the stamped request to Turnkey's API. If you would like your client request to be proxied through a backend, refer to the patterns mentioned [here](/authentication/passkeys/integration#proxying-signed-requests). An example application that uses this pattern can be found at wallet.tx.xyz (code [here](https://github.com/tkhq/demo-embedded-wallet/)) - -### Stampers - -Our [JS SDK](https://github.com/tkhq/sdk) and [CLI](https://github.com/tkhq/tkcli) abstract request stamping for you. If you choose to use an independent client, you will need to implement this yourself. For reference, check out our implementations: - -- [API Key Stamper](https://github.com/tkhq/sdk/blob/main/packages/api-key-stamper) -- [WebAuthn Stamper](https://github.com/tkhq/sdk/blob/main/packages/webauthn-stamper) -- [React Native Stamper](https://github.com/tkhq/sdk/tree/main/packages/react-native-passkey-stamper) -- [iFrame Stamper](https://github.com/tkhq/sdk/tree/main/packages/iframe-stamper) -- [Telegram Cloud Storage Stamper](https://github.com/tkhq/sdk/tree/main/packages/telegram-cloud-storage-stamper) -- [CLI](https://github.com/tkhq/tkcli/blob/main/src/cmd/turnkey/pkg/request.go) - -Our CLI has a `--no-post` option to generate stamps without sending anything over the network. This is a useful tool should you have trouble with debugging stamping-related logic. A sample command might look something like: - -``` -turnkey request --no-post --host api.turnkey.com --path /api/v1/sign --body '{"payload": "hello from TKHQ"}' -{ - "curlCommand": "curl -X POST -d'{\"payload\": \"hello from TKHQ\"}' -H'X-Stamp: eyJwdWJsaWNLZXkiOiIwMzI3YTUwMDMyZTZmMDYzMWQ1NjA1YjZhZGEzMmI3NzkwNzRmMzQ2ZTgxYjY4ZTEyODAxNjQwZjFjOWVlMDNkYWUiLCJzaWduYXR1cmUiOiIzMDQ0MDIyMDM2MjNkZWZkNjE4ZWIzZTIxOTk3MDQ5NjQwN2ViZTkyNDQ3MzE3ZGFkNzVlNDEyYmQ0YTYyNjdjM2I1ZTIyMjMwMjIwMjQ1Yjc0MDg0OGE3MmQwOGI2MGQ2Yzg0ZjMzOTczN2I2M2RiM2JjYmFkYjNiZDBkY2IxYmZiODY1NzE1ZDhiNSIsInNjaGVtZSI6IlNJR05BVFVSRV9TQ0hFTUVfVEtfQVBJX1AyNTYifQ' -v 'https://api.turnkey.com/api/v1/sign'", - "message": "{\"payload\": \"hello from TKHQ\"}", - "stamp": "eyJwdWJsaWNLZXkiOiIwMzI3YTUwMDMyZTZmMDYzMWQ1NjA1YjZhZGEzMmI3NzkwNzRmMzQ2ZTgxYjY4ZTEyODAxNjQwZjFjOWVlMDNkYWUiLCJzaWduYXR1cmUiOiIzMDQ0MDIyMDM2MjNkZWZkNjE4ZWIzZTIxOTk3MDQ5NjQwN2ViZTkyNDQ3MzE3ZGFkNzVlNDEyYmQ0YTYyNjdjM2I1ZTIyMjMwMjIwMjQ1Yjc0MDg0OGE3MmQwOGI2MGQ2Yzg0ZjMzOTczN2I2M2RiM2JjYmFkYjNiZDBkY2IxYmZiODY1NzE1ZDhiNSIsInNjaGVtZSI6IlNJR05BVFVSRV9TQ0hFTUVfVEtfQVBJX1AyNTYifQ" -} -``` diff --git a/docs/documentation/ecosystems/_category_.json b/docs/documentation/ecosystems/_category_.json deleted file mode 100644 index 7246522f..00000000 --- a/docs/documentation/ecosystems/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Ecosystem", - "position": 6, - "collapsed": true -} diff --git a/docs/documentation/ecosystems/framework.mdx b/docs/documentation/ecosystems/framework.mdx deleted file mode 100644 index 297dbc05..00000000 --- a/docs/documentation/ecosystems/framework.mdx +++ /dev/null @@ -1,55 +0,0 @@ ---- -title: Overview -sidebar_label: Overview -sidebar_position: 1 -slug: /ecosystems/framework ---- - -import DocCardList from "@theme/DocCardList"; - -# Overview - -## Introduction - -Turnkey operates at the **cryptographic curve** level rather that specific assets. As a result Turnkey is asset -agnostic and can be used with any type of asset as long as we support the underlying curve. - -We are continuously evaluating and adding support for emerging assets and protocols. If there are specific -cryptocurrencies you'd like to see us offer deeper support for, please let us know by contacting us at -[hello@turnkey.com](mailto:hello@turnkey.com), on [X](https://x.com/turnkeyhq/), or -[on Slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-2837d2isy-gbH60kJ~XnXSSFHiqVOrqw). - -## What is Turnkey's approach to supporting crypto assets? - -Turnkey follows a tiered approach to supporting digital assets, ranging from supporting cryptographic curve support, -to advanced transaction parsing and policy management. Each tier deepens the level of functionality, as outlined below: - -**Tier 1: Curve-level support** - -Cryptographic curves are our fundamental primitive, allowing Turnkey private keys to store and sign for any -cryptocurrency that uses a supported curve. We currently support SECP256k1 and Ed25519 curves. - -**Tier 2: Address derivation** - -Turnkey abstracts address generation, automatically deriving addresses for supported cryptocurrencies. - -For a full list of address formats you can derive on Turnkey, refer to [Address formats and Curves](/concepts/wallets). - -**Tier 3: SDK for transaction construction and signing** - -Our SDK provides tools and scripts to help in constructing and signing basic transactions, enabling an even smoother integration. - -**Tier 4: Transaction parsing and policy creation** - -At our highest level of support, Turnkey offers the ability to parse transactions and define custom policies based on transaction parameters. - -| Tier | Depth of support | EVM   | SVM   | BTC   | ATOM | TRON | SUI    | APT   | MOVE | -| ----------- | :------------------------------- | --------------- | --------------- | --------------- | ---- | ---- | --------------------- | --------------- | ---- | -| Tier 1 | Curve-level | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| Tier 2 | Address derivation | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | -| Tier 3 | SDK construction and signing | ✅ | ✅ | | | | | | | -| Tier 4 | Transaction parsing and policies | ✅ | ✅ | | | | | | | - -For more details about each ecosystem, refer to the pages below: - - diff --git a/docs/documentation/ecosystems/others.md b/docs/documentation/ecosystems/others.md deleted file mode 100644 index bebd77b8..00000000 --- a/docs/documentation/ecosystems/others.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -sidebar_position: 1000 -title: Others -description: "Specific support for other ecosystems on Turnkey" -slug: /ecosystems/others ---- - -# What other ecosystems and chains does Turnkey support? - -## Cosmos - -We support address derivation and have published a package on NPM to help with transaction construction: [`@turnkey/cosmjs`](https://www.npmjs.com/package/@turnkey/cosmjs). See it in action in [`examples/with-cosmjs`](https://github.com/tkhq/sdk/tree/main/examples/with-cosmjs). - -## Tron, Sui, Aptos, Movement - -We support address derivation for these ecosystems. We also have two SDK examples: - -- [`examples/with-sui`](https://github.com/tkhq/sdk/tree/main/examples/with-sui) demonstrates transaction construction and broadcast on Sui. -- [`examples/with-aptos`](https://github.com/tkhq/sdk/tree/main/examples/with-aptos) demonstrates transaction construction and broadcast on Aptos. - -## Ed25519 and SECP256k1 Signing - -Turnkey supports bare Ed25519 and SECP256k1 signing which covers most ecosystems and blockchains out there. If your ecosystem of choice isn't covered adequately we're open to feedback and feature requests. Give us a shout on [X](https://x.com/turnkeyhq/) or [Slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-2837d2isy-gbH60kJ~XnXSSFHiqVOrqw)! diff --git a/docs/documentation/getting-started/_category_.json b/docs/documentation/getting-started/_category_.json deleted file mode 100644 index 289872bf..00000000 --- a/docs/documentation/getting-started/_category_.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "label": "Getting Started", - "position": 1, - "collapsed": false, - "link": { - "type": "generated-index", - "description": "Get started with Turnkey.", - "slug": "/getting-started" - } -} diff --git a/docs/documentation/getting-started/quickstart/_category_.json b/docs/documentation/getting-started/quickstart/_category_.json deleted file mode 100644 index 20ebbd99..00000000 --- a/docs/documentation/getting-started/quickstart/_category_.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "Quickstart", - "position": 1, - "collapsed": false, - "link": { - "type": "doc", - "id": "quickstart" - } -} diff --git a/docs/documentation/getting-started/quickstart/embedded-wallet-quickstart.mdx b/docs/documentation/getting-started/quickstart/embedded-wallet-quickstart.mdx deleted file mode 100644 index 6b035a84..00000000 --- a/docs/documentation/getting-started/quickstart/embedded-wallet-quickstart.mdx +++ /dev/null @@ -1,641 +0,0 @@ ---- -id: embedded-wallet-quickstart -sidebar_position: 2 -description: Quickstart guide to building Embedded Wallets with Turnkey -slug: /getting-started/embedded-wallet-quickstart -sidebar_label: "Embedded Wallets" -title: "Embedded Wallets" ---- - -import DocCardList from "@theme/DocCardList"; - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import { Step, Steps } from "@site/src/components/step"; - -# Embedded Wallets Quickstart - -Turnkey's Embedded Wallets enable you to integrate secure, custom wallet experiences directly -into your product. With features like advanced security, seamless authentication, and flexible -UX options, you can focus on building great products while we handle the complexities of private key management. - -## Prerequisites - -This guide assumes you've completed the steps to create an account, organization, and API keypair as described in the [Quickstart](/getting-started/quickstart) section. - -## Installation - -Create a new Next.js app via `npx create-next-app@latest`. Or install into an existing project. - - - - -```bash -npm install @turnkey/sdk-react -``` - - - - -```bash -pnpm add @turnkey/sdk-react -``` - - - - -```bash -yarn add @turnkey/sdk-react -``` - - - - -:::note - -**React 19 Users** - -If you're using Next.js 15 with React 19 you may encounter an installation error with `@turnkey/sdk-react`. Consider: - -- Downgrading React to `18.x.x` -- Using `npm install --force` or `--legacy-peer-deps` - -You may learn more about this [here](https://ui.shadcn.com/docs/react-19). - -::: - -## Setup - - - -Environment - -The following environment variables are necessary to use the Turnkey SDK. - -```bash title=".env" -NEXT_PUBLIC_ORGANIZATION_ID= -TURNKEY_API_PUBLIC_KEY= -TURNKEY_API_PRIVATE_KEY= -NEXT_PUBLIC_BASE_URL=https://api.turnkey.com -``` - -Configure - -Fill in with your Organization ID and API Base URL. - -```tsx title="src/app/layout.tsx" -const config = { - apiBaseUrl: "https://api.turnkey.com", - defaultOrganizationId: process.env.NEXT_PUBLIC_ORGANIZATION_ID, -}; -``` - -Provider - -Wrap your layout with the `TurnkeyProvider` component, and import styles from sdk-react. - -```tsx title="src/app/layout.tsx" -import { TurnkeyProvider } from "@turnkey/sdk-react"; -import "@turnkey/sdk-react/styles"; // required to render auth component styles properly - -export default function RootLayout({ children }) { - return ( - - - {children} - - - ); -} -``` - -:::note - -**React 19 Users** - -`@turnkey/sdk-react` is built with React 18. If you're using React 19 you'll find a type mismatch on the children type. - -To fix this, you can use the `@ts-ignore` directive to suppress the error. - -```tsx title="src/app/layout.tsx" - - {/* @ts-ignore */} - {children} - -``` - -We're actively working towards React 19 compatibility. - -::: - - - -## Authenticate - -

- Auth Component -

- -The auth component contains the UI and logic to handle the authentication flow. - - - -Configure - -For simplicity, this app will only support email authentication. We have other guides on additional authentication methods. -Additionally, you can customize the order in which the auth methods are displayed. - -```tsx title="src/app/page.tsx" -"use client"; - -export default function Home() { - // The auth methods to display in the UI - const config = { - authConfig: { - emailEnabled: true, - // Set the rest to false to disable them - passkeyEnabled: false, - phoneEnabled: false, - appleEnabled: false, - facebookEnabled: false, - googleEnabled: false, - }, - // The order of the auth methods to display in the UI - configOrder: ["email" /* "passkey", "phone", "socials" */], - }; - - return
; -} -``` - -
-Auth Config Options - -```ts -type AuthConfig = { - emailEnabled: boolean; - passkeyEnabled: boolean; - phoneEnabled: boolean; - appleEnabled: boolean; - googleEnabled: boolean; - facebookEnabled: boolean; -}; -``` - -
- -Import - -Import the auth component into your app and pass in the config object. - -```tsx title="src/app/page.tsx" -"use client"; - -import { Auth } from "@turnkey/sdk-react"; - -export default function Home() { - const config = { - authConfig: { - emailEnabled: true, - passkeyEnabled: false, - phoneEnabled: false, - appleEnabled: false, - facebookEnabled: false, - googleEnabled: false, - }, - configOrder: ["email"], - }; - - return ( -
- -
- ); -} -``` - -Handlers - -Define two functions to handle the "success" and "error" states. Initially, the `onError` function will set an `errorMessage` -state variable which will be used to display an error message to the user. The `onAuthSuccess` -function will route the user to the dashboard after successful authentication. - -A new [sub-organization](/concepts/sub-organizations) and [wallet](/concepts/wallets) is created for each new user during the authentication flow. - -```tsx title="src/app/page.tsx" -"use client"; - -import { useState } from "react"; -import { Auth } from "@turnkey/sdk-react"; - -export default function Home() { - const [errorMessage, setErrorMessage] = useState(""); - const router = useRouter(); - - const onAuthSuccess = async () => { - // We'll add the dashboard route in the next step - router.push("/dashboard"); - }; - - const onError = (errorMessage: string) => { - setErrorMessage(errorMessage); - }; - - // Add the handlers to the config object - const config = { - // ... - onAuthSuccess: onAuthSuccess, - onError: onError, - }; - - return ( -
- -
- ); -} -``` - -Dashboard: User Session - -Add a dashboard route to the app where the user will be able to view their account and sign messages. - -```tsx title="src/app/dashboard/page.tsx" -export default function Dashboard() { - return
Dashboard
; -} -``` - -Since the app is wrapped with the `TurnkeyProvider` component, the `useTurnkey` hook is available to all child components. -Calling `turnkey.getCurrentUser()` will return the current user's session information from local storage. - -Add a state variable to store the user: - -```tsx title="src/app/dashboard/page.tsx" {2,8} -import { useState, useEffect } from "react"; -import { useTurnkey } from "@turnkey/sdk-react"; - -export default function Dashboard() { - const { turnkey } = useTurnkey(); - const [user, setUser] = useState(null); - - useEffect(() => { - if (turnkey) { - const user = turnkey.getCurrentUser(); - setUser(user); - } - }, [turnkey]); - - return
Dashboard
; -} -``` - -
-User Session - -```ts -export interface User { - // Unique identifier for the user. - userId: string; - // Username of the user. - username: string; - organization: { - // Unique identifier for the organization. - organizationId: string; - // Name of the organization. - organizationName: string; - }; - session: - | { - // read-only session . - read?: ReadOnlySession; - // read-write session details. - write?: ReadWriteSession; - // Authenticated client associated with the session. - authClient: AuthClient; - } - | undefined; -} - -export interface ReadOnlySession { - // Read-only session token for `X-Session` header - token: string; - // Expiry time in seconds since Unix epoch. - expiry: number; -} - -export interface ReadWriteSession { - // Credential bundle for iFrame client, generated by `createReadWriteSession` or `createApiKeys`. - credentialBundle: string; - // Expiry time in seconds since Unix epoch. - expiry: number; -} -``` - -
- -
- -## Sign Message - -Turnkey supports signing arbitrary messages with the [`signRawPayload`](/api#tag/Signing/operation/SignRawPayload) method. - -The `signRawPayload` method requires these parameters: - -- `payload`: The raw unsigned payload to sign -- `signWith`: The signing address (wallet account, private key address, or private key ID) -- `encoding`: The message encoding format -- `hashFunction`: The selected hash algorithm - - - -The Payload - -For simplicity, a human readable string, `message`, will be the payload to sign. Add a state variable to store the message and an input field to allow the user to enter the message: - -```tsx title="src/app/dashboard/page.tsx" {6} -import { useState, useEffect } from "react"; - -export default function Dashboard() { - //... - - const [message, setMessage] = useState(""); - - //... - - return ( -
- setMessage(e.target.value)} - placeholder="Enter message to sign" - /> -
- ); -} -``` - -The Signer - -Signing messages requires a signer e.g. a Turnkey wallet address to sign with and a payload or message to sign. A new wallet is created for each user during the authentication flow. - -Create a function called `getSignWith`, to get the user's wallet account address which will be used to sign the message. - -Use the `getActiveClient` method from the `useTurnkey` hook to get the client authenticated with the user's read-write session: - -```tsx title="src/app/dashboard/page.tsx" {5,7-32} -import { useState, useEffect } from "react"; -import { useTurnkey } from "@turnkey/sdk-react"; - -export default function Dashboard() { - const { turnkey, getActiveClient } = useTurnkey(); - const [user, setUser] = useState(null); - - const getSignWith = async () => { - // This will return the authIframeClient with the credential bundle injected - const client = await getActiveClient(); - - // The user's sub-organization id - const organizationId = user?.organization.organizationId; - - // Get the user's wallets - const wallets = await client?.getWallets({ - organizationId, - }); - - // Get the first wallet of the user - const walletId = wallets?.wallets[0].walletId ?? ""; - - // Use the `walletId` to get the accounts associated with the wallet - const accounts = await client?.getWalletAccounts({ - organizationId, - walletId, - }); - - const signWith = accounts?.accounts[0].address ?? ""; - - return signWith; - }; - - useEffect(/* ... */*/); - - return (/*
...
*/*/); -} -``` - -The Signing Function - -Create a function called `signMessage`. This function will: - -- Get the user's wallet account for signing the message -- Compute the keccak256 hash of the message -- Call the `signRawPayload` method - -Note: To compute the `keccak256` hash of the message, this example uses the `hashMessage` function from `viem`. However, any other hashing library can be used. - -```tsx -const signMessage = async () => { - const payload = await hashMessage(message); - const signWith = await getSignWith(); - - const signature = await client?.signRawPayload({ - payload, - signWith, - // The message encoding format - encoding: "PAYLOAD_ENCODING_TEXT_UTF8", - // The hash function used to hash the message - hashFunction: "HASH_FUNCTION_KECCAK256", - }); -}; -``` - -Display - -Add a button to the UI to trigger the `signMessage` function. - -```tsx title="src/app/dashboard/page.tsx" {2,8} -import { useState, useEffect } from "react"; -import { useTurnkey } from "@turnkey/sdk-react"; -import { hashMessage } from "viem"; - -export default function Dashboard() { - //... - - const [message, setMessage] = useState(""); - - const signMessage = async () => { - const payload = await hashMessage(message); - const signWith = await getSignWith(); - - const signature = await client?.signRawPayload({ - payload, - signWith, - // The message encoding format - encoding: "PAYLOAD_ENCODING_TEXT_UTF8", - // The hash function used to hash the message - hashFunction: "HASH_FUNCTION_KECCAK256", - }); - }; - - return ( -
-

Sign Message

- setMessage(e.target.value)} - placeholder="Enter message to sign" - /> - -
- ); -} -``` - -
- -## Recap - -In this quickstart guide, you've learned how to: - -1. Set up Turnkey's SDK in a Next.js application -2. Configure authentication with email sign-in -3. Create a protected dashboard route -4. Implement message signing functionality using a user's Turnkey wallet -5. Handle user sessions and wallet interactions - -
-Complete Code - -```tsx title="src/app/page.tsx" -"use client"; - -import { useState } from "react"; -import { Auth } from "@turnkey/sdk-react"; - -export default function Home() { - const [errorMessage, setErrorMessage] = useState(""); - const router = useRouter(); - - const onAuthSuccess = async () => { - router.push("/dashboard"); - }; - - const onError = (errorMessage: string) => { - setErrorMessage(errorMessage); - }; - - const config = { - authConfig: { - emailEnabled: true, - passkeyEnabled: false, - phoneEnabled: false, - appleEnabled: false, - facebookEnabled: false, - googleEnabled: false, - }, - configOrder: ["email"], - onAuthSuccess: onAuthSuccess, - onError: onError, - }; - - return ( -
- -
- ); -} -``` - -```tsx title="src/app/dashboard/page.tsx" -import { useState, useEffect } from "react"; -import { useTurnkey } from "@turnkey/sdk-react"; -import { hashMessage } from "viem"; - -export default function Dashboard() { - const { turnkey, getActiveClient } = useTurnkey(); - const [user, setUser] = useState(null); - const [message, setMessage] = useState(""); - - const getSignWith = async () => { - const client = await getActiveClient(); - const organizationId = user?.organization.organizationId; - const wallets = await client?.getWallets({ - organizationId, - }); - const walletId = wallets?.wallets[0].walletId ?? ""; - const accounts = await client?.getWalletAccounts({ - organizationId, - walletId, - }); - const signWith = accounts?.accounts[0].address ?? ""; - return signWith; - }; - - const signMessage = async () => { - const payload = await hashMessage(message); - const signWith = await getSignWith(); - const signature = await client?.signRawPayload({ - payload, - signWith, - encoding: "PAYLOAD_ENCODING_TEXT_UTF8", - hashFunction: "HASH_FUNCTION_KECCAK256", - }); - }; - - useEffect(() => { - if (turnkey) { - const user = turnkey.getCurrentUser(); - setUser(user); - } - }, [turnkey]); - - return ( -
-

Sign Message

- setMessage(e.target.value)} - placeholder="Enter message to sign" - /> - -
- ); -} -``` - -
- -## Next Steps - - diff --git a/docs/documentation/getting-started/quickstart/quickstart.mdx b/docs/documentation/getting-started/quickstart/quickstart.mdx deleted file mode 100644 index 77fc34c1..00000000 --- a/docs/documentation/getting-started/quickstart/quickstart.mdx +++ /dev/null @@ -1,128 +0,0 @@ ---- -id: quickstart -title: "Quickstart" -sidebar_position: 1 -description: Get started with Turnkey by creating an organization and obtaining your keys. -slug: /getting-started/quickstart ---- - -import DocCardList from "@theme/DocCardList"; - -import { Step, Steps } from "@site/src/components/step"; - -# Quickstart - -Before diving into the code, let's set up your organization and conjure up an API keypair to unlock the full potential of Turnkey! - -## Create an Account - -Navigate to the [Turnkey Dashboard](https://app.turnkey.com/dashboard/auth/initial) to create an account and setup your organization: - -

- Create organization -

- -## Get Your Organization ID - -Once logged in, open the user dropdown at the top right. Your Organization ID is listed there. Copy it for use in your code or environment variables. - -

- Organization ID -

- -## Create an API Key - -The API keypair is used to authenticate requests to Turnkey. We'll create one now. - - - Navigate to the User Details page. - -User Details - -Click "Create an API key". - -Create API key - -Choose a key generation method - -For this guide, we'll use the in-browser method. - -Generate API key - - - -Optionally, you may also generate keys using the Turnkey CLI. - - - -Name your keypair - -Name API key - -Approve & Create - -You'll be prompted to authenticate with the authenticator setup during account creation. -Save the private key in a secure location — **it won't be visible after this step**. - -**Important**: Both the public and private keys are required for signing requests to the Turnkey API. Keep these keys secure and out of reach of end-users. - -Approve API key - -API Key Created 🎉 - -API key created - - - -## Next Steps - -Now that you've created an organization and API keypair, you're ready to start developing with Turnkey! - - diff --git a/docs/documentation/security/Verifiable-data.md b/docs/documentation/security/Verifiable-data.md deleted file mode 100644 index f1eb2377..00000000 --- a/docs/documentation/security/Verifiable-data.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -description: Learn how we ensure an end-to-end audit trail -sidebar_position: 5 -slug: /security/verifiable-data ---- - -# Verifiable data - -Enclave applications in Turnkey’s infrastructure are stateless meaning, there is no persistent data held behind the enclave boundary. Instead, data is held in a PostgreSQL instance in our primary AWS account. Before any enclave applications operate on the data in a Turnkey account, it first verifies that that data has been recently notarized by Turnkey’s notarizer. A recent stamp could be the result of an update or initiated by the heartbeat service. - -By verifying the authenticity of data using cryptographic signatures (no passwords!) and timestamping, we enable zero-risk data sharing between these apps and block man-in-the-middle or downgrade attacks. The combination of these features results in a system and an audit trail that is verifiable end-to-end. - -The entire Turnkey architecture including this verifiable data flow is described below: - -

- turnkey_architecture -

diff --git a/docs/documentation/security/_category_.json b/docs/documentation/security/_category_.json deleted file mode 100644 index 0d0b0f17..00000000 --- a/docs/documentation/security/_category_.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "Security", - "position": 8, - "collapsed": true, - "link": { - "type": "generated-index", - "description": "Learn how Turnkey achieves innovative, cloud scale, no single point of failure security." - } -} diff --git a/docs/documentation/security/disaster-recovery.md b/docs/documentation/security/disaster-recovery.md deleted file mode 100644 index 254a983c..00000000 --- a/docs/documentation/security/disaster-recovery.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -sidebar_position: 6 -description: Turnkey's disaster recovery process -slug: /security/disaster-recovery ---- - -# Disaster recovery - -We have a comprehensive disaster recovery process in place for all critical Turnkey data. In particular, there are two main categories of data that we consider to be critical: - -- Organization data: Core data within your organization, including details for users, encrypted private key material, policies, tags, activity history, etc. -- Quorum Keys: Keys used by members of the Quorum Set to boot secure applications, and perform sensitive actions within an enclave like decrypting private keys or making policy decisions. - -For organization data, because all enclave applications are stateless, our persistence strategy is very similar to a traditional web application. Data is encrypted, stored redundantly across geographies, and consistently backed up and exported to our disaster recovery accounts. - -For Quorum Keys, as described in [Quorum deployments](./Quorum-deployment.md), we split the key between members of the Quorum set and have a level of redundancy in those shards. In the unlikely event that all members of the Quorum Set were to lose their active shares, we have a set of offline backup shares securely stored across geographically distributed locations. diff --git a/docs/documentation/security/whitepaper.md b/docs/documentation/security/whitepaper.md deleted file mode 100644 index e9c8d89d..00000000 --- a/docs/documentation/security/whitepaper.md +++ /dev/null @@ -1,11 +0,0 @@ ---- -sidebar_position: 9 -description: Read about Turnkey's ambitious foundations with the Turnkey Whitepaper -slug: /security/whitepaper ---- - -# The Turnkey Whitepaper - -We have published an in-depth whitepaper describing the principles with which we've built Turnkey and explaining in great detail the infrastructure foundations as well as the system architecture underpinning our product. - -Our whitepaper is available online at **[whitepaper.turnkey.com](https://whitepaper.turnkey.com)**. diff --git a/docs/documentation/wallets/_category_.json b/docs/documentation/wallets/_category_.json deleted file mode 100644 index ff28ed05..00000000 --- a/docs/documentation/wallets/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Wallets", - "position": 5, - "collapsed": true -} diff --git a/docs/documentation/wallets/export-wallets.md b/docs/documentation/wallets/export-wallets.md deleted file mode 100644 index 16a11b8f..00000000 --- a/docs/documentation/wallets/export-wallets.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -sidebar_position: 5 -description: Learn about Wallet and Key Export on Turnkey -slug: /wallets/export-wallets ---- - -# Export Wallets and Keys - -Turnkey's export functionality allows your end users to backup or transfer a [Wallet](/concepts/Wallets) by securely viewing the wallet's [mnemonic phrase](https://learnmeabitcoin.com/technical/mnemonic). We engineered this feature to ensure that the user can export their mnemonic without exposing the mnemonic itself to Turnkey or your application. - -The process of exporting wallets or private keys from Turnkey is broken up into two primary steps: - -1. Export the wallet or private key via Turnkey. You must specify the wallet or private key ID, as well as a target public key, which the wallet or private key will be encrypted to. Encryption ensures that the key material is only accessible by the client, and cannot be extracted by any man-in-the-middle (MITM) -2. Decrypt the resulting bundle returned by Turnkey - -See the [Enclave to end-user secure channel](../security/enclave-secure-channels.md) for more technical details. - -# Implementation Guides - -See [Code Examples](../../../embedded-wallets/code-examples/export) for more details. diff --git a/docs/documentation/wallets/import-wallets.md b/docs/documentation/wallets/import-wallets.md deleted file mode 100644 index b240855a..00000000 --- a/docs/documentation/wallets/import-wallets.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -sidebar_position: 4 -description: Learn about Wallet and Key Import on Turnkey -slug: /wallets/import-wallets ---- - -# Import Wallets and Keys - -Turnkey's import functionality allows your end users to securely transfer a [Wallet](/concepts/Wallets) or a [Private Key](/concepts/Wallets#private-keys) onto the Turnkey platform via CLI or an embedded iframe. We engineered this feature to ensure that the user can import their mnemonic or private key into a Turnkey secure enclave without exposing it to Turnkey or your application. - -The process of importing wallets or private keys into Turnkey is broken up into three primary steps: - -1. Initialize the import process. This produces an import bundle, containing a public key and signature. These artifacts will be used in the next step to ensure that key material is only accessible by Turnkey, and cannot be extracted by any man-in-the-middle (MITM) -2. Encrypt the key material to the artifacts from the previous step -3. Import the encrypted bundle to Turnkey - -See the [Enclave to end-user secure channel](../security/enclave-secure-channels.md) for more technical details. - -# Implementation Guides - -See [Code Examples](../../../embedded-wallets/code-examples/import) for more details. diff --git a/docs/documentation/wallets/pregenerated-wallets.md b/docs/documentation/wallets/pregenerated-wallets.md deleted file mode 100644 index ec076917..00000000 --- a/docs/documentation/wallets/pregenerated-wallets.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -sidebar_position: 2 -description: Learn about pre-generating wallets for users on Turnkey. -slug: /wallets/pregenerated-wallets ---- - -# Pre-generated wallets - -Turnkey allows you to pre-generate wallets for your user before they authenticate. -This is helpful if you already know the users email or phone number, and want to -create a deposit address for them or airdrop a reward before they authenticate to Turnkey. - -To accomplish this, create a new sub-org for that user with a single root user. -This root user should only have the end user’s email or phone number associated with it, -and no other authenticators, which ensures that only the end user can claim the pre-generated wallet. -When the end user wants to claim the wallet, they can complete the [Email Auth](/authentication/email) -flow to authenticate and sign a transaction or add a new authenticator. diff --git a/docs/sdks/_category_.json b/docs/sdks/_category_.json deleted file mode 100644 index d43a0507..00000000 --- a/docs/sdks/_category_.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "label": "SDKs", - "position": 2, - "collapsed": false, - "link": { - "type": "generated-index", - "description": "Discover how to effectively utilize the Turnkey SDKs in your applications, with comprehensive information on setup, usage, and best practices for integrating Turnkey's capabilities seamlessly." - } -} diff --git a/docs/sdks/advanced/_category_.json b/docs/sdks/advanced/_category_.json deleted file mode 100644 index 44cc24dc..00000000 --- a/docs/sdks/advanced/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Advanced", - "position": 13, - "link": { - "type": "generated-index", - "description": "Use Turnkey's low-level http libraries directly" - } -} diff --git a/docs/sdks/advanced/api-key-stamper.mdx b/docs/sdks/advanced/api-key-stamper.mdx deleted file mode 100644 index f7613c8a..00000000 --- a/docs/sdks/advanced/api-key-stamper.mdx +++ /dev/null @@ -1,178 +0,0 @@ ---- -title: "ApiKeyStamper" -sidebar_position: 2 -description: Guide on using the ApiKeyStamper. -slug: /sdks/advanced/api-key-stamper ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import Parameter from "@site/src/components/parameter"; - -## Introduction - -The [`@turnkey/api-key-stamper`](https://www.npmjs.com/package/@turnkey/api-key-stamper) package simplifies the process of using your public/private API keys and passkeys to stamp and approve activity requests for Turnkey's API. -This stamping mechanism is central to the API's security, ensuring that each request is authenticated and authorized. -For an in-depth understanding of API keys see [this section](/faq#why-do-you-require-a-public--private-key-pair-to-access-turnkey-api). - -## Installing - -To get started install the [`@turnkey/api-key-stamper`](https://www.npmjs.com/package/@turnkey/api-key-stamper) client. - - - - -```bash -npm i @turnkey/api-key-stamper -``` - - - - -```bash -pnpm i @turnkey/api-key-stamper -``` - - - - -```bash -yarn add @turnkey/api-key-stamper -``` - - - - -## Initializing - -The `ApiKeyStamper` class implements the `TStamper` interface used by the [TurnkeyClient](./turnkey-client.mdx) in the `@turnkey/http` module. -It encapsulates the logic necessary to sign activity requests and generates the appropriate HTTP headers for authentication. -To get started with an `ApiKeyStamper`, you can initialize it using its constructor: - -### `constructor(config: TApiKeyStamperConfig): TStamper` - -#### Parameters - - - -An object containing configuration settings for the stamper. - - - - - -Your Turnkey API private key. - - - - - -Your Turnkey API public key. - - - -#### Types - -##### `TApiKeyStamperConfig` - -```ts -type TApiKeyStamperConfig = { - apiPublicKey: string; - apiPrivateKey: string; -}; -``` - -##### `TStamper` - -```ts -interface TStamper { - stamp: (input: string) => Promise; -} -``` - -#### Example - -The example below shows how to initialize and use the `ApiKeyStamper` with the `TurnkeyClient` to make a request -to Turnkey's [`/public/v1/query/whoami`](https://docs.turnkey.com/api#tag/Sessions/operation/GetWhoami) endpoint: - -```ts -import { TurnkeyClient } from "@turnkey/http"; -import { ApiKeyStamper } from "@turnkey/api-key-stamper"; - -// Following best practices, define parameters in your .env file -const baseUrl = process.env.TURNKEY_BASE_URL || "https://api.turnkey.com"; -const apiPublicKey = process.env.TURNKEY_API_PUBLIC_KEY; -const apiPrivateKey = process.env.TURNKEY_API_PRIVATE_KEY; - -// Initialize the API key stamper -const stamper = new ApiKeyStamper({ apiPublicKey, apiPrivateKey }); - -// Initialize the Turnkey client -const tk = new TurnkeyClient({ baseUrl }, stamper); - -// Now you can make authenticated requests using the APIKeyStamper -const whoami = await tk.getWhoami({ - organizationId: "", -}); -``` - -## Methods - -### `stamp: (input: string) => Promise` - -Creates a digital stamp which includes the public key, signature scheme, and a signature. - -#### Parameters - - - -The payload that needs to be stamped. - - - -#### Types - -##### `TStamp` - -```ts -type TStamp = { - stampHeaderName: string; - stampHeaderValue: string; -}; -``` diff --git a/docs/sdks/golang.mdx b/docs/sdks/golang.mdx deleted file mode 100644 index 44e53584..00000000 --- a/docs/sdks/golang.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Golang" -sidebar_position: 7 -description: Golang SDK -slug: /sdks/golang ---- - -Turnkey offers native tooling for interacting with the API using Golang. See https://github.com/tkhq/go-sdk for more details. diff --git a/docs/sdks/introduction.mdx b/docs/sdks/introduction.mdx deleted file mode 100644 index 6f7b3834..00000000 --- a/docs/sdks/introduction.mdx +++ /dev/null @@ -1,200 +0,0 @@ ---- -title: "Introduction" -sidebar_position: 1 -description: Introduction to the SDK -slug: /sdks/introduction ---- - -import Table from "@site/src/components/table/table"; -import { CheckmarkCircleIcon } from "@site/src/components/icons"; - -# SDK Reference - -Turnkey provides a variety of client and server SDKs which simplify interacting with Turnkey's API. The SDKs offer methods, utilities, and helper functions to quickly implement features and perform common workflows. - -The following SDK reference tables separate our SDKs by Client and Server. The column headers indicate the specific languages or frameworks for which we have an SDK. The rows indicate a specific feature or capability that Turnkey provides. - -A green checkmark in the table indicates that the SDK provides either a complete implementation for a feature or helper methods exist and can be composed in a few lines of code to implement a workflow. If no checkmark is present it means the SDK does not offer support for that feature. - -Turnkey also has several [wrappers for popular web3 libraries](https://docs.turnkey.com/category/web3-libraries) to streamline integration into existing dApps. - -## Client Side SDKs - -, - , - , - , - , - ], - [ - "", - "SMS", - , - , - , - , - , - ], - [ - "", - "Passkey", - , - , - , - , - , - ], - [ - "", - "Google", - , - , - , - , - , - ], - [ - "", - "Facebook", - , - , - , - , - , - ], - [ - "", - "Apple", - , - , - , - , - , - ], - [ - "", - "Web3 Wallets", - , - , - "", - "", - "", - ], - [ - "Embedded Wallets", - "Wallet Creation", - , - , - , - , - , - ], - [ - "", - "Signing", - , - , - , - , - , - ], - [ - "", - "Import", - , - , - , - , - , - ], - [ - "", - "Export", - , - , - , - , - , - ], - [ - "Arbitrary Request Signing", - "Stamping", - , - , - , - , - , - ], - ]} -/> - -## Server Side SDKs - -
, - , - , - , - , - ], - [ - "Wallet Management", - , - , - , - "", - "", - ], - [ - "Policy Management", - , - , - , - "", - "", - ], - ]} -/> diff --git a/docs/sdks/javascript-server.mdx b/docs/sdks/javascript-server.mdx deleted file mode 100644 index 89d059be..00000000 --- a/docs/sdks/javascript-server.mdx +++ /dev/null @@ -1,175 +0,0 @@ ---- -title: "JavaScript Server" -sidebar_position: 3 -description: JavaScript Server SDK -slug: /sdks/javascript-server ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import Parameter from "@site/src/components/parameter"; - -## Overview - -The [`@turnkey/sdk-server`](https://www.npmjs.com/package/@turnkey/sdk-server) package exposes functionality that lets developers build server-side functionality for applications that interact with the Turnkey API. It exposes a ready-made API client class which manages the process of constructing requests to the Turnkey API and authenticating them with a valid API key. Furthermore, it exposes API proxies that forward requests from your application's client that need to be signed by parent organizations API key. - -Use the [`@turnkey/sdk-server`](https://www.npmjs.com/package/@turnkey/sdk-server) package to handle server-side interactions for applications that interact with the Turnkey API. - -## Installation - - - - -```bash -npm install @turnkey/sdk-server -``` - - - - -```bash -yarn add @turnkey/sdk-server -``` - - - - - -## Initializing - -```typescript -import { Turnkey } from "@turnkey/sdk-server"; - -const turnkey = new Turnkey({ - defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, - apiBaseUrl: "https://api.turnkey.com", - apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY, - apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY, -}); -``` - -#### Parameters - - - -An object containing configuration settings for the Server Client. - - - - - -The root organization that requests will be made from unless otherwise specified - - - - - -The base URL that API requests will be sent to (use https://api.turnkey.com when making requests to Turnkey's API) - - - - - -The API Private Key to sign requests with (this will normally be the API Private Key to your root organization) - - - - - -The API Public Key associated with the configured API Private Key above - - - -## Creating Clients - -Calls to Turnkey's API must be signed with a valid credential (often referred to in the docs as [stamping](/developer-reference/api-overview/stamps)) from the user initiating the API call. When using the Server SDK, the user initiating the API call is normally your root organization, and the API call is authenticated with the API keypair you create on the Turnkey dashboard. - -#### `apiClient()` - -The `apiClient` method returns an instance of the `TurnkeyApiClient` which will sign requests with the injected `apiPrivateKey`, and `apiPublicKey` credentials. - -```typescript -const apiClient = turnkey.apiClient(); -const walletsResponse = await apiClient.getWallets(); - -// this will sign the request with the configured api credentials -``` - -## Creating API Proxies - -There are certain actions that are initiated by users, but require the activity to be signed by the root organization itself. Examples of this include the initial creation of the user `subOrganization` or sending an email to a user with a login credential as part of an `emailAuth` flow. - -These can be implemented in your backend by creating an `apiClient` and handling requests from your browser application at different routes, but we have also provided a convenience method for doing this by having allowing a single `apiProxy` to handle requests at a single route and automatically sign specific user actions with the root organization's credentials. - -#### expressProxyHandler() - -The `expressProxyHandler()` method creates a proxy handler designed as a middleware for Express applications. It provides an API endpoint that forwards requests to the Turnkey API server. - -```typescript -const turnkeyProxyHandler = turnkey.expressProxyHandler({ - allowedMethods: ["createSubOrganization", "emailAuth", "getSubOrgIds"], -}); - -app.post("/apiProxy", turnkeyProxyHandler); - -// this will sign requests made with the client-side `serverSign` function with the root organization's API key for the allowedMethods in the config -``` - -#### 2. nextProxyHandler() [WIP] - -The `nextProxyHandler()` method creates a proxy handler designed as a middleware for Next.js applications. It provides an API endpoint that forwards requests to the Turnkey API server. - -```typescript -// Configure the Next.js handler with allowed methods -const turnkeyProxyHandler = turnkey.nextProxyHandler({ - allowedMethods: ["createSubOrganization", "emailAuth", "getSubOrgIds"], -}); - -export default turnkeyProxyHandler; - -// this will sign requests made with the client-side `serverSign` function with the root organization's API key for the allowedMethods in the config -``` diff --git a/docs/sdks/ruby.mdx b/docs/sdks/ruby.mdx deleted file mode 100644 index 51c447de..00000000 --- a/docs/sdks/ruby.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Ruby" -sidebar_position: 9 -description: Ruby SDK -slug: /sdks/Ruby ---- - -Turnkey offers native tooling for interacting with the API using Ruby. See https://github.com/tkhq/ruby-sdk for more details. diff --git a/docs/sdks/rust.mdx b/docs/sdks/rust.mdx deleted file mode 100644 index 6e4b5ee1..00000000 --- a/docs/sdks/rust.mdx +++ /dev/null @@ -1,8 +0,0 @@ ---- -title: "Rust" -sidebar_position: 8 -description: Rust SDK -slug: /sdks/rust ---- - -Turnkey offers native tooling for interacting with the API using Rust. See https://github.com/tkhq/rust-sdk for more details. diff --git a/docs/sdks/swift/_category_.json b/docs/sdks/swift/_category_.json deleted file mode 100644 index 7444705d..00000000 --- a/docs/sdks/swift/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Swift", - "position": 12, - "link": { - "type": "doc", - "id": "sdks/swift/index" - } -} diff --git a/docs/sdks/swift/index.mdx b/docs/sdks/swift/index.mdx deleted file mode 100644 index d2df1790..00000000 --- a/docs/sdks/swift/index.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: Turnkey Swift SDK -description: Guides to using the Turnkey Swift SDK ---- - -import DocCardList from "@theme/DocCardList"; - -This documentation contains guides for using the [Turnkey Swift SDK](https://github.com/tkhq/swift-sdk). - - diff --git a/docs/sdks/web3-libraries/_category_.json b/docs/sdks/web3-libraries/_category_.json deleted file mode 100644 index ef28c752..00000000 --- a/docs/sdks/web3-libraries/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Web3 Libraries", - "position": 12, - "link": { - "type": "generated-index", - "description": "Turnkey Web3 Libraries" - } -} diff --git a/docs/sdks/web3-libraries/cosmjs.mdx b/docs/sdks/web3-libraries/cosmjs.mdx deleted file mode 100644 index 6916c4cf..00000000 --- a/docs/sdks/web3-libraries/cosmjs.mdx +++ /dev/null @@ -1,24 +0,0 @@ ---- -title: "CosmJS" -sidebar_position: 3 -description: CosmJS Wrapper -slug: /sdks/web3/cosmjs ---- - -## CosmJS - -Similarly, [`@turnkey/cosmjs`](https://www.npmjs.com/package/@turnkey/cosmjs) exports a `TurnkeyDirectWallet` that serves as a drop-in replacement for a CosmJS direct wallet. It includes support for `signDirect`. See full implementation [here](https://github.com/tkhq/sdk/tree/main/packages/cosmjs) for more details and examples. - -```node -// Initialize a Turnkey Signer -const turnkeySigner = await TurnkeyDirectWallet.init({ - config: { - ... - }, - prefix: "celestia", // can be replaced with other Cosmos chains -}); - -const account = refineNonNull((await turnkeySigner.getAccounts())[0]); -const compressedPublicKey = toHex(account.pubkey); -const selfAddress = account.address; -``` diff --git a/docs/sdks/web3-libraries/eip-1193.mdx b/docs/sdks/web3-libraries/eip-1193.mdx deleted file mode 100644 index 84b9895d..00000000 --- a/docs/sdks/web3-libraries/eip-1193.mdx +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "EIP 1193" -sidebar_position: 4 -description: EIP 1193 Provider -slug: /sdks/web3/eip-1193 ---- - -## EIP-1193 - -[`@turnkey/eip-1193-provider`](https://www.npmjs.com/package/@turnkey/eip-1193-provider) is a Turnkey-compatible Ethereum provider that conforms to the [EIP-1193](https://eips.ethereum.org/EIPS/eip-1193) standard. It's built to seamlessly integrate with a broad spectrum of EVM-compatible chains, offering capabilities like account management, transaction signing, and blockchain interaction. - -See [`with-eip-1193-provider`](https://github.com/tkhq/sdk/tree/main/examples/with-eip-1193-provider) for an example. diff --git a/docs/sdks/web3-libraries/ethers.mdx b/docs/sdks/web3-libraries/ethers.mdx deleted file mode 100644 index adc03387..00000000 --- a/docs/sdks/web3-libraries/ethers.mdx +++ /dev/null @@ -1,22 +0,0 @@ ---- -title: "Ethers" -sidebar_position: 1 -description: Ethers Wrapper -slug: /sdks/web3/ethers ---- - -## Ethers - -[`@turnkey/ethers`](https://www.npmjs.com/package/@turnkey/ethers) exports a `TurnkeySigner` that serves as a drop-in replacement for an Ethers signer. Out of the box, it supports `{ signTransaction | signMessage | signTypedData }`. See full implementation [here](https://github.com/tkhq/sdk/tree/main/packages/ethers) for more details and examples. Note that you must **bring your own provider and connect it** to the TurnkeySigner. - -```node -// Initialize a Turnkey Signer -const turnkeySigner = new TurnkeySigner({ - ... -}); - -// Bring your own provider (such as Alchemy or Infura: https://docs.ethers.org/v6/api/providers/) -const network = "goerli"; -const provider = new ethers.providers.InfuraProvider(network); -const connectedSigner = turnkeySigner.connect(provider); -``` diff --git a/docs/sdks/web3-libraries/solana.mdx b/docs/sdks/web3-libraries/solana.mdx deleted file mode 100644 index 6bb0652a..00000000 --- a/docs/sdks/web3-libraries/solana.mdx +++ /dev/null @@ -1,10 +0,0 @@ ---- -title: "Solana" -sidebar_position: 4 -description: Solana Web3 Wrapper -slug: /sdks/web3/solana ---- - -## @solana/web3 - -We have released a package that you can use to sign transactions and messages: [`@turnkey/solana`](https://www.npmjs.com/package/@turnkey/solana). See [here](https://github.com/tkhq/sdk/tree/main/examples/with-solana) for an example. diff --git a/docs/sdks/web3-libraries/viem.mdx b/docs/sdks/web3-libraries/viem.mdx deleted file mode 100644 index acf10d84..00000000 --- a/docs/sdks/web3-libraries/viem.mdx +++ /dev/null @@ -1,12 +0,0 @@ ---- -title: "Viem" -sidebar_position: 2 -description: Viem Wrapper -slug: /sdks/web3/viem ---- - -## Viem - -[`@turnkey/viem`](https://www.npmjs.com/package/@turnkey/viem) provides a Turnkey [Custom Account](https://viem.sh/docs/accounts/custom.html#custom-account) (signer) which implements the signing APIs expected by Viem clients. - -See [`with-viem`](https://github.com/tkhq/sdk/tree/main/examples/with-viem) and [`with-viem-and-passkeys`](https://github.com/tkhq/sdk/tree/main/examples/with-viem-and-passkeys) for examples. diff --git a/docs/solutions/_category_.json b/docs/solutions/_category_.json deleted file mode 100644 index b69bf317..00000000 --- a/docs/solutions/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Solutions", - "position": 3, - "collapsed": false -} diff --git a/docs/solutions/embedded-wallets/_category_.json b/docs/solutions/embedded-wallets/_category_.json deleted file mode 100644 index d6b121e1..00000000 --- a/docs/solutions/embedded-wallets/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Embedded Wallets", - "position": 1, - "collapsed": false -} diff --git a/docs/solutions/embedded-wallets/code-examples/_category_.json b/docs/solutions/embedded-wallets/code-examples/_category_.json deleted file mode 100644 index b416d083..00000000 --- a/docs/solutions/embedded-wallets/code-examples/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Code Examples", - "position": 7, - "link": { - "type": "generated-index", - "description": "Code Examples" - } -} diff --git a/docs/solutions/embedded-wallets/code-examples/create-sub-org-passkey.mdx b/docs/solutions/embedded-wallets/code-examples/create-sub-org-passkey.mdx deleted file mode 100644 index 5b4b9a18..00000000 --- a/docs/solutions/embedded-wallets/code-examples/create-sub-org-passkey.mdx +++ /dev/null @@ -1,575 +0,0 @@ ---- -title: "Create a Sub-Org with a Passkey User" -sidebar_position: 1 -description: Create a Sub-Org with a Passkey User -slug: /embedded-wallets/code-examples/create-sub-org-passkey ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import Parameter from "@site/src/components/parameter"; - -## Overview - -In this guide, we'll walk through the process of creating a new end user with a passkey. Generally, these new users will take the form of a [Turnkey Sub-Organization](../../../concepts/Sub-Organizations). This process involves using the following Turnkey SDK packages: - -1. [`@turnkey/sdk-server`](https://www.npmjs.com/package/@turnkey/sdk-server): Used on the server-side to leverage the parent organization's public/private API key pair to create the new user's sub-organization. -2. [`@turnkey/sdk-browser`](https://www.npmjs.com/package/@turnkey/sdk-browser): Used on the client-side to complete the email recovery process by adding an end-user passkey. -3. [`@turnkey/sdk-react`](https://www.npmjs.com/package/@turnkey/sdk-react): Used for Next.js applications to initialize the Turnkey SDK. - -The process of creating a new sub-organization is split between client-side and server-side operations to prevent exposing the parent organization's private API key. - -:::info - -For a refresher on the relationship between your application's end users and Turnkey Sub-Organizations, see [this page](../overview#how-it-works) for more. - -::: - -## Implementation - -### Initialize the Turnkey SDK on the Browser - - - - -Wrap the root layout of your application with the `TurnkeyProvider` providing the required configuration options. -This allows you to use the Turnkey client throughout your app via the `useTurnkey()` hook. - -```tsx title="app/layout.tsx" -import { TurnkeyProvider } from "@turnkey/sdk-react"; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - - - {children} - - - - ); -} -``` - -:::info - -The `NEXT_PUBLIC_ORGANIZATION_ID` should be set to the parent -organization ID which can be found in the [Turnkey Dashboard](https://app.turnkey.com/dashboard). - -The `NEXT_PUBLIC_TURNKEY_RP_ID` should be set to your application's desired relying party ID; this is typically your domain, or localhost if developing locally. See [this page](../../../authentication/passkeys/options#rp) for more details. - -::: - - - - -```typescript title="src/turnkey.ts" -import { Turnkey } from "@turnkey/sdk-browser"; - -// Initialize the Turnkey SDK with your organization ID and API base URL -const turnkeyBrowser = new Turnkey({ - rpId: process.env.TURNKEY_RP_ID, - apiBaseUrl: "https://api.turnkey.com", - defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, -}); -``` - -:::info - -The `TURNKEY_ORGANIZATION_ID` should be set to the parent -organization ID which can be found in the [Turnkey Dashboard](https://app.turnkey.com/dashboard). - -The `TURNKEY_RP_ID` should be set to your application's desired relying party ID; this is typically your domain, or localhost if developing locally. See [this page](../../../authentication/passkeys/options#rp) for more details. - -::: - - - - -### Initialize the Passkey Client - -Next, we'll initialize the `passkeyClient`, which will enable your application to interact with passkeys. - - - - -We add the `"use client"` directive to the Recovery component to as react hooks can only be used client-side. - -```tsx title="app/create-suborg.tsx" -"use client"; - -import { useTurnkey } from "@turnkey/sdk-react"; - -export default function CreateSubOrganization() { - const { passkeyClient } = useTurnkey(); - - return
{/* ... rest of the code */}
; -} -``` - -
- - -```typescript title="src/create-suborg.ts" -import { Turnkey } from "@turnkey/sdk-browser"; - -// Initialize the Turnkey SDK with your organization credentials -const turnkey = new Turnkey({ - rpId: process.env.TURNKEY_RP_ID, // Your relying party ID - apiBaseUrl: process.env.TURNKEY_API_BASE_URL, // Turnkey API base URL - defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, // Your parent organization ID -}); - -// Initialize the Passkey Client -const passkeyClient = turnkey.passkeyClient(); - -// We'll add more functionality here in the following steps -``` - - -
- -### Create User Passkey - -In order to create a new passkey for a user, you can call the `createUserPasskey` SDK function. -Calling this method will prompt the user to create a passkey, which will be securely stored by their browser. -This credential will be associated with the user's account (sub-organization) and used for future authentication. -Once the credential is created, we'll use it in the next step to create a new sub-organization that corresponds to the user. - -:::info - -The result of `createUserPasskey` includes an encoded challenge and attestation. -The encoded challenge ensures the request is fresh and legitimate, while the attestation verifies -the authenticity of the device creating the credential. For more information on how passkeys work, -including details on the challenge and attestation objects, -you can refer to the [Passkeys Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API#passkeys). - -::: - - - - -```tsx title="app/create-suborg.tsx" -// ... previous code - -export default function CreateSubOrganization() { - const { passkeyClient } = useTurnkey(); - - const createNewPasskey = async () => { - const credential = await passkeyClient?.createUserPasskey({ - publicKey: { - // This is the name of the passkey that will be displayed to the user - rp: { - name: "Wallet Passkey", - }, - user: { - // We can use the username as the name and display name - name: "Default User Name", - displayName: "Default User Name", - }, - }, - }); - - // we'll use this credential in the next step to create a new sub-organization - return credential; - }; - - // ... rest of the code - - return (/* ... */); -} -``` - - - - -```typescript title="src/create-suborg.ts" -// ... previous code - -const createNewPasskey = async () => { - const credential = await passkeyClient?.createUserPasskey({ - publicKey: { - // This is the name of the passkey that will be displayed to the user - rp: { - name: "Wallet Passkey", - }, - user: { - // We can use the username as the name and display name - name: "Default User Name", - displayName: "Default User Name", - }, - }, - }); - - // we'll use this credential in the next step to create a new sub-organization - return credential; -}; -``` - - - - -### Initialize the Turnkey SDK on the Server - -Initialize the Turnkey SDK on the **server-side** using the `@turnkey/sdk-server` package. -This allows you to use the parent organization's public/private API key pair to create sub-organizations. - - - - -For Next.js, add the `"use server"` directive at the top of the file where you're initializing the Turnkey server client. -This will ensure that the function is executed on the server-side and will have access to the -server-side environment variables e.g. your parent organization's public/private API key pair. -For more information on Next.js server actions, see the Next.js documentation on -[Server Actions and Mutations](https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions-and-mutations). - -```ts title="app/actions.ts" -"use server"; - -import { Turnkey } from "@turnkey/sdk-server"; - -// Initialize the Turnkey Server Client on the server-side -const turnkeyServer = new Turnkey({ - baseUrl: "https://api.turnkey.com", - apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY, - apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY, - defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, -}).apiClient(); -``` - - - - -```typescript title="src/turnkey.ts" -import { Turnkey } from "@turnkey/sdk-server"; - -// Initialize the Turnkey Server Client on the server-side -const turnkeyServer = new Turnkey({ - baseUrl: "https://api.turnkey.com", - apiPrivateKey: process.env.TURNKEY_API_PRIVATE_KEY, - apiPublicKey: process.env.TURNKEY_API_PUBLIC_KEY, - defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, -}).apiClient(); -``` - - - - -### Create a Function for Sub-Org Creation - -Next we'll create a new function called `createSubOrganization` that will be used to create a new sub-organization from the server-side. -This method will be called from the client-side with the end-user's details. - - - - -We export the `createSubOrganization` server action to be called from the client-side. - -```tsx title="app/actions.tsx" -import { DEFAULT_ETHEREUM_ACCOUNTS } from "@turnkey/sdk-browser"; - -// ... previous code - -type TAttestation = { - credentialId: string; - clientDataJson: string; - attestationObject: string; - transports: ( - | "AUTHENTICATOR_TRANSPORT_BLE" - | "AUTHENTICATOR_TRANSPORT_INTERNAL" - | "AUTHENTICATOR_TRANSPORT_NFC" - | "AUTHENTICATOR_TRANSPORT_USB" - | "AUTHENTICATOR_TRANSPORT_HYBRID" - )[]; -}; - -export const createSubOrganization = async ( - email: string, - credential: string, - attestation: string -) => { - const createSubOrgResponse = await turnkeyServer.createSubOrganization({ - subOrganizationName: "My New Suborg", - rootUsers: [ - { - userName: "Default User Name", - userEmail: email, - apiKeys: [], - authenticators: [ - { - authenticatorName: "Default Passkey", - challenge: challenge, - attestation: attestation, - }, - ], - oauthProviders: [], - }, - ], - rootQuorumThreshold: 1, - wallet: { - walletName: "Default Wallet", - accounts: DEFAULT_ETHEREUM_ACCOUNTS, - }, - }); - - return createSubOrgResponse; -}; -``` - - - - -```typescript title="src/turnkey-server.ts" -// ... previous code - -type TAttestation = { - credentialId: string; - clientDataJson: string; - attestationObject: string; - transports: ( - | "AUTHENTICATOR_TRANSPORT_BLE" - | "AUTHENTICATOR_TRANSPORT_INTERNAL" - | "AUTHENTICATOR_TRANSPORT_NFC" - | "AUTHENTICATOR_TRANSPORT_USB" - | "AUTHENTICATOR_TRANSPORT_HYBRID" - )[]; -}; - -export const createSubOrganization = async ( - email: string, - credential: string, - attestation: string -) => { - const createSubOrgResponse = await turnkeyServer.createSubOrganization({ - subOrganizationName: "My New Suborg", - rootUsers: [ - { - userName: "Default User Name", - userEmail: email, - apiKeys: [], - authenticators: [ - { - authenticatorName: "Default Passkey", - challenge: challenge, - attestation: attestation, - }, - ], - oauthProviders: [], - }, - ], - rootQuorumThreshold: 1, - wallet: { - walletName: "Default Wallet", - accounts: DEFAULT_ETHEREUM_ACCOUNTS, - }, - }); - - return createSubOrgResponse; -}; -``` - - - - -### Complete Create Sub-Organization - -At this stage, we create the sub-organization using the **server-side** function we created in the previous step. - - - - -##### 1. Import the server action - -```tsx title="app/create-suborg.tsx" -import { createSubOrganization } from "./actions"; -``` - -##### 2. Call `createSubOrganization` with the end-user's details - -```tsx title="app/create-suborg.tsx" -// ... - -import { useForm } from "react-hook-form"; - -type TSubOrgFormData = { - email: string; -}; - -export default function CreateSubOrganization() { - // ... - - // Use form handler for suborg creation - const { register: subOrgFormRegister, handleSubmit: subOrgFormSubmit } = - useForm(); - - // Maintain state - const [createSubOrganizationResponse, setCreateSubOrganizationResponse] = - useState(null); - - const createSubOrg = async (data: TSubOrgFormData) => { - const { encodedChallenge: challenge, attestation } = - await createNewPasskey(); - - const createSubOrganizationResponse = await createSubOrganization( - data.email, - challenge, - attestation - ); - - setCreateSubOrganizationResponse(createSubOrganizationResponse); - }; - - return ( -
- {createSubOrganizationResponse ? ( -

You've created a sub-organization!

- ) : ( -
- - - - )} -
- ); -} -``` - -
- create-suborg.tsx - -```tsx -"use client"; - -import { useState } from "react"; -import { useTurnkey } from "@turnkey/sdk-react"; -import { useForm } from "react-hook-form"; - -// Import the createSubOrganization server action -import { createSubOrganization } from "./actions"; - -type TSubOrgFormData = { - email: string; -}; - -type TAttestation = { - credentialId: string; - clientDataJson: string; - attestationObject: string; - transports: ( - | "AUTHENTICATOR_TRANSPORT_BLE" - | "AUTHENTICATOR_TRANSPORT_INTERNAL" - | "AUTHENTICATOR_TRANSPORT_NFC" - | "AUTHENTICATOR_TRANSPORT_USB" - | "AUTHENTICATOR_TRANSPORT_HYBRID" - )[]; -}; - -export default function CreateSubOrganization() { - const { passkeyClient } = useTurnkey(); - - // Use form handler for suborg creation - const { register: subOrgFormRegister, handleSubmit: subOrgFormSubmit } = - useForm(); - - // Maintain state - const [createSubOrganizationResponse, setCreateSubOrganizationResponse] = - useState(null); - - const createNewPasskey = async () => { - const credential = await passkeyClient?.createUserPasskey({ - publicKey: { - // This is the name of the passkey that will be displayed to the user - rp: { - name: "Wallet Passkey", - }, - user: { - // We can use the username as the name and display name - name: "Default User Name", - displayName: "Default User Name", - }, - }, - }); - - // we'll use this credential in the next step to create a new sub-organization - return credential; - }; - - const createSubOrg = async (data: TSubOrgFormData) => { - const { encodedChallenge: challenge, attestation } = - await createNewPasskey(); - - const createSubOrganizationResponse = await createSubOrganization( - data.email, - challenge, - attestation - ); - - setCreateSubOrganizationResponse(createSubOrganizationResponse); - }; - - return ( -
- {createSubOrganizationResponse ? ( -

You've created a sub-organization!

- ) : ( -
- - - - )} -
- ); -} -``` - -
- -
- - -##### 1. Import the server action - -```tsx title="app/create-suborg.tsx" -import { createSubOrganization } from "./turnkey-server"; -``` - -##### 2. Call `createSubOrganization` with the end-user's details - -```typescript title="src/turnkey.ts" -import { createSubOrganization } from "./turnkey-server"; - -// ... rest of the code - -const createSubOrganizationResponse = await createSubOrganization( - email, - attestation, - challenge -); -``` - - -
- -## Examples - -A few mini examples where sub-orgs are created with passkeys, see the following: - -- https://github.com/tkhq/sdk/tree/main/examples/with-solana-passkeys -- https://github.com/tkhq/sdk/tree/main/examples/with-eth-passkeys-galore -- https://github.com/tkhq/sdk/tree/main/examples/with-federated-passkeys diff --git a/docs/solutions/embedded-wallets/email-auth-for-sub-organizations.md b/docs/solutions/embedded-wallets/email-auth-for-sub-organizations.md deleted file mode 100644 index 4710e4f4..00000000 --- a/docs/solutions/embedded-wallets/email-auth-for-sub-organizations.md +++ /dev/null @@ -1,198 +0,0 @@ ---- -sidebar_position: 3 -description: Learn about Email Auth on Turnkey -slug: /embedded-wallets/sub-organization-auth ---- - -# Email Authentication - -Email auth is a powerful feature to couple with [sub-organizations](/concepts/Sub-Organizations) for your users. This approach empowers your users to authenticate their Turnkey in a simple way (via email!), while minimizing your involvement: we engineered this feature to ensure your organization is unable to take over sub-organizations even if it wanted to. - -Our [Demo Embedded Wallet](https://wallet.tx.xyz) application serves an example of how email auth functionality might be integrated. We encourage you to try it (and check out the [code](https://github.com/tkhq/demo-embedded-wallet)) before diving into your own implementation. - -## Prerequisites - -Make sure you have set up your primary Turnkey organization with at least one API user that can programmatically initiate email auth on behalf of suborgs. Check out our [Quickstart guide](/getting-started/quickstart) if you need help getting started. To allow an API user to initiate email auth, you'll need the following policy in your main organization: - -```json JSON -{ - "effect": "EFFECT_ALLOW", - "consensus": "approvers.any(user, user.id == '')", - "condition": "activity.resource == 'AUTH' && activity.action == 'CREATE'" -} -``` - -## Helper packages - -- We have released open-source code to create target encryption keys, decrypt auth credentials, and sign Turnkey activities. We've deployed this as a static HTML page hosted on `auth.turnkey.com` meant to be embedded as an iframe element (see the code [here](https://github.com/tkhq/frames)). This ensures the auth credentials are encrypted to keys that your organization doesn't have access to (because they live in the iframe, on a separate domain) -- We have also built a package to help you insert this iframe and interact with it in the context of email auth: [`@turnkey/iframe-stamper`](https://www.npmjs.com/package/@turnkey/iframe-stamper) - -In the rest of this guide we'll assume you are using these helpers. - -## Email Auth step-by-step - -Here's a diagram summarizing the email auth flow step-by-step ([direct link](/img/email_auth_steps.png)): - - - -Let's review these steps in detail: - -1. User on `yoursite.xyz` clicks "auth", and a new auth UI is shown. We recommend this auth UI be a new hosted page of your site or application, which contains language explaining to the user what steps they will need to take next to successfully authenticate. While the UI is in a loading state your frontend uses [`@turnkey/iframe-stamper`](https://www.npmjs.com/package/@turnkey/iframe-stamper) to insert a new iframe element: - - ```js - const iframeStamper = new IframeStamper({ - iframeUrl: "https://auth.turnkey.com", - // Configure how the iframe element is inserted on the page - iframeContainerId: "your-container", - iframeElementId: "turnkey-iframe", - }); - - // Inserts the iframe in the DOM. This creates the new encryption target key - const publicKey = await iframeStamper.init(); - ``` - -2. Your code receives the iframe public key and shows the auth form, and the user enters their email address. -3. Your app can now create and sign a new `EMAIL_AUTH` activity with the user email and the iframe public key in the parameters. Optional arguments include a custom name for the API key, and a specific duration (denoted in seconds) for it. Note: you'll need to retrieve the sub-organization ID based on the user email. -4. Email is received by the user. -5. User copies and pastes their auth code into your app. Remember: this code is an encrypted credential which can only be decrypted within the iframe. In order to enable persistent sessions, save the auth code in local storage: - - ```js - window.localStorage.setItem("BUNDLE", bundle); - ``` - - See [Email Customization](#email-customization) below to use a magic link instead of a one time code. - -6. Your app injects the auth code into the iframe for decryption: - - ```js - await iframeStamper.injectCredentialBundle(code); - ``` - -7. At this point, the user is authenticated! - -8. Your app should use [`@turnkey/iframe-stamper`](https://www.npmjs.com/package/@turnkey/iframe-stamper) to sign a new activity, e.g. `CREATE_WALLET`: - - ```js - // New client instantiated with our iframe stamper - const client = new TurnkeyClient( - { baseUrl: "https://api.turnkey.com" }, - iframeStamper, - ); - - // Sign and submits the CREATE_WALLET activity - const response = await client.createWallet({ - type: "ACTIVITY_TYPE_CREATE_WALLET", - timestampMs: String(Date.now()), - organizationId: authResponse.organizationId, - parameters: { - walletName: "Default Wallet", - accounts: [ - { - curve: "CURVE_SECP256K1", - pathFormat: "PATH_FORMAT_BIP32", - path: "m/44'/60'/0'/0/0", - addressFormat: "ADDRESS_FORMAT_ETHEREUM", - }, - ], - }, - }); - ``` - -9. User navigates to a new tab. - -10. Because the code was also saved in local storage (step 6), it can be injected into the iframe across different tabs, resulting in a persistent session. See our [Demo Embedded Wallet](https://wallet.tx.xyz) for a [sample implementation](https://github.com/tkhq/demo-embedded-wallet/blob/942ccc97de7f9289892b1714b10f3a21afec71b3/src/providers/auth-provider.tsx#L150-L171), specifically dealing with sharing the iframeStamper across components. - - ```js - const code = window.localStorage.getItem("BUNDLE"); - await iframeStamper.injectCredentialBundle(code); - ``` - -11. Again, the user is authenticated, and able to initiate activities! - -12. Just like step 8, the iframeStamper can be used to sign another activity. - - ```js - const client = new TurnkeyClient( - { baseUrl: "https://api.turnkey.com" }, - iframeStamper, - ); - - // Sign and submits a SIGN_TRANSACTION activity - const response = await client.signTransaction({ - type: "ACTIVITY_TYPE_SIGN_TRANSACTION_V2", - timestampMs: String(Date.now()), - organizationId: authResponse.organizationId, - parameters: { - signWith: "0x...", - type: "TRANSACTION_TYPE_ETHEREUM", - unsignedTransaction: "unsigned-tx", - }, - }); - ``` - -Congrats! You've succcessfully implemented Email Auth! 🥳 - -## Integration notes - -### Email customization - -We offer customization for the following: - -- `appName`: the name of the application. This will be used in the email's subject, e.g. `Sign in to ${appName}` -- `logoUrl`: a link to a PNG with a max width of 340px and max height of 124px -- `magicLinkTemplate`: a template for the URL to be used in the magic link button, e.g. `https://dapp.xyz/%s`. The auth bundle will be interpolated into the `%s` - -```js -// Sign and submits the EMAIL_AUTH activity -const response = await client.emailAuth({ - type: "ACTIVITY_TYPE_EMAIL_AUTH", - timestampMs: String(Date.now()), - organizationId: , - parameters: { - email: , - targetPublicKey: , - apiKeyName: , - expirationSeconds: , - emailCustomization: { - appName: , - logoUrl: , - magicLinkTemplate: - } - }, -}); -``` - -### Bespoke email templates - -We also support custom HTML email templates for [Enterprise](https://www.turnkey.com/pricing) clients. This allows you to inject arbitrary data from a JSON string containing key-value pairs. In this case, the `emailCustomization` variable may look like: - -```js -... -emailCustomization: { - templateId: , - templateVariables: "{\"username\": \"alice and bob\"}" -} -... -``` - -In this specific example, the value `alice and bob` can be interpolated into the email template using the key `username`. The use of such template variables is purely optional. - -Here's an example of a custom HTML email containing an email auth bundle: - -

- dynamic -

- -If you are interested in implementing bespoke, fully-customized email templates, please reach out to . - -### Credential validity checks - -By default, if a Turnkey request is signed with an expired credential, the API will return a 401 error. If you'd like to validate an injected credential, you can specifically use the `whoami` endpoint: - -```js -const whoamiResponse = await client.getWhoami({ - organizationId, -}); -``` - -A valid response indicates the credential is still live; otherwise, an error including `unable to authenticate: api key expired` will be thrown. diff --git a/docs/solutions/embedded-wallets/email-recovery-in-sub-organizations.md b/docs/solutions/embedded-wallets/email-recovery-in-sub-organizations.md deleted file mode 100644 index 7653c2f6..00000000 --- a/docs/solutions/embedded-wallets/email-recovery-in-sub-organizations.md +++ /dev/null @@ -1,102 +0,0 @@ ---- -sidebar_position: 4 -description: Learn about Email Recovery on Turnkey -slug: /embedded-wallets/sub-organization-recovery ---- - -# Email Recovery - -:::info - -Email Recovery is a legacy flow, now superseded by [Email Auth](./email-auth-for-sub-organizations.md), which can used to implement recovery flows and more. - -::: - -Email recovery shines if you are leveraging [sub-organizations](/concepts/Sub-Organizations) to create embedded wallets for your users. This allows your users to recover their Turnkey account if something goes wrong with their passkeys, and keeps you out of the loop: we engineered this feature to ensure your organization is unable to take over sub-organizations even if it wanted to. - -A simple example demonstrating email recovery end-to-end can be found [here](https://github.com/tkhq/sdk/tree/main/examples/email-recovery). - - - -## Prerequisites - -Make sure you have set up your primary Turnkey organization with at least one API user that can programmatically initiate email recovery on behalf of suborgs. Check out our [Quickstart guide](/getting-started/quickstart) if you need help getting started. To allow an API user to initiate email recovery, you'll need the following policy in your main organization: - -```json JSON -{ - "effect": "EFFECT_ALLOW", - "consensus": "approvers.any(user, user.id == '')", - "condition": "activity.resource == 'RECOVERY' && activity.action == 'CREATE'" -} -``` - -## Helper packages - -- We have released open-source code to create target encryption keys, decrypt recovery credentials, and sign Turnkey activities. We've deployed this a static HTML page hosted on `recovery.turnkey.com` meant to be embedded as an iframe element (see the code [here](https://github.com/tkhq/frames)). This ensures the recovery credentials are encrypted to keys that your organization doesn't have access to (because they live in the iframe, on a separate domain) -- We have also built a package to help you insert this iframe and interact with it in the context of email recovery: [`@turnkey/iframe-stamper`](https://www.npmjs.com/package/@turnkey/iframe-stamper) - -In the rest of this guide we'll assume you are using these helpers. - -## Email Recovery step-by-step - -Here's a diagram summarizing the email recovery flow step-by-step ([direct link](/img/email_recovery_steps.png)): - -

- email recovery steps -

- -Let's review these steps in detail: - -1. User on `yoursite.xyz` clicks "recovery", and a new recovery UI is shown. We recommend this recovery UI be a new hosted page of your site or application, which contains language explaining to the user what steps they will need to take next to complete recovery. While the UI is in a loading state your frontend uses [`@turnkey/iframe-stamper`](https://www.npmjs.com/package/@turnkey/iframe-stamper) to insert a new iframe element: - - ```js - const iframeStamper = new IframeStamper({ - iframeUrl: "https://recovery.turnkey.com", - // Configure how the iframe element is inserted on the page - iframeContainerId: "your-container", - iframeElementId: "turnkey-iframe", - }); - - // Inserts the iframe in the DOM. This creates the new encryption target key - const publicKey = await iframeStamper.init(); - ``` - -2. Your code receives the iframe public key and shows the recovery form, and the user enters their email address. -3. Your app can now create and sign a new `INIT_USER_EMAIL_RECOVERY` activity with the user email and the iframe public key in the parameters. Note: you'll need to retrieve the sub-organization ID based on the user email. -4. Email is received by the user. -5. User copies and pastes their recovery code into your app. Remember: this code is an encrypted credential which can only be decrypted within the iframe. -6. Your app injects the recovery code into the iframe for decryption: - ```js - await iframeStamper.injectCredentialBundle(code); - ``` -7. Your app prompts the user to create a new passkey (using our SDK functionality): - ```js - // Creates a new passkey - let attestation = await getWebAuthnAttestation(...params...) - ``` -8. Your app uses [`@turnkey/iframe-stamper`](https://www.npmjs.com/package/@turnkey/iframe-stamper) to sign a new `RECOVER_USER` activity: - - ```js - // New client instantiated with our iframe stamper - const client = new TurnkeyClient( - { baseUrl: "https://api.turnkey.com" }, - iframeStamper, - ); - - // Sign and submits the RECOVER_USER activity - const response = await client.recoverUser({ - type: "ACTIVITY_TYPE_RECOVER_USER", - timestampMs: String(Date.now()), - organizationId: initRecoveryResponse.organizationId, - parameters: { - userId: initRecoveryResponse.userId, - authenticator: { - authenticatorName: data.authenticatorName, - challenge: base64UrlEncode(challenge), - attestation: attestation, - }, - }, - }); - ``` - -Once the `RECOVER_USER` activity is successfully posted, the recovery is complete! If this activity succeeds, your frontend can redirect to login/sign-in or perform crypto signing with the new passkey. diff --git a/docs/solutions/embedded-wallets/overview.md b/docs/solutions/embedded-wallets/overview.md deleted file mode 100644 index 09180d8a..00000000 --- a/docs/solutions/embedded-wallets/overview.md +++ /dev/null @@ -1,52 +0,0 @@ ---- -sidebar_position: 1 -description: Intro to embedded wallets on Turnkey -slug: /embedded-wallets/overview -sidebar_label: Introduction ---- - -# Embedded Wallets - -## Seamless, secure wallet infrastructure - -With embedded wallets on Turnkey, you can create custom wallet experiences that are seamlessly integrated into your product, without compromising on security. Whether you need custodial or non-custodial wallets, our infrastructure provides the foundation for building innovative, user-friendly crypto products. - -### Why embedded wallets? - -Embedded wallets give you the freedom to design and control the entire user experience, while offloading the complexity and risk of private key management to Turnkey. As one of our customers put it: - -> "The ability for us to build our own stack and control the entire user experience without worrying about security has been one of the best things about Turnkey." - -With Embedded wallets, you can: - -- Create custom wallet flows that match your product's look and feel -- Choose between custodial or non-custodial models based on your use case -- Leverage advanced security and UX features like multi-sig and session keys -- Support various authentication methods, from passkeys to email-based flows -- Focus on building great products, not managing private keys - -### How it works - -Turnkey's Embedded Wallets are built on top of our [Sub-Organizations](/concepts/sub-organizations) primitive. Each wallet is represented by a sub-organization, which can be configured with different security settings and access controls. - -##### Custodial vs non-custodial - -- For custodial wallets, your application holds the master key and can initiate transactions on behalf of users. -- For non-custodial wallets, users hold their own private keys and must approve each transaction, whether it's via their own passkey, API key, or iframe session. - -##### Advanced features - -- Multi-sig: Require multiple approvals for sensitive transactions -- Session Keys: Grant temporary, limited access to wallets for improved UX -- Flexible Authentication: Use passkeys, email auth, or other methods to secure user access - -##### Getting started - -To start building with embedded wallets, check out our detailed guides and API references: - -- [Sub-Organizations as Wallets](/embedded-wallets/sub-organizations-as-wallets) -- [Sub-Organization Email Auth](/embedded-wallets/sub-organization-auth) -- [Sub-Organization Recovery](/embedded-wallets/sub-organization-recovery) -- [Turnkey API Reference](/api) - -Or, if you’re looking to create smart wallets for your users, using Turnkey as a user-friendly, recoverable EOA, check out our [guide](/reference/aa-wallets) on integrating Account Abstraction (AA) wallets with Turnkey. diff --git a/docs/solutions/signing-automation/_category_.json b/docs/solutions/signing-automation/_category_.json deleted file mode 100644 index a68d9bbe..00000000 --- a/docs/solutions/signing-automation/_category_.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "label": "Signing Automation", - "position": 2, - "collapsed": false -} diff --git a/docs/solutions/signing-automation/code-examples/_category_.json b/docs/solutions/signing-automation/code-examples/_category_.json deleted file mode 100644 index f87dc892..00000000 --- a/docs/solutions/signing-automation/code-examples/_category_.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "label": "Code Examples", - "position": 2, - "link": { - "type": "generated-index", - "description": "Code Examples" - } -} diff --git a/docs/solutions/signing-automation/code-examples/signing-transactions.mdx b/docs/solutions/signing-automation/code-examples/signing-transactions.mdx deleted file mode 100644 index 9dfde097..00000000 --- a/docs/solutions/signing-automation/code-examples/signing-transactions.mdx +++ /dev/null @@ -1,51 +0,0 @@ ---- -title: "Signing Transactions" -sidebar_position: 2 -description: Signing Transactions -slug: /signing-automation/code-examples/signing-transactions ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import Parameter from "@site/src/components/parameter"; - -This is a guide to signing transactions in a server context. While these snippets leverage Ethers, it can be swapped out for other signers in the Viem or Solana contexts. An example for Ethers can be found [here](https://github.com/tkhq/sdk/tree/main/examples/with-ethers), and [here](https://github.com/tkhq/sdk/tree/main/examples/with-viem) for Viem in the server context. A similar example with Solana can be found [here](https://github.com/tkhq/sdk/tree/main/examples/with-solana). - -#### 1. Initialize the Server Client - -```typescript -import { Turnkey } from "@turnkey/sdk-browser"; - -const turnkeyClient = new Turnkey({ - apiBaseUrl: "https://api.turnkey.com", - defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, - apiPrivateKey: process.env.API_PRIVATE_KEY, - apiPublicKey: process.env.API_PUBLIC_KEY, -}); -``` - -#### 2. Initialize an Ethers Provider and Turnkey Signer - -```typescript -import { ethers } from "ethers"; -import { TurnkeySigner } from "@turnkey/ethers"; - -const provider = new ethers.JsonRpcProvider(); -const turnkeySigner = new TurnkeySigner({ - client: turnkeyClient.apiClient(), - organizationId: process.env.ORGANIZATION_ID!, - signWith: process.env.SIGN_WITH!, - }); -``` - -#### 3. Call `sendTransaction` with the Turnkey Signer - -```typescript -const transactionRequest = { - to: "", - value: ethers.parseEther(""), - type: 2, -}; -const sendTransaction = - await connectedSigner.sendTransaction(transactionRequest); -``` diff --git a/docs/welcome.mdx b/docs/welcome.mdx deleted file mode 100644 index 3ece0783..00000000 --- a/docs/welcome.mdx +++ /dev/null @@ -1,346 +0,0 @@ ---- -title: Welcome -sidebar_position: 1 -slug: / ---- - -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import { Dropdown } from "@site/src/components/Dropdown"; - -# Getting started with Turnkey - -welcome - -
- Website |{" "} - X |{" "} - - Support - {" "} - | Whitepaper -
- -Welcome to Turnkey! To make the most out of Turnkey's wallet infrastructure, we've compiled a list of helpful resources for you below. - -:::note - -Getting ready to launch? Ensure you **double check our [resource limits](/concepts/resource-limits) and [rate limits](/faq#do-you-have-any-rate-limits-in-place-in-your-public-api)** to ensure your implementation will not trigger these limits at production scale. -For additional pre-launch guidance, **refer to our [Launch Checklist](/getting-started/launch-checklist)** to make sure you're ready to launch safely. - -::: - -## About - -[Turnkey](https://turnkey.com) is highly flexible key management infrastructure, -purpose-built for security and scale. Our API and open-source SDKs make it easy for you to take your -product from 0 to 1, and enable developers to create millions of embedded wallets and automate complex onchain transactions. - -Whether you're building a DeFi platform, a payments app, an AI agent, or anything requiring a private key, -Turnkey offers the building blocks to bring your ideas to life. - -Our solution covers two main use cases: - -
-
-

Embedded Wallets

-
-

Create millions of embedded wallets on behalf of your users for a flawless onboarding and in-app experience.

- - - - - -

- ⚡ To start building with embedded wallets, check out our demos, kits and - detailed guides: -

- - - -
- Read our concept overview below for a smooth implementation. -
- -
- -
-

Onchain Automation

-
-

Automate even the most complex onchain transactions, from staking management to smart contract interactions.

- - - - - -

- 🔧 To start using Turnkey for onchain automation, check out{" "} - Quickstart,{" "} - - server signing guide - - , and explore our API Reference. -

- -
- Read our concept overview below for a smooth implementation. -
- -
-
- -## Concepts Overview - -:::note - -Before getting started, we highly recommend -familiarizing yourself with Turnkey's core concepts below to ensure a smooth implementation. - -::: - ---- - -At the core of Turnkey is an important concept: -instead of directly managing private keys, wallets -are accessed through authenticators like passkeys, social logins, -or API keys: - -

- Concepts Overview -

- -### Here's how that works: - -- **Organizations (parent orgs)** in Turnkey are top-level - entities that contain users, wallets, and policies for a business, - with the initial "parent organization" _typically representing an - entire Turnkey-powered application._ -- Parent organizations can create **sub-organizations (sub-orgs)**, - which are fully segregated organizations nested under the parent organization. - Parent orgs cannot modify the contents of a sub-org, and sub-orgs and _typically represent an end user_. -- Both parent organizations and sub-organizations contain a set of - **resources and authenticators** that you can configure, including their own users, wallets, API keys, private keys, and policies. -- **Activities** (like signing transactions or creating users) - are governed by **policies** created via Turnkey's policy engine, - though root users can bypass the policy engine when meeting root quorum requirements. -- **Wallets** in Turnkey are HD seed phrases that can generate - multiple wallet accounts (addresses) for signing operations. - -:::note - -There is no set relationship between organizations, sub-organizations, -activities, wallets, and resources. -This makes Turnkey highly flexible and configurable to any use case. - -::: - -For a more in-depth overview, [access our documentation here](/concepts/overview). - -## Demos And Examples - ---- - -1. [Embedded wallet demo app (web)](https://wallet.tx.xyz/) -2. [Flutter (mobile) demo app](https://github.com/tkhq/dart-sdk/tree/main/examples/flutter-demo-app) -3. [Telegram mini-app demo](https://github.com/tkhq/demo-telegram-mini-app) -4. [Pop-up wallet demo](https://github.com/tkhq/popup-wallet-demo) -5. [React native demo wallet (mobile, web)](https://github.com/tkhq/react-native-demo-wallet/tree/1f2a37d42ac448e388e80d54a349c5387f532de1) -6. [Wallet Kit (pre-generated UI components for user authentication)](https://wallets.turnkey.com/) -7. [Building a trading bot on Solana: Guide](https://www.helius.dev/blog/how-to-build-a-secure-ai-agent-on-solana) - -### **Feature spotlight: Send crypto via a URL** - -Moonshot users can now send crypto to their friends via a URL. -Under the hood, Turnkey pre-generates a wallet for the new user and -loads it with the specified amount of crypto — all authenticated via a biometric passkey (e.g. Face ID). - -

- Moonshot Demo -

- -:::note - -**_To see Turnkey in action, check out some of our favorite customer integrations:_** - -1. [Moonshot](https://moonshot.money/): An app that makes trading crypto as easy as buying stocks. -2. [Infinex](https://infinex.xyz/): A crypto app to access everything onchain in one place. Founded by Kain from Synthetix. -3. [Azura](https://azura.xyz/): A next-generation DeFi platform to make onchain trading easier. -4. [PVP Trade](https://pvp.trade/): A SocialFi experience to trade tokens with friends on Telegram. -5. [Spectral](https://syntax.spectrallabs.xyz/): A platform for creating onchain AI agents. - -::: - -## SDKs - ---- - -Turnkey provides a variety of client libraries for interacting with Turnkey's -API and performing common workflows, as well as several wrappers for popular web3 -libraries for easy integration into existing dApps. - -| Integration | Package | -| ------------------ | -------------------------------------------------------------------------------------------------------------------------------- | -| JavaScript Browser | [`@turnkey/sdk-browser`](https://www.npmjs.com/package/@turnkey/sdk-browser) | -| JavaScript Server | [`@turnkey/sdk-server`](https://www.npmjs.com/package/@turnkey/sdk-server) | -| React | [`@turnkey/sdk-react`](https://www.npmjs.com/package/@turnkey/sdk-react) | -| React Native | See [React Native passkey stamper](https://github.com/tkhq/sdk/tree/main/packages/react-native-passkey-stamper) for more details | -| Golang | [`go-sdk`](https://github.com/tkhq/go-sdk) | -| Rust | [`rust-sdk`](https://github.com/tkhq/rust-sdk) | -| Ruby | [`ruby-sdk`](https://github.com/tkhq/ruby-sdk) | -| Command Line | [Using the CLI](https://docs.turnkey.com/sdks/cli) | -| Flutter/Dart | All packages published [here](https://pub.dev/publishers/turnkey.com/packages) | -| Swift | [`swift-sdk`](https://github.com/tkhq/swift-sdk) | -| Ethers | [`@turnkey/ethers`](https://www.npmjs.com/package/@turnkey/ethers) | -| Viem | [`@turnkey/viem`](https://www.npmjs.com/package/@turnkey/viem) | -| CosmJS | [`@turnkey/cosmjs`](https://www.npmjs.com/package/@turnkey/cosmjs) | -| EIP-1193 | [`@turnkey/eip-1193-provider`](https://www.npmjs.com/package/@turnkey/eip-1193-provider) | -| Solana | [`@turnkey/solana`](https://www.npmjs.com/package/@turnkey/solana) | -| Advanced | See [docs](category/advanced) for more details | - -## Security - ---- - -We take security seriously at Turnkey and have built our architecture to ensure that you and your -end users' private keys are safe. Our [whitepaper](https://whitepaper.turnkey.com/) covers our -holistic security model in-depth and our vision for building verifiable key management infrastructure. - -### How does Turnkey secure private keys? - -Turnkey uses AWS Nitro Enclaves, a type of tamper-proof Trusted Execution Environment (TEE), -for all sensitive operations. Private keys are never decrypted outside these enclaves, -and only you can authorize key usage with your credentials. Turnkey has also implemented -stringent protocols to prevent individual engineers from altering enclave code, ensuring a secure end-to-end deployment process. - -Turnkey does not store unencrypted private keys, but rather persists encrypted private key -ciphertext inside of our primary and disaster recovery databases. This ciphertext is only -to be decrypted from within the bounds of a secure enclave running verified Turnkey applications. - -### Is Turnkey non-custodial? Who has access to my users' private keys? - -Turnkey's novel security architecture means raw private keys themselves are never exposed to Turnkey, -your software, or your team. Specifically, Turnkey stores encrypted private keys that are only -decrypted when you authenticate to an auditable, tamper-proof secure enclave with your secret -(e.g., API key or Passkey credentials). You (and/or your end users, depending on your implementation) -remain the owner of your private keys and the funds controlled by those private keys at all times. -See [quorum deployments](https://docs.turnkey.com/security/quorum-deployments) for more details on -how we provision secure enclaves to ensure you're always in control of your private keys. - -### Is Turnkey open-source? - -Turnkey's infrastructure combines extensive SDK support with open-source packages that allow for straightforward -integration across multiple languages and environments. While competitors offers closed or proprietary SDKs -that lock you into limited workflows and create dependencies on specific providers, -Turnkey's open SDKs enable direct access to both lower-level abstractions and the core API, granting -you complete control over your wallet infrastructure. - -We've also open-sourced [QuorumOS](https://github.com/tkhq/qos): a minimal, immutable, and deterministic -Linux unikernel build system for use cases that require high security and accountability. -QuorumOS is a critical part of Turnkey's stack for running applications inside TEEs at modern cloud scale. - -Currently, we are working on a verifiable security model for our API, so that third parties can attest -to the code that is running inside of Turnkey's secure enclaves. - -### How can I report a security vulnerability / Is there a bug bounty? - -Turnkey highly values the security of our software, services, and systems and we actively encourage -the ethical reporting of any security vulnerabilities discovered. We invite researchers and users -to report potential security vulnerabilities to our Bug Bounty Program via -[the form in our docs,](https://docs.turnkey.com/security/reporting-a-vulnerability) or to us via email at -[security@turnkey.com](mailto:security@turnkey.com). When submitting a report via email, please provide a -thorough description of the vulnerability, including steps to reproduce it and its potential impact. - -If you believe you have found very serious vulnerability, we ask that you encrypt the message to the -`security.turnkey.com` PGP key (FP: `AD6C 3E61 17A5 886E 550E F8BB 3ACD E5EA 8DC7 9275`). -This can also be found on Turnkey's website at `https://www.turnkey.com/.well-known/security.asc` - -## Support - -For support, product feedback, and input, join our community Slack channel -[here](https://clubturnkey.slack.com/join/shared_invite/zt-2837d2isy-gbH60kJ~XnXSSFHiqVOrqw#/shared-invite/email). diff --git a/docusaurus.config.js b/docusaurus.config.js deleted file mode 100644 index faae629a..00000000 --- a/docusaurus.config.js +++ /dev/null @@ -1,174 +0,0 @@ -// @ts-check -// Note: type annotations allow type checking and IDEs autocompletion - -const lightCodeTheme = require("prism-react-renderer/themes/github"); -const darkCodeTheme = require("prism-react-renderer/themes/dracula"); - -/** @type {import('@docusaurus/types').Config} */ -const config = { - title: "Turnkey Documentation", - tagline: "Programmatic key management", - favicon: "img/favicon.svg", - - // Set the production url of your site here - url: "https://docs.turnkey.com", - // Set the // pathname under which your site is served - // For GitHub pages deployment, it is often '//' - baseUrl: "/", - - // GitHub pages deployment config. - // If you aren't using GitHub pages, you don't need these. - organizationName: "tkhq", // Usually your GitHub org/user name. - projectName: "docs", // Usually your repo name. - - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "warn", - - // Even if you don't use internationalization, you can use this field to set useful - // metadata like html lang. For example, if your site is Chinese, you may want - // to replace "en" with "zh-Hans". - i18n: { - defaultLocale: "en", - locales: ["en"], - }, - plugins: [ - [ - "docusaurus-biel", - { - project: "5q3y720cqx", - headerTitle: "Turnkey Chatbot", - }, - ], - ], - - presets: [ - [ - "classic", - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - routeBasePath: "/", - sidebarPath: require.resolve("./sidebars.js"), - // Please change this to your repo. - // Remove this to remove the "edit this page" links. - // editUrl: - // 'https://github.com/facebook/docusaurus/tree/main/packages/create-docusaurus/templates/shared/', - }, - theme: { - customCss: require.resolve("./src/css/custom.css"), - }, - }), - ], - [ - "redocusaurus", - { - specs: [ - { - spec: "api/public_api.swagger.json", - url: "api/public_api.swagger.json", - route: "/api/", - }, - ], - }, - ], - ], - - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - // Replace with your project's social card - image: "img/og-image.png", - navbar: { - title: "", - logo: { - alt: "Turnkey Logo", - src: "img/Logo_black.png", - srcDark: "img/logo.png", - }, - items: [ - { - type: "doc", - docId: "welcome", - position: "left", - label: "Documentation", - }, - { - type: "doc", - docId: "solutions/embedded-wallets/overview", - position: "left", - label: "Solutions", - }, - { - type: "doc", - docId: "sdks/introduction", - position: "left", - label: "SDK Reference", - }, - { - position: "left", - label: "API Reference", - to: "/api", - }, - // {to: '/blog', label: 'Blog', position: 'left'}, - { - to: "https://github.com/tkhq", - label: "GitHub", - position: "right", - }, - { - to: "https://app.turnkey.com", - label: "Dashboard", - position: "right", - }, - ], - }, - footer: { - style: "dark", - links: [ - { - title: "Guides", - items: [ - { - label: "Quickstart", - to: "/getting-started/quickstart", - }, - ], - }, - { - title: "Twitter", - items: [ - { - label: "Twitter", - href: "https://twitter.com/turnkeyhq", - }, - ], - }, - { - title: "More", - items: [ - { - label: "GitHub", - href: "https://github.com/tkhq/", - }, - ], - }, - ], - copyright: `Copyright © ${new Date().getFullYear()} Turnkey`, - }, - prism: { - theme: lightCodeTheme, - darkTheme: darkCodeTheme, - additionalLanguages: ["swift"], - }, - algolia: { - appId: "89KSB43UFT", - // Public API key: it is safe to commit it - apiKey: "a0740f141135937727389d897f51fb56", - indexName: "turnkey", - contextualSearch: true, - searchPagePath: false, - }, - }), -}; - -module.exports = config; diff --git a/docs/documentation/ecosystems/bitcoin.md b/ecosystems/bitcoin.mdx similarity index 77% rename from docs/documentation/ecosystems/bitcoin.md rename to ecosystems/bitcoin.mdx index 1d42acc3..af9c0712 100644 --- a/docs/documentation/ecosystems/bitcoin.md +++ b/ecosystems/bitcoin.mdx @@ -1,15 +1,11 @@ --- -sidebar_position: 30 -title: Bitcoin -description: "Bitcoin support on Turnkey" -slug: /ecosystems/bitcoin +title: "Bitcoin support on Turnkey" +sidebarTitle: "Bitcoin" --- -# Bitcoin support on Turnkey - ## BIP32 and BIP44: the basis for Turnkey wallets -[BIP32](https://en.bitcoin.it/wiki/BIP_0032) and [BIP44](https://en.bitcoin.it/wiki/BIP_0044) are standards developed in the Bitcoin ecosystem. Turnkey closely follows this to power [Wallets](../concepts/Wallets.md) since they're adopted within Bitcoin and outside, spanning many other ecosystems. +[BIP32](https://en.bitcoin.it/wiki/BIP_0032) and [BIP44](https://en.bitcoin.it/wiki/BIP_0044) are standards developed in the Bitcoin ecosystem. Turnkey closely follows this to power [Wallets](/concepts/wallets) since they're adopted within Bitcoin and outside, spanning many other ecosystems. ## BIP39: mnemonics @@ -19,23 +15,23 @@ Turnkey supports importing and exporting keys in mnemonics form, following [BIP3 You can derive Bitcoin addresses when creating a Turnkey wallet or private key. The address types we support currently: -- P2PKH (Pay-To-Public-Key-Hash) -- P2SH (Pay-To-Script-Hash) -- P2WPKH (Pay-to-Witness-Public-Key-Hash) -- [segwit-enabled](https://learnmeabitcoin.com/technical/upgrades/segregated-witness/) -- P2WSH (Pay-to-Witness-Script-Hash) -- [segwit-enabled](https://learnmeabitcoin.com/technical/upgrades/segregated-witness/) -- P2TR (Pay-to-Taproot) -- [taproot-enabled](https://cointelegraph.com/learn/a-beginners-guide-to-the-bitcoin-taproot-upgrade) +* P2PKH (Pay-To-Public-Key-Hash) +* P2SH (Pay-To-Script-Hash) +* P2WPKH (Pay-to-Witness-Public-Key-Hash) -- [segwit-enabled](https://learnmeabitcoin.com/technical/upgrades/segregated-witness/) +* P2WSH (Pay-to-Witness-Script-Hash) -- [segwit-enabled](https://learnmeabitcoin.com/technical/upgrades/segregated-witness/) +* P2TR (Pay-to-Taproot) -- [taproot-enabled](https://cointelegraph.com/learn/a-beginners-guide-to-the-bitcoin-taproot-upgrade) Bitcoin addresses change depending on the network you're using (more precisely, their prefix!). When you derive an address the network will be part of the address format. We support the following networks: -- Mainnet (`MAINNET`) -- Testnet (`TESTNET`) -- Regtest (`REGTEST`) -- Signet (`SIGNET`) +* Mainnet (`MAINNET`) +* Testnet (`TESTNET`) +* Regtest (`REGTEST`) +* Signet (`SIGNET`) For example: -- To derive a P2TR address on testnet, use `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`. -- To derive a P2SH address on mainnet, use `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`. +* To derive a P2TR address on testnet, use `ADDRESS_FORMAT_BITCOIN_TESTNET_P2TR`. +* To derive a P2SH address on mainnet, use `ADDRESS_FORMAT_BITCOIN_MAINNET_P2SH`. ## Schnorr signatures and tweaks diff --git a/docs/documentation/ecosystems/ethereum.md b/ecosystems/ethereum.mdx similarity index 69% rename from docs/documentation/ecosystems/ethereum.md rename to ecosystems/ethereum.mdx index e98bf2d2..c651e6c1 100644 --- a/docs/documentation/ecosystems/ethereum.md +++ b/ecosystems/ethereum.mdx @@ -1,12 +1,8 @@ --- -sidebar_position: 10 -title: Ethereum (EVM) -description: "Ethereum (EVM) support on Turnkey" -slug: /ecosystems/ethereum +title: "Ethereum (EVM) support on Turnkey" +sidebarTitle: "Ethereum (EVM)" --- -# Ethereum (EVM) support on Turnkey - ## Address derivation Turnkey supports EVM address derivation with `ADDRESS_TYPE_ETHEREUM`. This address format is valid across all EVM chains and L2s. @@ -15,12 +11,12 @@ Turnkey supports EVM address derivation with `ADDRESS_TYPE_ETHEREUM`. This addre To construct and sign an EVM transaction with Turnkey, we offer: -- [`@turnkey/viem`](https://npmjs.com/package/@turnkey/viem): contains a `createAccount` method to create a Turnkey-powered [custom account](https://viem.sh/docs/accounts/local) which [Viem](https://viem.sh/) can use seamlessly. -- [`@turnkey/ethers`](https://npmjs.com/package/@turnkey/ethers): contains a `TurnkeySigner` which implements Ethers' `AbstractSigner` interface. See [Ethers docs](https://docs.ethers.org/v6/api/providers/abstract-signer/#AbstractSigner). +* [`@turnkey/viem`](https://npmjs.com/package/@turnkey/viem): contains a `createAccount` method to create a Turnkey-powered [custom account](https://viem.sh/docs/accounts/local) which [Viem](https://viem.sh/) can use seamlessly. +* [`@turnkey/ethers`](https://npmjs.com/package/@turnkey/ethers): contains a `TurnkeySigner` which implements Ethers' `AbstractSigner` interface. See [Ethers docs](https://docs.ethers.org/v6/api/providers/abstract-signer/#AbstractSigner). ## Transaction parsing, policies, and signing -Turnkey has built an EVM parser which runs in a secure enclave, to parse unsigned EVM transactions and extract useful metadata: transaction source, destination, amount, chain ID, and more. See the `EthereumTransaction` struct in our [policy language](../concepts/policy-management/Policy-language.md) page for a full list. +Turnkey has built an EVM parser which runs in a secure enclave, to parse unsigned EVM transactions and extract useful metadata: transaction source, destination, amount, chain ID, and more. See the `EthereumTransaction` struct in our [policy language](/concepts/policies/language) page for a full list. As a bonus, Turnkey also takes care of combining the signature with the original payload if you use the `SIGN_TRANSACTION` activity types: the input is the unsigned payload (RLP encoded), and the output is the signed RLP encoded transaction, ready to be broadcast! @@ -28,7 +24,7 @@ As a bonus, Turnkey also takes care of combining the signature with the original Turnkey is built to be flexible: a lot of our customers use Turnkey as a smart contract signer, alongside other types of signers. -This is so common that AA wallet providers have integrated Turnkey as a default solution in their documentation. Refer to our [AA Wallet](../../solutions/embedded-wallets/account-abstraction.md) documentation for further information. +This is so common that AA wallet providers have integrated Turnkey as a default solution in their documentation. Refer to our [AA Wallet](/reference/aa-wallets) documentation for further information. ## EIP-1193 provider @@ -44,45 +40,45 @@ A lot of our demos use EVM chains and capabilities. The most complete demo is ou Try it out at [wallet.tx.xyz](https://wallet.tx.xyz)! -The code behind this demo is open-source, available at https://github.com/tkhq/demo-embedded-wallet/ +The code behind this demo is open-source, available at [https://github.com/tkhq/demo-embedded-wallet/](https://github.com/tkhq/demo-embedded-wallet/) If you're looking for shorter, more focused examples, here are a few worth checking out: -- [`examples/with-eth-passkeys-galore`](https://github.com/tkhq/sdk/tree/main/examples/with-eth-passkeys-galore): shows both Ethers and Viem integrations. -- [`examples/with-gnosis`](https://github.com/tkhq/sdk/tree/main/examples/with-gnosis): shows how to use Turnkey with [Gnosis (Safe)](https://safe.global/). -- [`examples/with-uniswap`](https://github.com/tkhq/sdk/tree/main/examples/with-uniswap): shows how to use Turnkey with Uniswap, using Ethers. -- [`example/with-eip-1193-provider`](https://github.com/tkhq/sdk/tree/main/examples/with-eip-1193-provider): short example focused on EIP-1193 provider usage. +* [`examples/with-eth-passkeys-galore`](https://github.com/tkhq/sdk/tree/main/examples/with-eth-passkeys-galore): shows both Ethers and Viem integrations. +* [`examples/with-gnosis`](https://github.com/tkhq/sdk/tree/main/examples/with-gnosis): shows how to use Turnkey with [Gnosis (Safe)](https://safe.global/). +* [`examples/with-uniswap`](https://github.com/tkhq/sdk/tree/main/examples/with-uniswap): shows how to use Turnkey with Uniswap, using Ethers. +* [`example/with-eip-1193-provider`](https://github.com/tkhq/sdk/tree/main/examples/with-eip-1193-provider): short example focused on EIP-1193 provider usage. ## Which EVM chains does Turnkey support? Turnkey supports the EVM chains below for address derivation and signing arbitrary transactions: -- Arbitrum -- Aurora -- Avalanche C chain -- Avalanche Fuji -- Base -- Berachain -- BNB Smart Chain -- Celo -- Chiliz -- Cronos -- EON -- Ethereum -- Fantom -- Gnosis -- Holesky Redstone -- Holesky Garnet -- Lukso -- Linea -- Monad -- Moonbeam -- Optimism -- Palm -- Polygon -- Redstone -- Scroll -- zkSync -- Zora - -If you are using an EVM chain we do not support, feel free to contact us at , on [X](https://x.com/turnkeyhq/), or [on Slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-2837d2isy-gbH60kJ~XnXSSFHiqVOrqw). +* Arbitrum +* Aurora +* Avalanche C chain +* Avalanche Fuji +* Base +* Berachain +* BNB Smart Chain +* Celo +* Chiliz +* Cronos +* EON +* Ethereum +* Fantom +* Gnosis +* Holesky Redstone +* Holesky Garnet +* Lukso +* Linea +* Monad +* Moonbeam +* Optimism +* Palm +* Polygon +* Redstone +* Scroll +* zkSync +* Zora + +If you are using an EVM chain we do not support, feel free to contact us at [hello@turnkey.com](mailto:hello@turnkey.com), on [X](https://x.com/turnkeyhq/), or [on Slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-31v4yhgw6-PwBzyNsWCCBTk2xft3EoHQ). diff --git a/ecosystems/framework.mdx b/ecosystems/framework.mdx new file mode 100644 index 00000000..a39a89ea --- /dev/null +++ b/ecosystems/framework.mdx @@ -0,0 +1,87 @@ +--- +title: "Overview" +description: "Turnkey operates at the **cryptographic curve** level rather that specific assets. As a result Turnkey is asset agnostic and can be used with any type of asset as long as we support the underlying curve." +--- + +## Introduction + +We are continuously evaluating and adding support for emerging assets and protocols. If there are specific cryptocurrencies you'd like to see us offer deeper support for, please let us know by contacting us at [hello@turnkey.com](mailto:hello@turnkey.com), on [X](https://x.com/turnkeyhq/), or [on Slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-31v4yhgw6-PwBzyNsWCCBTk2xft3EoHQ). + +## What is Turnkey's approach to supporting crypto assets? + +Turnkey follows a tiered approach to supporting digital assets, ranging from supporting cryptographic curve support, to advanced transaction parsing and policy management. Each tier deepens the level of functionality, as outlined below: + +**Tier 1: Curve-level support** + +Cryptographic curves are our fundamental primitive, allowing Turnkey private keys to store and sign for any cryptocurrency that uses a supported curve. We currently support SECP256k1 and Ed25519 curves. + +**Tier 2: Address derivation** + +Turnkey abstracts address generation, automatically deriving addresses for supported cryptocurrencies. + +For a full list of address formats you can derive on Turnkey, refer to [Address formats and Curves](/concepts/wallets). + +**Tier 3: SDK for transaction construction and signing** + +Our SDK provides tools and scripts to help in constructing and signing basic transactions, enabling an even smoother integration. + +**Tier 4: Transaction parsing and policy creation** + +At our highest level of support, Turnkey offers the ability to parse transactions and define custom policies based on transaction parameters. + +| Tier | Depth of support | EVM | SVM | BTC | ATOM | TRON | SUI | APT | MOVE | +| ------ | :------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | -------------------------------------------- | +| Tier 1 | Curve-level | | | | | | | | | +| Tier 2 | Address derivation | | | | | | | | | +| Tier 3 | SDK construction and signing | | | | | | | | | +| Tier 4 | Transaction parsing and policies | | | | | | | | | + +For more details about each ecosystem, refer to the pages below: + + + + Overview + + + Ethereum (EVM) support on Turnkey + + + Solana (SVM) support on Turnkey + + + Bitcoin support on Turnkey + + + Specific support for other ecosystems on Turnkey + + diff --git a/ecosystems/others.mdx b/ecosystems/others.mdx new file mode 100644 index 00000000..e489d133 --- /dev/null +++ b/ecosystems/others.mdx @@ -0,0 +1,22 @@ +--- +title: "What other ecosystems and chains does Turnkey support?" +sidebarTitle: "Others" +--- + +## Cosmos + +We support address derivation and have published a package on NPM to help with transaction construction: [`@turnkey/cosmjs`](https://www.npmjs.com/package/@turnkey/cosmjs). See it in action in [`examples/with-cosmjs`](https://github.com/tkhq/sdk/tree/main/examples/with-cosmjs). + +## Tron, Sui, Aptos, Movement + +We support address derivation for these ecosystems. We also have a few examples: + +* [`examples/with-sui`](https://github.com/tkhq/sdk/tree/main/examples/with-sui) demonstrates transaction construction and broadcast on Sui. +* [`examples/with-aptos`](https://github.com/tkhq/sdk/tree/main/examples/with-aptos) demonstrates transaction construction and broadcast on Aptos. +* [`examples/with-movement`](https://github.com/tkhq/sdk/tree/main/examples/with-movement) demonstrates transaction construction and broadcast on Movement. + +## Ed25519 and SECP256k1 Signing + +Turnkey supports bare Ed25519 and SECP256k1 signing which covers most ecosystems and blockchains out there. +If your ecosystem of choice isn't covered adequately we're open to feedback and feature requests. +Give us a shout on [X](https://x.com/turnkeyhq/) or [Slack](https://join.slack.com/t/clubturnkey/shared_invite/zt-31v4yhgw6-PwBzyNsWCCBTk2xft3EoHQ)! diff --git a/docs/documentation/ecosystems/solana.md b/ecosystems/solana.mdx similarity index 88% rename from docs/documentation/ecosystems/solana.md rename to ecosystems/solana.mdx index e5eec307..d5c26a98 100644 --- a/docs/documentation/ecosystems/solana.md +++ b/ecosystems/solana.mdx @@ -1,12 +1,8 @@ --- -sidebar_position: 20 -title: Solana (SVM) -description: "Solana (SVM) support on Turnkey" -slug: /ecosystems/solana +title: "Solana (SVM) support on Turnkey" +sidebarTitle: "Solana (SVM)" --- -# Solana (SVM) support on Turnkey - ## Address derivation Turnkey supports Solana address derivation with `ADDRESS_TYPE_SOLANA`. Solana addresses are a simple encoding of the ed25519 public key. @@ -17,7 +13,7 @@ To construct and sign a Solana transaction we offer a `@turnkey/solana` NPM pack ## Transaction parsing, policies, and signing -Turnkey has built a Solana parser which runs in a secure enclave, to parse unsigned transactions and extract metadata. Solana transactions are a list of instructions. We offer details about program keys, accounts, signers, and more. See the `SolanaTransaction` struct in our [policy language](../concepts/policy-management/Policy-language.md) page for a full list. +Turnkey has built a Solana parser which runs in a secure enclave, to parse unsigned transactions and extract metadata. Solana transactions are a list of instructions. We offer details about program keys, accounts, signers, and more. See the `SolanaTransaction` struct in our [policy language](/concepts/policies/language) page for a full list. As a bonus, Turnkey also takes care of combining the signature with the original payload if you use the `SIGN_TRANSACTION` activity types: the input is the unsigned payload, and the output is the signed Solana transaction, ready to be broadcast onchain. diff --git a/docs/solutions/embedded-wallets/code-examples/add-credential.mdx b/embedded-wallets/code-examples/add-credential.mdx similarity index 61% rename from docs/solutions/embedded-wallets/code-examples/add-credential.mdx rename to embedded-wallets/code-examples/add-credential.mdx index 3ef31642..e417206f 100644 --- a/docs/solutions/embedded-wallets/code-examples/add-credential.mdx +++ b/embedded-wallets/code-examples/add-credential.mdx @@ -1,42 +1,28 @@ --- title: "Add an Additional Passkey" -sidebar_position: 6 -description: Add a Credential to an Existing Wallet -slug: /embedded-wallets/code-examples/add-credential +description: "This guide demonstrates how to add a new credential (specifically, a passkey) to an existing wallet using the Turnkey SDK." --- -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import Parameter from "@site/src/components/parameter"; - -## Overview - -This guide demonstrates how to add a new credential (specifically, a passkey) to an existing wallet using the Turnkey SDK. ### Initialize the Passkey Client Begin by initializing the Turnkey SDK by passing in a config object containing: -- `rpId`: The [Relying Party](https://developer.mozilla.org/en-US/docs/Glossary/Relying_party) Identifier, which is the effective domain of your application. -- `apiBaseUrl`: The base URL of the Turnkey API: `https://api.turnkey.com` -- `defaultOrganizationId`: Your parent organization ID, which you can find in the [Turnkey dashboard](https://app.turnkey.com/dashboard). - -
- What's the purpose of the rpId? +* `rpId`: The [Relying Party](https://developer.mozilla.org/en-US/docs/Glossary/Relying_party) Identifier, which is the effective domain of your application. +* `apiBaseUrl`: The base URL of the Turnkey API: `https://api.turnkey.com` +* `defaultOrganizationId`: Your parent organization ID, which you can find in the [Turnkey dashboard](https://app.turnkey.com/dashboard). -The rpId is used in WebAuthn to uniquely identify the server that the passkey is associated with. -The rpId is typically the effective domain of the web application, which is the domain portion of the URL without any subdomains. -For example, if your application is hosted at app.example.com, the rpId would typically be example.com. -This ensures that credentials are scoped to the correct domain and cannot be used by other domains, enhancing security. + -
+ The `rpId` is used in WebAuthn to uniquely identify the server that the passkey is associated with. The `rpId` is typically the effective domain of the web application, which is the domain portion of the URL without any subdomains. For example, if your application is hosted at `app.example.com`, the `rpId` would typically be `example.com`. This ensures that credentials are scoped to the correct domain and cannot be used by other domains, enhancing security. + - - + + First, wrap your application with the `TurnkeyProvider` in your `app/layout.tsx` file: -```tsx title="app/layout.tsx" +```ts app/layout.tsx import { TurnkeyProvider } from "@turnkey/sdk-react"; export default function RootLayout({ @@ -66,7 +52,7 @@ export default function RootLayout({ Then, create a new file `app/add-passkey.tsx` where we'll implement the passkey functionality: -```tsx title="app/add-passkey.tsx" +```tsx app/add-passkey.tsx "use client"; import { useState } from "react"; @@ -80,13 +66,12 @@ export default function AddPasskey() { return
{/* We'll add UI elements here */}
; } ``` +
-
- - + Create a new file `src/add-passkey.ts`: -```typescript title="src/add-passkey.ts" +```ts src/add-passkey.ts import { Turnkey } from "@turnkey/sdk-browser"; // Initialize the Turnkey SDK with your organization credentials @@ -101,64 +86,58 @@ const passkeyClient = turnkey.passkeyClient(); // We'll add more functionality here in the following steps ``` - - +
### Authenticate the User -Now that that the Passkey Client is initialized, we'll call the `login` function which will prompt the -user to authenticate with their passkey. Additionally, this function will set the current user in -local storage upon successful authentication, which will be used later when creating an additional authenticator. - -:::note +Now that that the Passkey Client is initialized, we'll call the `login` function which will prompt the user to authenticate with their passkey. Additionally, this function will set the current user in local storage upon successful authentication, which will be used later when creating an additional authenticator. -The user object which gets stored in local storage is defined as follows: + + The user object which gets stored in local storage is defined as follows: -```typescript -export interface User { - userId: string; - username: string; - organization: SubOrganization; - readOnlySession?: ReadOnlySession; -} -``` - -::: - - - + ``` + export interface User { + userId: string; + username: string; + organization: SubOrganization; + readOnlySession?: ReadOnlySession; + } + ``` + -```tsx title="app/add-passkey.tsx" + + +```tsx app/add-passkey.tsx // ... previous code export default function AddPasskey() { - const { passkeyClient } = useTurnkey(); + // We'll need the base Turnkey client to get the current user + const { passkeyClient, turnkey } = useTurnkey(); - const login = async () => { - const response = await passkeyClient?.login(); - if (response.organizationId) { - console.log("User authenticated successfully"); - } else { - console.log("User authentication failed"); + // ... previous code + + const getUser = async () => { + // Get the current user from local storage, + // we'll need the `userId` to create the authenticator in the next step + const user = await turnkey?.getCurrentUser(); + if (user) { + console.log("User retrieved successfully"); } + // return the user to be used in the next step + return user; }; - // We'll add more functionality here in the following steps - return (
- {/* We'll more add UI elements here */}
); } ``` - - - - -```typescript title="src/add-passkey.ts" +
+ +```ts src/add-passkey.ts // ... previous code const login = async () => { @@ -170,20 +149,16 @@ const login = async () => { } }; ``` - - - +
### Get the current user -Before creating a new passkey, we'll get the current user. This function will retrieve the user from local storage, -which was set after calling the `login` function. We'll need the `userId` to create the authenticator in the final step. - - - +Before creating a new passkey, we'll get the current user. This function will retrieve the user from local storage, which was set after calling the `login` function. We'll need the `userId` to create the authenticator in the final step. -```tsx title="app/add-passkey.tsx" + + +```ts app/add-passkey.tsx // ... previous code export default function AddPasskey() { @@ -210,11 +185,9 @@ export default function AddPasskey() { ); } ``` - - - - -```typescript title="src/add-passkey.ts" + + +```ts src/add-passkey.ts // ... previous code const getCurrentUser = async () => { @@ -228,31 +201,21 @@ const getCurrentUser = async () => { return user; }; ``` - - + ### Create User Passkey -Now that you have authenticated the user, you can call the `createUserPasskey` function to create a new user passkey credential. -Calling this method will prompt the user to create a passkey, which will be securely stored by their browser. -This credential will be associated with the user's account and used for future authentication. -Once the credential is created, we'll use it in the next step to create a new authenticator for the user. - -:::info +Now that you have authenticated the user, you can call the `createUserPasskey` function to create a new user passkey credential. Calling this method will prompt the user to create a passkey, which will be securely stored by their browser. This credential will be associated with the user's account and used for future authentication. Once the credential is created, we'll use it in the next step to create a new authenticator for the user. -The credential includes an encoded challenge and attestation. -The encoded challenge ensures the request is fresh and legitimate, while the attestation verifies -the authenticity of the device creating the credential. For more information on how passkeys work, -including details on the challenge and attestation objects, -you can refer to the [Passkeys Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API#passkeys). + + The credential includes an encoded challenge and attestation. The encoded challenge ensures the request is fresh and legitimate, while the attestation verifies the authenticity of the device creating the credential. For more information on how passkeys work, including details on the challenge and attestation objects, you can refer to the [Passkeys Documentation](https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API#passkeys). + -::: + + - - - -```tsx title="app/add-passkey.tsx" +```tsx app/add-passkey.tsx // ... previous code export default function AddPasskey() { @@ -283,11 +246,9 @@ export default function AddPasskey() { return (/* ... */); } ``` - - - - -```typescript title="src/add-passkey.ts" + + +```ts src/add-passkey.ts // ... previous code // We'll pass the user object returned from `getUser` to this function @@ -309,62 +270,56 @@ const createNewPasskey = async (user: User) => { return credential; }; ``` - - + ### Add the credential to the wallet -Now that you have created a new user passkey credential, we'll use this credential to create a new passkey authenticator for the user. -We'll need the userId to create the authenticator, so we'll get the current user first. This value comes from local storage which was -set in the previous step when the user successfully authenticated via the `login` function. +Now that you have created a new user passkey credential, we'll use this credential to create a new passkey authenticator for the user. We'll need the userId to create the authenticator, so we'll get the current user first. This value comes from local storage which was set in the previous step when the user successfully authenticated via the `login` function. - - - -```tsx title="app/add-passkey.tsx" -// ... previous code - -export default function AddPasskey() { - const { passkeyClient, turnkey } = useTurnkey(); + + + ```tsx app/add-passkey.tsx // ... previous code - const addPasskey = async () => { - const user = await getUser(); - const credential = await createNewPasskey(user); - - const authenticatorsResponse = await passkeyClient.createAuthenticators({ - authenticators: [ - { - authenticatorName: "New Passkey Authenticator", - challenge: credential.encodedChallenge, - attestation: credential.attestation, - }, - ], - userId: user.userId, - }); - - // Check if the authenticator was created successfully - if (authenticatorsResponse?.activity.id) { - console.log("Authenticator created successfully"); - } - }; - - return ( -
- {/* Add a button to add the passkey to the wallet */} - - -
- ); -} -``` - -
- Complete add-passkey.tsx component - -```tsx title="app/add-passkey.tsx" + export default function AddPasskey() { + const { passkeyClient, turnkey } = useTurnkey(); + + // ... previous code + + const addPasskey = async () => { + const user = await getUser(); + const credential = await createNewPasskey(user); + + const authenticatorsResponse = await passkeyClient.createAuthenticators({ + authenticators: [ + { + authenticatorName: "New Passkey Authenticator", + challenge: credential.encodedChallenge, + attestation: credential.attestation, + }, + ], + userId: user.userId, + }); + + // Check if the authenticator was created successfully + if (authenticatorsResponse?.activity.id) { + console.log("Authenticator created successfully"); + } + }; + + return ( +
+ {/* Add a button to add the passkey to the wallet */} + + +
+ ); + } + ``` + + ```tsx app/add-passkey.tsx "use client"; import { useState } from "react"; @@ -433,14 +388,12 @@ export default function AddPasskey() { ); } -``` + ``` + + + -
- -
- - -```typescript title="src/add-passkey.ts" +```ts src/add-passkey.ts // ... previous code const addPasskey = async () => { @@ -470,14 +423,12 @@ const addPasskey = async () => { } }; ``` - - +
### Optional: Read/Write Sessions -In some cases, you may want to create a read/write session for the user to reduce the number of passkey prompts. -This session can be used instead of the passkey to sign requests to Turnkey's API to improve the user experience. +In some cases, you may want to create a read/write session for the user to reduce the number of passkey prompts. This session can be used instead of the passkey to sign requests to Turnkey's API to improve the user experience. In the this tutorial we used the passkey to authenticate the request to create a new authenticator. The result is that the user will be prompted 3 times: @@ -492,7 +443,7 @@ By creating a read/write session, we can reduce the number of passkey prompts to To create a read/write session, we simply replace `passkeyClient.login()` with `passkeyClient.loginWithReadwriteSession()`: -```typescript title="src/add-passkey.ts" +```ts src/add-passkey.ts // ... previous code const login = async () => { @@ -501,16 +452,14 @@ const login = async () => { }; ``` -Assuming the login is successful, a read/write session object will be stored in local storage. -We'll use the stored session in conjunction with the iframe client to authenticate the create authenticator request. +Assuming the login is successful, a read/write session object will be stored in local storage. We'll use the stored session in conjunction with the iframe client to authenticate the create authenticator request. - - + + -We'll use the active client returned from the `useTurnkey` hook which will be initialized with the read/write session. -The rest of the code remains the same. +We'll use the active client returned from the `useTurnkey` hook which will be initialized with the read/write session. The rest of the code remains the same. -```tsx title="app/add-passkey.tsx" +```tsx app/add-passkey.tsx // ... previous code export default function AddPasskey() { @@ -536,15 +485,14 @@ export default function AddPasskey() { return (/* ... */); } ``` - - - + + ##### 1. Initialize the iframe client We'll create a new function to initialize the iframe client and inject the read/write session. -```typescript title="src/add-passkey.ts" +```ts src/add-passkey.ts // ... previous code const getIframeClient = async () => { @@ -566,21 +514,19 @@ const getIframeClient = async () => { }; ``` -:::note - -When using the TypeScript SDK, you'll need to ensure that the HTML element exists somewhere in the rendered DOM. + + When using the TypeScript SDK, you'll need to ensure that the HTML element exists somewhere in the rendered DOM. -```html -
-``` - -::: + ``` +
+ ``` + ##### 2. Update the `addPasskey` function We'll update the `addPasskey` function to use the iframe client to authenticate the request to create a new authenticator. -```typescript title="src/add-passkey.ts" +```ts src/add-passkey.ts // ... previous code const addPasskey = async () => { @@ -594,15 +540,11 @@ const addPasskey = async () => { // ... rest of the code remains the same }; ``` - - + ## Conclusion -In this guide, we've walked through the process of adding a new credential to an existing wallet using the Turnkey SDK. -By following these steps, you can improve the usability of your application by allowing users to create multiple authentication methods. -This flexibility enables users to add a hardware security device like a Yubikey, or a native passkey via providers like iCloud keychain or 1Password, -enhancing their overall experience with your application. +In this guide, we've walked through the process of adding a new credential to an existing wallet using the Turnkey SDK. By following these steps, you can improve the usability of your application by allowing users to create multiple authentication methods. This flexibility enables users to add a hardware security device like a Yubikey, or a native passkey via providers like iCloud keychain or 1Password, enhancing their overall experience with your application. For a complete example, check out our [demo embedded wallet](https://github.com/tkhq/demo-embedded-wallet/blob/main/src/components/add-passkey.tsx). diff --git a/docs/solutions/embedded-wallets/code-examples/authenticate-user-email.mdx b/embedded-wallets/code-examples/authenticate-user-email.mdx similarity index 77% rename from docs/solutions/embedded-wallets/code-examples/authenticate-user-email.mdx rename to embedded-wallets/code-examples/authenticate-user-email.mdx index e4e71afd..021c1c8b 100644 --- a/docs/solutions/embedded-wallets/code-examples/authenticate-user-email.mdx +++ b/embedded-wallets/code-examples/authenticate-user-email.mdx @@ -1,17 +1,12 @@ --- title: "Authenticate a User with Email" -sidebar_position: 4 -description: Authenticate a User with a Email -slug: /embedded-wallets/code-examples/authenticate-user-email +mode: wide --- -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import Parameter from "@site/src/components/parameter"; + + -#### 1. Initialize Turnkey - -```typescript +```JavaScript import { Turnkey } from "@turnkey/sdk-browser"; const turnkey = new Turnkey({ @@ -19,12 +14,13 @@ const turnkey = new Turnkey({ defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, }); ``` + -#### 2. Initialize the Iframe Client + Note that the iframe client must be initialized with the dom element where the iframe will be injected. If you are using the [react-sdk](/sdks/react) you can import the `iframeClient` from the `useTurnkey()` hook without this step and the iframe dom element will be managed for you. Note that the `iframeClient` must be initialized before calling `emailAuth` because you need the `iframePublicKey` as a parameter to the `emailAuth` call. -```typescript +```JavaScript import { Turnkey, TurnkeySDKBrowserConfig } from "@turnkey/sdk-browser"; const turnkeyConfig: TurnkeySDKBrowserConfig = {...}; @@ -37,10 +33,11 @@ const iframeContainerId = "turnkey-auth-iframe-container-id"; const iframeClient = await turnkey.iframeClient(document.getElementById(iframeContainerId)) ``` + -#### 3. Call `emailAuth` from your backend + -```typescript +```JavaScript await turnkey.serverSign( "emailAuth", [{ @@ -53,7 +50,7 @@ await turnkey.serverSign( If you need to lookup the user `subOrganizationId` by email, you can call the `getSubOrgIds` method with the `filterType` parameter set to `"EMAIL"` -```typescript +```JavaScript const subOrgIds = await turnkey.serverSign( "getSubOrgIds", [{ @@ -64,10 +61,11 @@ const subOrgIds = await turnkey.serverSign( const userSubOrganizationId = subOrgIds.organizationIds[0]; ``` + -#### 4. Inject the emailed `credentialBundle` into the iframe to authenticate the user + -```typescript +```JavaScript const authenticationResponse = await iframeClient.injectCredentialBundle(credentialBundle); if (authenticationResponse) { @@ -80,20 +78,27 @@ if (authenticationResponse) { } ``` -#### 5. Make read requests on behalf of the authenticated user from the `currentUserSession` + + + -```typescript +```JavaScript const currentUserSession = await turnkey.currentUserSession(); const walletsResponse = await currentUserSession.getWallets(); const walletName = walletsResponse.wallets[0].walletName; ``` -#### 6. Call the `iframeClient` directly for write requests + -```typescript + + +```JavaScript import { DEFAULT_ETHEREUM_ACCOUNTS } from "@turnkey/sdk-browser"; const newWalletResponse = await iframeClient.createWallet({ walletName: "New Wallet for User", accounts: DEFAULT_ETHEREUM_ACCOUNTS, }); ``` + + + diff --git a/docs/solutions/embedded-wallets/code-examples/authenticate-user-passkey.mdx b/embedded-wallets/code-examples/authenticate-user-passkey.mdx similarity index 63% rename from docs/solutions/embedded-wallets/code-examples/authenticate-user-passkey.mdx rename to embedded-wallets/code-examples/authenticate-user-passkey.mdx index 59a2cf51..1c80f48c 100644 --- a/docs/solutions/embedded-wallets/code-examples/authenticate-user-passkey.mdx +++ b/embedded-wallets/code-examples/authenticate-user-passkey.mdx @@ -1,17 +1,11 @@ --- title: "Authenticate a User with a Passkey Credential" -sidebar_position: 2 -description: Authenticate a User with a Passkey Credential -slug: /embedded-wallets/code-examples/authenticate-user-passkey +mode: wide --- -import Tabs from "@theme/Tabs"; -import TabItem from "@theme/TabItem"; -import Parameter from "@site/src/components/parameter"; - -#### 1. Initialize the Passkey Client - -```typescript + + +```tsx import { Turnkey } from "@turnkey/sdk-browser"; const turnkey = new Turnkey({ @@ -20,10 +14,10 @@ const turnkey = new Turnkey({ }); const passkeyClient = turnkey.passkeyClient(); ``` + -#### 2. Call the `login` function - -```typescript + +```tsx const response = await passkeyClient.login(); if (response.organizationId) { navigate("/authenticated-route"); @@ -31,23 +25,27 @@ if (response.organizationId) { navigate("/not-authenticated-route"); } ``` + -#### 3. Make read requests on behalf of the authenticated user from the `currentUserSession` + -```typescript +```tsx const currentUserSession = await turnkey.currentUserSession(); const walletsResponse = await currentUserSession.getWallets(); const walletName = walletsResponse.wallets[0].walletName; ``` + -#### 4. Call the `passkeyClient` directly for write requests + This will always prompt a user to confirm the action with their passkey credential -```typescript +```tsx import { DEFAULT_ETHEREUM_ACCOUNTS } from "@turnkey/sdk-browser"; const newWalletResponse = await passkeyClient.createWallet({ walletName: "New Wallet for User", accounts: DEFAULT_ETHEREUM_ACCOUNTS, }); ``` + + diff --git a/docs/solutions/embedded-wallets/code-examples/create-passkey-session.mdx b/embedded-wallets/code-examples/create-passkey-session.mdx similarity index 70% rename from docs/solutions/embedded-wallets/code-examples/create-passkey-session.mdx rename to embedded-wallets/code-examples/create-passkey-session.mdx index 234369b0..c769205b 100644 --- a/docs/solutions/embedded-wallets/code-examples/create-passkey-session.mdx +++ b/embedded-wallets/code-examples/create-passkey-session.mdx @@ -1,21 +1,18 @@ --- title: "Create a User Passkey Session" -sidebar_position: 3 -description: Create a User Passkey Session -slug: /embedded-wallets/code-examples/create-passkey-session +description: "A passkey session is an expiring session enabled by an initial passkey authentication. You could think of this as a "lightning mode" of sorts: creating a passkey session allows users to authenticate subsequent requests touch-free. Under the hood, this is powered by our [iframeStamper](/sdks/advanced/iframe-stamper). These sessions are enabled by creating a short-lived embedded API key in the browser, and encrypting it to our [auth iframe](https://github.com/tkhq/frames/blob/main/auth/index.html). This is largely similar to our [Email Auth setup](/authentication/email)." --- -A passkey session is an expiring session enabled by an initial passkey authentication. You could think of this as a "lightning mode" of sorts: creating a passkey session allows users to authenticate subsequent requests touch-free. Under the hood, this is powered by our [iframeStamper](../../../sdks/advanced/iframe-stamper). These sessions are enabled by creating a short-lived embedded API key in the browser, and encrypting it to our [auth iframe](https://github.com/tkhq/frames/blob/main/auth/index.html). This is largely similar to our [Email Auth setup](/authentication/email). - By calling `createPasskeySession()`, the SDK stores the resulting auth bundle in local storage for later retrieval, and also returns it to the caller. If you don't want to rely on `getActiveClient()` (a helper method within `@turnkey/sdk-react` to retrieve active Turnkey clients) and instead want to manage the stampers yourself, you can inject the auth bundle into the iframe — see the [code](https://github.com/tkhq/sdk/blob/b04de6258b2617b4c303c2b9797d4b30322461a3/packages/sdk-react/src/contexts/TurnkeyContext.tsx#L47-L74) for specifics. ## Steps using `@turnkey/sdk-react` -This process is made the most seamless by leveraging our [React package](../../../sdks/react). Read on for a non-React implementation. +This process is made the most seamless by leveraging our [React package](/sdks/react). Read on for a non-React implementation. -#### 1. Initialize the React Provider + + -```typescript +```js import { TurnkeyProvider } from "@turnkey/sdk-react"; const turnkeyConfig = { apiBaseUrl: "https://api.turnkey.com", @@ -32,23 +29,25 @@ const turnkeyConfig = {
``` + -#### 2. Call the `createPasskeySession` function + -```typescript +```js import { useTurnkey } from "@turnkey/sdk-react"; const { turnkey, passkeyClient, authIframeClient } = useTurnkey(); const currentUser = await turnkey?.getCurrentUser(); // this assumes the user has already logged in via passkeyClient?.login()`} const authBundle = await passkeyClient?.createPasskeySession( currentUser?.userId!, authIframeClient?.iframePublicKey!, - "900" // seconds. 900 == 15 minutes, but can be configured to any value + "900", // seconds. 900 == 15 minutes, but can be configured to any value ); ``` + -#### 3. Use the passkey session for read and write requests + -```typescript +```js const { getActiveClient } = useTurnkey(); const currentClient = await getActiveClient(); // make arbitrary requests @@ -56,12 +55,15 @@ const whoami = await currentClient.getWhoami({ organizationId: }) ``` Note: `getActiveClient()` is a helper method designed to abstract away the need to check if a passkey session is still valid. If it has expired, this will default to the `passkeyClient`, in which case users will sign each request using their passkey. + + ## Alternative Steps (non-React) -#### 1. Initialize the Passkey Client + + -```typescript +```js import { Turnkey } from "@turnkey/sdk-browser"; const turnkey = new Turnkey({ apiBaseUrl: "https://api.turnkey.com", @@ -69,10 +71,11 @@ const turnkey = new Turnkey({ }); const passkeyClient = turnkey.passkeyClient(); ``` + -#### 2. Call the `createPasskeySession` function + -```typescript +```js const currentUser = await turnkey.getCurrentUser(); // this assumes the user has already logged in via passkeyClient.login()`} const authIframeClient = await turnkey.iframeClient({ iframeContainer: document.getElementById(" diff --git a/docs/documentation/security/Secure-enclaves.md b/security/secure-enclaves.mdx similarity index 56% rename from docs/documentation/security/Secure-enclaves.md rename to security/secure-enclaves.mdx index 7b4c3ecf..c7fa14b8 100644 --- a/docs/documentation/security/Secure-enclaves.md +++ b/security/secure-enclaves.mdx @@ -1,25 +1,17 @@ --- -description: Overview of secure enclaves and how we use them -slug: /security/secure-enclaves -sidebar_position: 3 +title: "Secure Enclaves" +description: "A core security anchor at Turnkey is the ability to prove to ourselves and our users that all systems within secure enclaves are running exactly the software we expect at any given time. To accomplish this, all security-critical Turnkey services, which perform actions including key generation, signing, and our policy engine, are deployed in secure enclaves." +mode: wide --- -# Secure enclaves - -A core security anchor at Turnkey is the ability to prove to ourselves and our users that all systems within secure enclaves are running exactly the software we expect at any given time. To accomplish this, all security-critical Turnkey services, which perform actions including key generation, signing, and our policy engine, are deployed in secure enclaves. - Secure enclaves, also called Trusted Execution Environments, are highly constrained compute environments that support cryptographic attestation to verify the enclave’s identity and ensure that only authorized code is running. These enclaves operate in hardware-enforced isolation –– they have no persistent storage, no interactive access, and no external networking. The following outlines the structure of a single enclave application: -

- secure-enclaves -

+ + Secure enclaves + -In this diagram _Host_ represents a standard AWS virtual machine. We run a basic application that receives traffic from the network and calls into the enclave. This creates a layer of insulation from our most secure environment and offers a convenient place to gather metrics and other operational information about the enclaves. +In this diagram *Host* represents a standard AWS virtual machine. We run a basic application that receives traffic from the network and calls into the enclave. This creates a layer of insulation from our most secure environment and offers a convenient place to gather metrics and other operational information about the enclaves. -_Enclave_ represents a machine with no external connectivity. The only connection it can have is a virtual serial connection to the host and its own secure co-processor. In AWS this is called the Nitro Security Module (NSM). This runs an instance of Turnkey’s enclave operating system, QuorumOS (QOS), and a secure application running on top of QOS. +*Enclave* represents a machine with no external connectivity. The only connection it can have is a virtual serial connection to the host and its own secure co-processor. In AWS this is called the Nitro Security Module (NSM). This runs an instance of Turnkey’s enclave operating system, QuorumOS (QOS), and a secure application running on top of QOS. diff --git a/security/verifiable-data.mdx b/security/verifiable-data.mdx new file mode 100644 index 00000000..bfe6daa2 --- /dev/null +++ b/security/verifiable-data.mdx @@ -0,0 +1,13 @@ +--- +title: "Verifiable Data" +description: "Enclave applications in Turnkey’s infrastructure are stateless meaning, there is no persistent data held behind the enclave boundary. Instead, data is held in a PostgreSQL instance in our primary AWS account. Before any enclave applications operate on the data in a Turnkey account, it first verifies that that data has been recently notarized by Turnkey’s notarizer. A recent stamp could be the result of an update or initiated by the heartbeat service." +mode: wide +--- + +By verifying the authenticity of data using cryptographic signatures (no passwords!) and timestamping, we enable zero-risk data sharing between these apps and block man-in-the-middle or downgrade attacks. The combination of these features results in a system and an audit trail that is verifiable end-to-end. + +The entire Turnkey architecture including this verifiable data flow is described below: + + + Turnkey architecture + diff --git a/security/whitepaper.mdx b/security/whitepaper.mdx new file mode 100644 index 00000000..f791135f --- /dev/null +++ b/security/whitepaper.mdx @@ -0,0 +1,7 @@ +--- +title: "The Turnkey Whitepaper" +description: "We have published an in-depth whitepaper describing the principles with which we've built Turnkey and explaining in great detail the infrastructure foundations as well as the system architecture underpinning our product." +mode: wide +--- + +Our whitepaper is available online at **[whitepaper.turnkey.com](https://whitepaper.turnkey.com)**. diff --git a/sidebars.js b/sidebars.js deleted file mode 100644 index 1688dac4..00000000 --- a/sidebars.js +++ /dev/null @@ -1,42 +0,0 @@ -/** - * Creating a sidebar enables you to: - - create an ordered group of docs - - render a sidebar for each doc of that group - - provide next/previous navigation - - The sidebars can be generated from the filesystem, or explicitly defined here. - - Create as many sidebars as you want. - */ - -// @ts-check - -/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ -const sidebars = { - // Autogenerate sidebars for each documentation section - sdksSidebar: [ - { - type: "autogenerated", - dirName: "sdks", - }, - ], - solutionsSidebar: [ - { - type: "autogenerated", - dirName: "solutions", - }, - ], - documentationSidebar: [ - { - type: "doc", - id: "welcome", - label: "Welcome", - }, - { - type: "autogenerated", - dirName: "documentation", - }, - ], -}; - -module.exports = sidebars; diff --git a/signing-automation/code-examples/signing-transactions.mdx b/signing-automation/code-examples/signing-transactions.mdx new file mode 100644 index 00000000..0fbca2a7 --- /dev/null +++ b/signing-automation/code-examples/signing-transactions.mdx @@ -0,0 +1,49 @@ +--- +title: "Signing Transactions" +description: "This is a guide to signing transactions in a server context. While these snippets leverage Ethers, it can be swapped out for other signers in the Viem or Solana contexts. An example for Ethers can be found , and for Viem in the server context. A similar example with Solana can be found ." +mode: wide +--- + + + + +```ts +import { Turnkey } from "@turnkey/sdk-browser"; + +const turnkeyClient = new Turnkey({ + apiBaseUrl: "https://api.turnkey.com", + defaultOrganizationId: process.env.TURNKEY_ORGANIZATION_ID, + apiPrivateKey: process.env.API_PRIVATE_KEY, + apiPublicKey: process.env.API_PUBLIC_KEY, +}); +``` + + + + +```ts +import { ethers } from "ethers"; +import { TurnkeySigner } from "@turnkey/ethers"; + +const provider = new ethers.JsonRpcProvider(); +const turnkeySigner = new TurnkeySigner({ + client: turnkeyClient.apiClient(), + organizationId: process.env.ORGANIZATION_ID!, + signWith: process.env.SIGN_WITH!, + }); +``` + + + + +```ts +const transactionRequest = { + to: "", + value: ethers.parseEther(""), + type: 2, +}; +const sendTransaction = + await connectedSigner.sendTransaction(transactionRequest); +``` + + diff --git a/docs/solutions/signing-automation/overview.md b/signing-automation/overview.mdx similarity index 79% rename from docs/solutions/signing-automation/overview.md rename to signing-automation/overview.mdx index 1a12c419..d38fc2f0 100644 --- a/docs/solutions/signing-automation/overview.md +++ b/signing-automation/overview.mdx @@ -1,12 +1,8 @@ --- -sidebar_position: 1 -description: Intro to signing automation on Turnkey -slug: /signing-automation/overview -sidebar_label: Introduction +title: "Signing Automation" +sidebarTitle: "Introduction" --- -# Signing Automation - ## Securely automate any signing workflow Turnkey empowers teams to automate complex signing workflows at scale without compromising on security or flexibility. Our API and policy engine provide the building blocks for creating custom automation solutions that fit your specific needs, from smart contract interactions to staking management. @@ -15,11 +11,11 @@ Turnkey empowers teams to automate complex signing workflows at scale without co Turnkey's secure, flexible, and scalable private key infrastructure is built on a custom secure-enclave-based architecture, ensuring the highest level of protection for your automated signing workflows. With Turnkey, you can: -- Automate millions of signatures with customizable security controls -- Implement role-based access controls and multi-party approvals -- Support any blockchain or asset type with our chain-agnostic, arbitrary signing capabilities -- Minimize attack surface area with our paranoid security model -- Easily migrate existing wallets and keys in and out of Turnkey +* Automate millions of signatures with customizable security controls +* Implement role-based access controls and multi-party approvals +* Support any blockchain or asset type with our chain-agnostic, arbitrary signing capabilities +* Minimize attack surface area with our paranoid security model +* Easily migrate existing wallets and keys in and out of Turnkey ### Code examples @@ -38,6 +34,6 @@ Explore the following code examples to see Turnkey's server-side signing automat Staking teams can use Turnkey to streamline their operations and secure their keys. Automate critical workflows like: -- Mnemonic and key generation -- Rewards claiming and distribution -- Network voting and governance actions +* Mnemonic and key generation +* Rewards claiming and distribution +* Network voting and governance actions diff --git a/src/components/BugcrowdForm.js b/src/components/BugcrowdForm.js deleted file mode 100644 index 5bcc8998..00000000 --- a/src/components/BugcrowdForm.js +++ /dev/null @@ -1,30 +0,0 @@ -import React, { useEffect } from "react"; - -function BugcrowdForm() { - useEffect(() => { - const script = document.createElement("script"); - script.src = - "https://bugcrowd.com/a9e1eca7-990e-4602-bf6d-a9f70df1c2fa/external/script"; - script.async = true; - script.setAttribute( - "data-bugcrowd-program", - "https://bugcrowd.com/a9e1eca7-990e-4602-bf6d-a9f70df1c2fa/external/report", - ); - - // Find the container and append the script there - const container = document.getElementById("bugcrowd-form-container"); - if (container) { - container.appendChild(script); - } - - return () => { - if (container) { - container.removeChild(script); - } - }; - }, []); - - return
; -} - -export default BugcrowdForm; diff --git a/src/components/Dropdown.tsx b/src/components/Dropdown.tsx deleted file mode 100644 index 009b8cb4..00000000 --- a/src/components/Dropdown.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React, { useState } from "react"; -import "./dropdown.css"; - -interface DropdownProps { - title: string; - children: React.ReactNode; - className?: string; -} - -export const Dropdown = ({ - title, - children, - className = "", -}: DropdownProps) => { - const [isOpen, setIsOpen] = useState(false); - - return ( -
- - {isOpen &&
{children}
} -
- ); -}; diff --git a/src/components/HomepageFeatures/.index.tsx.swp b/src/components/HomepageFeatures/.index.tsx.swp deleted file mode 100644 index b3700986..00000000 Binary files a/src/components/HomepageFeatures/.index.tsx.swp and /dev/null differ diff --git a/src/components/HomepageFeatures/index.tsx b/src/components/HomepageFeatures/index.tsx deleted file mode 100644 index ee86e919..00000000 --- a/src/components/HomepageFeatures/index.tsx +++ /dev/null @@ -1,70 +0,0 @@ -import React from "react"; -import clsx from "clsx"; -import styles from "./styles.module.css"; - -type FeatureItem = { - title: string; - Svg: React.ComponentType>; - description: JSX.Element; -}; - -const FeatureList: FeatureItem[] = [ - { - title: "Easy to Use", - Svg: require("@site/static/img/undraw_docusaurus_mountain.svg").default, - description: ( - <> - Docusaurus was designed from the ground up to be easily installed and - used to get your website up and running quickly. - - ), - }, - { - title: "Focus on What Matters", - Svg: require("@site/static/img/undraw_docusaurus_tree.svg").default, - description: ( - <> - Docusaurus lets you focus on your docs, and we'll do the chores. Go - ahead and move your docs into the docs directory. - - ), - }, - { - title: "Powered by React", - Svg: require("@site/static/img/undraw_docusaurus_react.svg").default, - description: ( - <> - Extend or customize your website layout by reusing React. Docusaurus can - be extended while reusing the same header and footer. - - ), - }, -]; - -function Feature({ title, Svg, description }: FeatureItem) { - return ( -
-
- -
-
-

{title}

-

{description}

-
-
- ); -} - -export default function HomepageFeatures(): JSX.Element { - return ( -
-
-
- {FeatureList.map((props, idx) => ( - - ))} -
-
-
- ); -} diff --git a/src/components/HomepageFeatures/styles.module.css b/src/components/HomepageFeatures/styles.module.css deleted file mode 100644 index b248eb2e..00000000 --- a/src/components/HomepageFeatures/styles.module.css +++ /dev/null @@ -1,11 +0,0 @@ -.features { - display: flex; - align-items: center; - padding: 2rem 0; - width: 100%; -} - -.featureSvg { - height: 200px; - width: 200px; -} diff --git a/src/components/card-link/card-link.css b/src/components/card-link/card-link.css deleted file mode 100644 index cffae7c8..00000000 --- a/src/components/card-link/card-link.css +++ /dev/null @@ -1,38 +0,0 @@ -.card-link { - display: block; - padding: 1rem; - background-color: #1a1a1a; - color: white; - border-radius: 0.5rem; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - transition: background-color 0.3s; - text-decoration: none; - border: 1px solid var(--tk-border-gray-100); -} - -.card-link:hover { - background-color: #333; - color: unset; - text-decoration: none; -} - -.card-link-header { - display: flex; - align-items: center; - margin-bottom: 0.5rem; -} - -.card-link-icon { - margin-right: 0.5rem; - display: flex; -} - -.card-link-title { - font-size: 1.125rem; - font-weight: 600; -} - -.card-link-content { - font-size: 0.875rem; - color: #b3b3b3; -} diff --git a/src/components/card-link/card-link.tsx b/src/components/card-link/card-link.tsx deleted file mode 100644 index 26eb5cd3..00000000 --- a/src/components/card-link/card-link.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; -import "./card-link.css"; - -interface CardLinkProps { - icon: React.ReactNode; - title: string; - href: string; - children: React.ReactNode; -} - -export const CardLink: React.FC = ({ - icon, - title, - href, - children, -}) => ( - -
-
{icon}
-
{title}
-
-
{children}
-
-); - -export const CardLinkContent: React.FC<{ children: React.ReactNode }> = ({ - children, -}) =>
{children}
; diff --git a/src/components/card-link/index.tsx b/src/components/card-link/index.tsx deleted file mode 100644 index af4efecf..00000000 --- a/src/components/card-link/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { CardLink, CardLinkContent } from "./card-link"; diff --git a/src/components/dropdown.css b/src/components/dropdown.css deleted file mode 100644 index 14ea0e45..00000000 --- a/src/components/dropdown.css +++ /dev/null @@ -1,49 +0,0 @@ -.dropdown { - width: 100%; - display: flex; - flex-direction: column; - margin: 0 0 var(--ifm-paragraph-margin-bottom); -} - -.dropdown-trigger { - cursor: pointer; - display: flex; - align-items: center; - gap: 0.5rem; - width: 100%; - text-align: left; - background: none; - border: none; - font-size: 1rem; - font-weight: 600; - color: inherit; - cursor: pointer; - padding: 0.5rem 0; -} - -.dropdown-arrow { - display: inline-block; - transition: transform 0.2s ease; - font-size: 0.75rem; -} - -.dropdown-trigger.open .dropdown-arrow { - transform: rotate(90deg); -} - -.dropdown-content { - display: flex; - flex-direction: column; -} - -/* Style for feature links */ -.dropdown-content a { - display: block; - /* color: var(--ifm-color-gray-400); */ - /* text-decoration: none; */ - transition: opacity 0.2s ease; -} - -.dropdown-content a:hover { - opacity: 0.8; -} diff --git a/src/components/icons.tsx b/src/components/icons.tsx deleted file mode 100644 index 5c1d4455..00000000 --- a/src/components/icons.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import React from "react"; - -export const CheckmarkCircleIcon = () => ( - - - - - - - - - - -); diff --git a/src/components/parameter.js b/src/components/parameter.js deleted file mode 100644 index 4a135835..00000000 --- a/src/components/parameter.js +++ /dev/null @@ -1,83 +0,0 @@ -import React from "react"; - -export default function Parameter({ - children, - param, - isRequired, - style, - note, -}) { - return ( -
-
- - - {param.name} - - - {param.type.link ? ( - - - {param.type.name} - - - ) : ( - - {param.type.name} - - )} - - {isRequired && ( - - required - - )} - {param?.type?.note && ( -
- {param?.type?.note} -
- )} -
-

- {children} -

-
- ); -} diff --git a/src/components/step.tsx b/src/components/step.tsx deleted file mode 100644 index 4adf8791..00000000 --- a/src/components/step.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import React from "react"; -import "./steps.css"; - -export const Step = ({ ...props }: React.ComponentProps<"h3">) => ( -

-); - -export const Steps = ({ ...props }) => ( -
-); diff --git a/src/components/steps.css b/src/components/steps.css deleted file mode 100644 index d2488482..00000000 --- a/src/components/steps.css +++ /dev/null @@ -1,38 +0,0 @@ -.steps > h3 { - counter-increment: step; -} - -.mdx > .steps:first-child > h3:first-child { - margin-top: 0; -} - -.steps > h3 { - counter-increment: step; - margin-top: 2rem; - margin-bottom: 1rem; - font-size: 1.125rem; - font-weight: 600; -} - -.steps { - counter-reset: step; -} - -.steps > h3::before { - margin-right: 0.5rem; - position: absolute; - display: flex; - height: 2.125rem; - width: 2.125rem; - align-items: center; - justify-content: center; - border-radius: 100%; - background-color: var(--tk-step-background); - text-align: center; - font-size: 1rem; - line-height: 1.5rem; - font-weight: 600; - margin-left: -50px; - margin-top: -4px; - content: counter(step); -} diff --git a/src/components/table/table.css b/src/components/table/table.css deleted file mode 100644 index 0326d2bc..00000000 --- a/src/components/table/table.css +++ /dev/null @@ -1,108 +0,0 @@ -.table-wrapper { - border: 1px solid var(--tk-border-gray-100); - display: flex; - flex-direction: column; -} - -.table-wrapper.server { - border: 1px solid var(--tk-border-gray-100); - display: flex; - flex-direction: column; - width: fit-content; -} - -.column-headings { - display: flex; - background-color: rgba(218, 221, 225, 0.3); - min-height: 3rem; -} - -.column-headings > .column-heading { - width: 7rem; - min-height: 3rem; - border-right: 1px solid var(--tk-border-gray-100); - display: flex; - align-items: center; - justify-content: center; -} - -.column-headings > .column-heading:first-child { - border-right: none; - width: 10rem; -} - -.column-headings > .column-heading.server:nth-child(2) { - border-left: 1px solid var(--tk-border-gray-100); -} - -.column-headings > .column-heading.client:nth-child(2) { - width: 10rem; -} - -.column-headings > .column-heading:last-child { - border-right: none; -} - -.table-row { - display: flex; - align-items: center; - border-bottom: 1px solid var(--tk-border-gray-100); -} - -.table-row:nth-of-type(odd) { - background-color: rgba(218, 221, 225, 0.3); -} - -.table-row > .table-cell { - width: 7rem; - text-align: left; - align-content: center; - min-height: 3rem; - border-right: 1px solid var(--tk-border-gray-100); -} - -.table-row > .table-cell.client:first-child { - padding-left: 0.5rem; - width: 10rem; - font-weight: 700; - border: none; -} - -.table-row > .table-cell.server:first-child { - padding-left: 0.5rem; - width: 10rem; - font-weight: 700; - border: none; -} - -.table-row > .table-cell.client:nth-child(2) { - padding-left: 0.5rem; - width: 10rem; - border-left: 1px solid var(--tk-border-gray-100); -} - -.table-row > .table-cell.server:nth-child(2) { - padding-left: 0.5rem; - width: 7rem; - border-left: 1px solid var(--tk-border-gray-100); -} - -.table-row > .table-cell.client:nth-child(n + 3) { - display: flex; - justify-content: center; - align-items: center; -} - -.table-row > .table-cell.server:nth-child(n + 2) { - display: flex; - justify-content: center; - align-items: center; -} - -.table-row > .table-cell:last-child { - border-right: none; -} - -.bold { - font-weight: 700; -} diff --git a/src/components/table/table.js b/src/components/table/table.js deleted file mode 100644 index 0a0755d5..00000000 --- a/src/components/table/table.js +++ /dev/null @@ -1,35 +0,0 @@ -import React from "react"; -import "./table.css"; - -export default function Table({ referenceType, columnHeadings, tableRows }) { - return ( -
-
- {columnHeadings.map((heading, headingIndex) => { - return ( -
- {heading?.text} -
- ); - })} -
- - {tableRows.map((tableRow, tableRowIndex) => { - return ( -
- {tableRow.map((row, rowIndex) => { - return ( -
- {row} -
- ); - })} -
- ); - })} -
- ); -} diff --git a/src/css/custom.css b/src/css/custom.css deleted file mode 100644 index d82adf6b..00000000 --- a/src/css/custom.css +++ /dev/null @@ -1,163 +0,0 @@ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - --ifm-color-primary: #4c48ff; - --ifm-color-primary-dark: #4c48ff; - --ifm-color-primary-darker: #4c48ff; - --ifm-color-primary-darkest: #4c48ff; - --ifm-color-primary-light: #d1cff1; - --ifm-color-primary-lighter: #d1cff1; - --ifm-color-primary-lightest: #d1cff1; - --ifm-code-font-size: 85%; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.1); - - --tk-bg-danger-background: hsla(0, 93%, 94%, 0.5); - --tk-text-danger: rgb(220 38 38); - --tk-border-gray-100: rgb(226 226 226); - --biel-primary-color: #050a0b; - - --tk-step-background: rgb(244 244 245); -} - -/* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme="dark"] { - --ifm-color-primary: #10d7b4; - --ifm-color-primary-dark: #10d7b4; - --ifm-color-primary-darker: #10d7b4; - --ifm-color-primary-darkest: #10d7b4; - --ifm-color-primary-light: #10d7b4; - --ifm-color-primary-lighter: #10d7b4; - --ifm-color-primary-lightest: #10d7b4; - --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); - - --tk-bg-danger-background: hsl(0deg 100% 9.99% / 75%); - --tk-text-danger: rgb(252 165 165); - --tk-border-gray-100: rgb(55, 55, 55); - --biel-primary-color: #ffffff; - --biel-button-dark-text-color: #050a0b; - --biel-message-user-text-color: #050a0b; - - --tk-step-background: rgb(47 47 50); -} -.navbar__link:after { - display: none !important; -} -.token.property { - color: #4c48ff !important; -} - -body { - font-size: 0.9em; -} - -h1 { - font-size: 2.5em; -} - -h2 { - font-size: 1.7em; -} - -h3 { - font-size: 1.5em; -} - -h4 { - font-size: 1.3em; -} - -h5 { - font-size: 1.1em; -} - -h6 { - font-size: 0.95em; -} - -.menu__link:hover { - background-color: #efefff; - color: var(--ifm-color-primary); -} - -.menu__link--active:hover { - background-color: #efefff; - color: var(--ifm-color-primary); -} -.menu__link--active { - background-color: #efefff !important; - color: var(--ifm-color-primary); -} - -.sidebar .menu__link { - color: #050a0b; -} - -.overview-buttons { - display: flex; - flex-wrap: wrap; - gap: 20px; /* Adjust the gap between buttons as needed */ - justify-content: center; /* Center the buttons container */ - margin-top: 20px; /* Add some space above the buttons container */ -} - -.overview-button { - display: flex; - flex-direction: column; /* Stack icon and text vertically */ - align-items: flex-start; - justify-content: center; /* Center items vertically for a square appearance */ - width: 275px; /* Fixed width for square and equal size */ - height: 185px; /* Fixed height for square shape */ - background-color: #ffffff; /* Button background color */ - border: 1px solid #d9d9d9; /* Button border */ - border-radius: 12px; /* Rounded corners for buttons */ - padding: 20px; - text-decoration: none; - color: #050a0b; /* Button text color */ - box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.2); - transition: box-shadow 0.3s; /* Smooth transition for shadow */ -} -.button-text { - margin-top: 15px; /* Adds space between icon and text */ - margin-bottom: 20px; /* Increases space at the bottom */ -} -.overview-button:hover, -.overview-button:active { - box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.3); /* Shadow on hover and click */ -} - -.button-icon { - font-size: 3em; - margin-bottom: 10px; /* Space between icon and text */ - align-self: flex-start; /* Ensure icon is also left-aligned */ -} - -.button-text { - text-align: left; /* Align text to the left */ - width: 100%; /* Ensure text container uses full button width for alignment */ -} - -.button-header { - font-weight: bold; - font-size: 1.1em; /* Slightly larger text for the header */ -} - -.button-description { - font-size: 0.9em; /* Smaller text for the description */ -} - -.overview-button *, -.overview-button *::before, -.overview-button *::after { - pointer-events: none; /* Prevent text, icon, and pseudo-elements from being selectable or causing hover effects */ -} - -.overview-button *, -.overview-button *::before, -.overview-button *::after { - pointer-events: none; /* Prevent text, icon, and pseudo-elements from being selectable or causing hover effects */ -} diff --git a/src/pages/index.module.css b/src/pages/index.module.css deleted file mode 100644 index 9f71a5da..00000000 --- a/src/pages/index.module.css +++ /dev/null @@ -1,23 +0,0 @@ -/** - * CSS files with the .module.css suffix will be treated as CSS modules - * and scoped locally. - */ - -.heroBanner { - padding: 4rem 0; - text-align: center; - position: relative; - overflow: hidden; -} - -@media screen and (max-width: 996px) { - .heroBanner { - padding: 2rem; - } -} - -.buttons { - display: flex; - align-items: center; - justify-content: center; -} diff --git a/src/pages/markdown-page.md b/src/pages/markdown-page.md deleted file mode 100644 index 9756c5b6..00000000 --- a/src/pages/markdown-page.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -title: Markdown page example ---- - -# Markdown page example - -You don't need React to write simple standalone pages. diff --git a/static/algolia-crawler.png b/static/algolia-crawler.png deleted file mode 100644 index 99bb59bf..00000000 Binary files a/static/algolia-crawler.png and /dev/null differ diff --git a/static/img/Logo_black.png b/static/img/Logo_black.png deleted file mode 100644 index ed009c36..00000000 Binary files a/static/img/Logo_black.png and /dev/null differ diff --git a/static/img/email-auth-example-alchemy.png b/static/img/email-auth-example-alchemy.png deleted file mode 100644 index 349a83e0..00000000 Binary files a/static/img/email-auth-example-alchemy.png and /dev/null differ diff --git a/static/img/export_modal.png b/static/img/export_modal.png deleted file mode 100644 index dd73c662..00000000 Binary files a/static/img/export_modal.png and /dev/null differ diff --git a/static/img/favicon.svg b/static/img/favicon.svg deleted file mode 100644 index 8d6b1299..00000000 --- a/static/img/favicon.svg +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/static/img/icon.png b/static/img/icon.png deleted file mode 100644 index 9b112404..00000000 Binary files a/static/img/icon.png and /dev/null differ diff --git a/static/img/icons/checkbox.svg b/static/img/icons/checkbox.svg deleted file mode 100644 index e69de29b..00000000 diff --git a/static/img/icons/key-2-line.png b/static/img/icons/key-2-line.png deleted file mode 100644 index 59223811..00000000 Binary files a/static/img/icons/key-2-line.png and /dev/null differ diff --git a/static/img/import_modal.png b/static/img/import_modal.png deleted file mode 100644 index 56fa9c25..00000000 Binary files a/static/img/import_modal.png and /dev/null differ diff --git a/static/img/logo.png b/static/img/logo.png deleted file mode 100644 index 992af7a8..00000000 Binary files a/static/img/logo.png and /dev/null differ diff --git a/static/img/og-image.png b/static/img/og-image.png deleted file mode 100644 index 554ef7db..00000000 Binary files a/static/img/og-image.png and /dev/null differ diff --git a/static/img/quickstart/create_api_key.png b/static/img/quickstart/create_api_key.png deleted file mode 100644 index bef8bc7a..00000000 Binary files a/static/img/quickstart/create_api_key.png and /dev/null differ diff --git a/static/img/quickstart/old_create_organization.png b/static/img/quickstart/old_create_organization.png deleted file mode 100644 index 3b5a7196..00000000 Binary files a/static/img/quickstart/old_create_organization.png and /dev/null differ diff --git a/static/img/staking_example.png b/static/img/staking_example.png deleted file mode 100644 index 56409654..00000000 Binary files a/static/img/staking_example.png and /dev/null differ diff --git a/static/img/undraw_docusaurus_mountain.svg b/static/img/undraw_docusaurus_mountain.svg deleted file mode 100644 index af961c49..00000000 --- a/static/img/undraw_docusaurus_mountain.svg +++ /dev/null @@ -1,171 +0,0 @@ - - Easy to Use - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/undraw_docusaurus_react.svg b/static/img/undraw_docusaurus_react.svg deleted file mode 100644 index 94b5cf08..00000000 --- a/static/img/undraw_docusaurus_react.svg +++ /dev/null @@ -1,170 +0,0 @@ - - Powered by React - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/img/undraw_docusaurus_tree.svg b/static/img/undraw_docusaurus_tree.svg deleted file mode 100644 index d9161d33..00000000 --- a/static/img/undraw_docusaurus_tree.svg +++ /dev/null @@ -1,40 +0,0 @@ - - Focus on What Matters - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/vercel.png b/static/vercel.png deleted file mode 100644 index 4eb2ef57..00000000 Binary files a/static/vercel.png and /dev/null differ diff --git a/styles.css b/styles.css new file mode 100644 index 00000000..d6fea288 --- /dev/null +++ b/styles.css @@ -0,0 +1,13 @@ +#table-of-contents-content a[href="#here%E2%80%99s-how-that-works%3A"] { + /* Hides the 'Here's how that works:' link in the table of contents. + Ensure the href matches the exact text content to maintain this behavior. + Link: /home#here%E2%80%99s-how-that-works%3A */ + display: none; +} + +#table-of-contents-content a[href^="#feature-spotlight"] { + /* Hides the 'Feature spotlight: Send crypto via a URL' link in the table of contents. + Ensure the href starts with '#feature-spotlight' to maintain this behavior. + Link: /home#feature-spotlight%3A-send-crypto-via-a-url */ + display: none; +} diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index 6f475698..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - // This file is not used in compilation. It is here just for a nice editor experience. - "extends": "@tsconfig/docusaurus/tsconfig.json", - "compilerOptions": { - "baseUrl": "." - } -} diff --git a/vercel.json b/vercel.json deleted file mode 100644 index 58234ef1..00000000 --- a/vercel.json +++ /dev/null @@ -1,194 +0,0 @@ -{ - "redirects": [ - { - "source": "/api-introduction", - "destination": "/api-overview/introduction", - "permanent": true - }, - { - "source": "/api-design/:page", - "destination": "/api-overview/:page", - "permanent": true - }, - { - "source": "/managing-policies/:page", - "destination": "/concepts/policies/:page", - "permanent": true - }, - { - "source": "/managing-users/:page", - "destination": "/concepts/users/:page", - "permanent": true - }, - { - "source": "/users/best-practice", - "destination": "/concepts/users/best-practice", - "permanent": true - }, - { - "source": "/users/introduction", - "destination": "/concepts/users/introduction", - "permanent": true - }, - { - "source": "/users/root-quorum", - "destination": "/concepts/users/root-quorum", - "permanent": true - }, - { - "source": "/users/credentials", - "destination": "/concepts/users/credentials", - "permanent": true - }, - { - "source": "/users/sessions", - "destination": "/features/sessions", - "permanent": true - }, - { - "source": "/getting-started/email-auth", - "destination": "/features/email-auth", - "permanent": true - }, - { - "source": "/concepts/email-auth", - "destination": "/features/email-auth", - "permanent": true - }, - { - "source": "/concepts/email-recovery", - "destination": "/features/email-recovery", - "permanent": true - }, - { - "source": "/integration-guides/export-wallets", - "destination": "/features/export-wallets", - "permanent": true - }, - { - "source": "/integration-guides/import-wallets", - "destination": "/features/import-wallets", - "permanent": true - }, - { - "source": "/integration-guides/aa-wallets", - "destination": "/reference/aa-wallets", - "permanent": true - }, - { - "source": "/integration-guides/sub-organization-auth", - "destination": "/embedded-wallets/sub-organization-auth", - "permanent": true - }, - { - "source": "/integration-guides/sub-organization-recovery", - "destination": "/embedded-wallets/sub-organization-recovery", - "permanent": true - }, - { - "source": "/integration-guides/sub-organizations-as-wallets", - "destination": "/embedded-wallets/sub-organizations-as-wallets", - "permanent": true - }, - { - "source": "/integration-guides/webhooks", - "destination": "/features/webhooks", - "permanent": true - }, - { - "source": "/reference/react-components", - "destination": "/reference/embedded-wallet-kit", - "permanent": true - }, - { - "source": "/getting-started/resource-limits", - "destination": "/concepts/resource-limits", - "permanent": true - }, - { - "source": "/ecosystem-integrations/ethereum", - "destination": "/ecosystems/ethereum", - "permanent": true - }, - { - "source": "/ecosystem-integrations/solana", - "destination": "/ecosystems/solana", - "permanent": true - }, - { - "source": "/ecosystem-integrations/bitcoin", - "destination": "/ecosystems/bitcoin", - "permanent": true - }, - { - "source": "/ecosystem-integrations/index", - "destination": "/ecosystems/framework", - "permanent": true - }, - { - "source": "/passkeys/discoverable-vs-non-discoverable", - "destination": "/authentication/passkeys/discoverable-vs-non-discoverable", - "permanent": true - }, - { - "source": "/passkeys/integration", - "destination": "/authentication/passkeys/integration", - "permanent": true - }, - { - "source": "/passkeys/introduction", - "destination": "/authentication/passkeys/introduction", - "permanent": true - }, - { - "source": "/passkeys/native", - "destination": "/authentication/passkeys/native", - "permanent": true - }, - { - "source": "/passkeys/options", - "destination": "/authentication/passkeys/options", - "permanent": true - }, - { - "source": "/features/sessions", - "destination": "/authentication/sessions", - "permanent": true - }, - { - "source": "/features/oauth", - "destination": "/authentication/social-logins", - "permanent": true - }, - { - "source": "/concepts/introduction", - "destination": "/concepts/overview", - "permanent": true - }, - { - "source": "/api-overview/submissions", - "destination": "/developer-reference/api-overview/submissions", - "permanent": true - }, - { - "source": "/features/email-auth", - "destination": "/authentication/email", - "permanent": true - }, - { - "source": "/features/email-recovery", - "destination": "/authentication/email", - "permanent": true - }, - { - "source": "/api-overview/introduction", - "destination": "/developer-reference/introduction", - "permanent": true - }, - { - "source": "/api-overview/:page", - "destination": "/developer-reference/:page", - "permanent": true - } - ] -} diff --git a/wallets/export-wallets.mdx b/wallets/export-wallets.mdx new file mode 100644 index 00000000..d3e7a597 --- /dev/null +++ b/wallets/export-wallets.mdx @@ -0,0 +1,22 @@ +--- +title: "Export Wallets and Keys" +description: "Turnkey's export functionality allows your end users to backup or transfer a [Wallet](/concepts/wallets) by securely viewing the wallet's [mnemonic phrase](https://learnmeabitcoin.com/technical/mnemonic). We engineered this feature to ensure that the user can export their mnemonic without exposing the mnemonic itself to Turnkey or your application." +mode: wide +--- + +The process of exporting wallets or private keys from Turnkey is broken up into two primary steps: + + + + Export the wallet or private key via Turnkey. You must specify the wallet or private key ID, as well as a target public key, which the wallet or private key will be encrypted to. Encryption ensures that the key material is only accessible by the client, and cannot be extracted by any man-in-the-middle (MITM) + + + Decrypt the resulting bundle returned by Turnkey + + + +See the [Enclave to end-user secure channel](/security/enclave-secure-channels) for more technical details. + +## Implementation Guides + +See [Code Examples](/embedded-wallets/code-examples/export) for more details. diff --git a/wallets/import-wallets.mdx b/wallets/import-wallets.mdx new file mode 100644 index 00000000..de674384 --- /dev/null +++ b/wallets/import-wallets.mdx @@ -0,0 +1,25 @@ +--- +title: "Import Wallets and Keys" +description: "Turnkey's import functionality allows your end users to securely transfer a [Wallet](/concepts/wallets) or a [Private Key](/concepts/wallets#private-keys) onto the Turnkey platform via CLI or an embedded iframe. We engineered this feature to ensure that the user can import their mnemonic or private key into a Turnkey secure enclave without exposing it to Turnkey or your application." +mode: wide +--- + +The process of importing wallets or private keys into Turnkey is broken up into three primary steps: + + + + Initialize the import process. This produces an import bundle, containing a public key and signature. These artifacts will be used in the next step to ensure that key material is only accessible by Turnkey, and cannot be extracted by any man-in-the-middle (MITM) + + + Encrypt the key material to the artifacts from the previous step + + + Import the encrypted bundle to Turnkey + + + +See the [Enclave to end-user secure channel](/security/enclave-secure-channels) for more technical details. + +## Implementation Guides + +See [Code Examples](/embedded-wallets/code-examples/import) for more details. diff --git a/wallets/pregenerated-wallets.mdx b/wallets/pregenerated-wallets.mdx new file mode 100644 index 00000000..80a6fee8 --- /dev/null +++ b/wallets/pregenerated-wallets.mdx @@ -0,0 +1,29 @@ +--- +title: "Pre-Generated Wallets" +description: "Turnkey allows you to pre-generate wallets for your user before they authenticate. This is helpful if you already know the users email or phone number, and want to create a deposit address for them or airdrop a reward before they authenticate to Turnkey." +mode: wide +--- + +## Send crypto to a non-signed in user via a URL +A simple way to utilize pre-generated wallets to enable existing users of your app to send new users crypto via a simple link. When the new user clicks on the link, they will be able to access an in-app wallet that has already been topped up with crypto from the original user. You can view an example of the feature below: + + + + + +Here 's how to get started: + + + Pre-requisites: Ensure that your organization is set up in a way so that end users of your application are mapped to sub-organizations (1 end user = 1 sub-org). Your original end user (“Sender”) should be represented by an individual, permanent sub-org. They will use their wallet in this sub-org to send funds. You should also have email authentication set up for your application. + + Create a new temporary sub-org and a wallet for that sub-org. The sub-org should include both the original end user and the receiving user (“Receiver”). The sub-org should also have the Sender’s email or phone number associated with it, and a corresponding API key. + + Create a policy to ensure that the Sender can only access the wallet in this sub-org, so that they can reclaim existing funds if they have not been claimed by the Receiver. + + The Sender can now send funds to the wallet in the temporary sub-org. + When a link is generated for the Receiver to claim their wallet, it will contain the pri vate key component of the API key that was generated by the Sender. This will exist as part of the query params of the link, and is never exposed to your app’s servers or Turnkey. You can also configure the link to correspond to an individual transaction ID within your app. + + When the Receiver wants to claim the wallet, they can click the link and sign up for your app. A permanent sub-org will then be created for the Receiver, and prompt them to complete the Email Auth flow to authenticate or add a new authenticator. + The temporary sub-org is now controlled by both the Sender and the Receiver. A new session will be created so that the Receiver will use the private key passed in the link to send funds to their newly created permanent sub-org. + After the funds are received, the temporary sub-org can be deleted. + \ No newline at end of file diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c577b41f..00000000 --- a/yarn.lock +++ /dev/null @@ -1,9439 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@adraffy/ens-normalize@^1.10.1": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@adraffy/ens-normalize/-/ens-normalize-1.11.0.tgz#42cc67c5baa407ac25059fcd7d405cc5ecdb0c33" - integrity sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg== - -"@algolia/autocomplete-core@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.9.3.tgz" - integrity sha512-009HdfugtGCdC4JdXUbVJClA0q0zh24yyePn+KUGk3rP7j8FEe/m5Yo/z65gn6nP/cM39PxpzqKrL7A6fP6PPw== - dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.9.3" - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-plugin-algolia-insights@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.9.3.tgz" - integrity sha512-a/yTUkcO/Vyy+JffmAnTWbr4/90cLzw+CC3bRbhnULr/EM0fGNvM13oQQ14f2moLMcVDyAx/leczLlAOovhSZg== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-preset-algolia@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.9.3.tgz" - integrity sha512-d4qlt6YmrLMYy95n5TB52wtNDr6EgAIPH81dvvvW8UmuWRgxEtY0NJiPwl/h95JtG2vmRM804M0DSwMCNZlzRA== - dependencies: - "@algolia/autocomplete-shared" "1.9.3" - -"@algolia/autocomplete-shared@1.9.3": - version "1.9.3" - resolved "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.9.3.tgz" - integrity sha512-Wnm9E4Ye6Rl6sTTqjoymD+l8DjSTHsHboVRYrKgEt8Q7UHm9nYbqhN/i0fhUYA3OAEH7WA8x3jfpnmJm3rKvaQ== - -"@algolia/cache-browser-local-storage@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/cache-browser-local-storage/-/cache-browser-local-storage-4.18.0.tgz" - integrity sha512-rUAs49NLlO8LVLgGzM4cLkw8NJLKguQLgvFmBEe3DyzlinoqxzQMHfKZs6TSq4LZfw/z8qHvRo8NcTAAUJQLcw== - dependencies: - "@algolia/cache-common" "4.18.0" - -"@algolia/cache-common@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/cache-common/-/cache-common-4.18.0.tgz" - integrity sha512-BmxsicMR4doGbeEXQu8yqiGmiyvpNvejYJtQ7rvzttEAMxOPoWEHrWyzBQw4x7LrBY9pMrgv4ZlUaF8PGzewHg== - -"@algolia/cache-in-memory@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/cache-in-memory/-/cache-in-memory-4.18.0.tgz" - integrity sha512-evD4dA1nd5HbFdufBxLqlJoob7E2ozlqJZuV3YlirNx5Na4q1LckIuzjNYZs2ddLzuTc/Xd5O3Ibf7OwPskHxw== - dependencies: - "@algolia/cache-common" "4.18.0" - -"@algolia/client-account@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/client-account/-/client-account-4.18.0.tgz" - integrity sha512-XsDnlROr3+Z1yjxBJjUMfMazi1V155kVdte6496atvBgOEtwCzTs3A+qdhfsAnGUvaYfBrBkL0ThnhMIBCGcew== - dependencies: - "@algolia/client-common" "4.18.0" - "@algolia/client-search" "4.18.0" - "@algolia/transporter" "4.18.0" - -"@algolia/client-analytics@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-4.18.0.tgz" - integrity sha512-chEUSN4ReqU7uRQ1C8kDm0EiPE+eJeAXiWcBwLhEynfNuTfawN9P93rSZktj7gmExz0C8XmkbBU19IQ05wCNrQ== - dependencies: - "@algolia/client-common" "4.18.0" - "@algolia/client-search" "4.18.0" - "@algolia/requester-common" "4.18.0" - "@algolia/transporter" "4.18.0" - -"@algolia/client-common@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/client-common/-/client-common-4.18.0.tgz" - integrity sha512-7N+soJFP4wn8tjTr3MSUT/U+4xVXbz4jmeRfWfVAzdAbxLAQbHa0o/POSdTvQ8/02DjCLelloZ1bb4ZFVKg7Wg== - dependencies: - "@algolia/requester-common" "4.18.0" - "@algolia/transporter" "4.18.0" - -"@algolia/client-personalization@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-4.18.0.tgz" - integrity sha512-+PeCjODbxtamHcPl+couXMeHEefpUpr7IHftj4Y4Nia1hj8gGq4VlIcqhToAw8YjLeCTfOR7r7xtj3pJcYdP8A== - dependencies: - "@algolia/client-common" "4.18.0" - "@algolia/requester-common" "4.18.0" - "@algolia/transporter" "4.18.0" - -"@algolia/client-search@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/client-search/-/client-search-4.18.0.tgz" - integrity sha512-F9xzQXTjm6UuZtnsLIew6KSraXQ0AzS/Ee+OD+mQbtcA/K1sg89tqb8TkwjtiYZ0oij13u3EapB3gPZwm+1Y6g== - dependencies: - "@algolia/client-common" "4.18.0" - "@algolia/requester-common" "4.18.0" - "@algolia/transporter" "4.18.0" - -"@algolia/events@^4.0.1": - version "4.0.1" - resolved "https://registry.npmjs.org/@algolia/events/-/events-4.0.1.tgz" - integrity sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ== - -"@algolia/logger-common@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/logger-common/-/logger-common-4.18.0.tgz" - integrity sha512-46etYgSlkoKepkMSyaoriSn2JDgcrpc/nkOgou/lm0y17GuMl9oYZxwKKTSviLKI5Irk9nSKGwnBTQYwXOYdRg== - -"@algolia/logger-console@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/logger-console/-/logger-console-4.18.0.tgz" - integrity sha512-3P3VUYMl9CyJbi/UU1uUNlf6Z8N2ltW3Oqhq/nR7vH0CjWv32YROq3iGWGxB2xt3aXobdUPXs6P0tHSKRmNA6g== - dependencies: - "@algolia/logger-common" "4.18.0" - -"@algolia/requester-browser-xhr@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-4.18.0.tgz" - integrity sha512-/AcWHOBub2U4TE/bPi4Gz1XfuLK6/7dj4HJG+Z2SfQoS1RjNLshZclU3OoKIkFp8D2NC7+BNsPvr9cPLyW8nyQ== - dependencies: - "@algolia/requester-common" "4.18.0" - -"@algolia/requester-common@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/requester-common/-/requester-common-4.18.0.tgz" - integrity sha512-xlT8R1qYNRBCi1IYLsx7uhftzdfsLPDGudeQs+xvYB4sQ3ya7+ppolB/8m/a4F2gCkEO6oxpp5AGemM7kD27jA== - -"@algolia/requester-node-http@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-4.18.0.tgz" - integrity sha512-TGfwj9aeTVgOUhn5XrqBhwUhUUDnGIKlI0kCBMdR58XfXcfdwomka+CPIgThRbfYw04oQr31A6/95ZH2QVJ9UQ== - dependencies: - "@algolia/requester-common" "4.18.0" - -"@algolia/transporter@4.18.0": - version "4.18.0" - resolved "https://registry.npmjs.org/@algolia/transporter/-/transporter-4.18.0.tgz" - integrity sha512-xbw3YRUGtXQNG1geYFEDDuFLZt4Z8YNKbamHPkzr3rWc6qp4/BqEeXcI2u/P/oMq2yxtXgMxrCxOPA8lyIe5jw== - dependencies: - "@algolia/cache-common" "4.18.0" - "@algolia/logger-common" "4.18.0" - "@algolia/requester-common" "4.18.0" - -"@ampproject/remapping@^2.2.0": - version "2.2.1" - resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" - integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" - integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== - dependencies: - "@babel/highlight" "^7.22.5" - -"@babel/code-frame@^7.25.9", "@babel/code-frame@^7.26.2": - version "7.26.2" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" - integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== - dependencies: - "@babel/helper-validator-identifier" "^7.25.9" - js-tokens "^4.0.0" - picocolors "^1.0.0" - -"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" - integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== - -"@babel/core@7.12.9": - version "7.12.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.12.9.tgz" - integrity sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.5" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.7" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.9" - "@babel/types" "^7.12.7" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.1" - json5 "^2.1.2" - lodash "^4.17.19" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.18.6", "@babel/core@^7.19.6": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz" - integrity sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.22.5" - "@babel/generator" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.9" - "@babel/helper-module-transforms" "^7.22.9" - "@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" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.2" - semver "^6.3.1" - -"@babel/generator@^7.12.5", "@babel/generator@^7.18.7", "@babel/generator@^7.22.7", "@babel/generator@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz" - integrity sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw== - dependencies: - "@babel/types" "^7.22.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" - jsesc "^2.5.1" - -"@babel/generator@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.26.3.tgz#ab8d4360544a425c90c248df7059881f4b2ce019" - integrity sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ== - dependencies: - "@babel/parser" "^7.26.3" - "@babel/types" "^7.26.3" - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.25" - jsesc "^3.0.2" - -"@babel/helper-annotate-as-pure@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" - integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz" - integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.9.tgz" - integrity sha512-7qYrNM6HjpnPHJbopxmb8hSPoZ0gsX8IvUS32JGVoy+pU9e5N0nLr1VjJoR6kA4d9dmGLxNYOjeB8sUDal2WMw== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-validator-option" "^7.22.5" - browserslist "^4.21.9" - lru-cache "^5.1.1" - semver "^6.3.1" - -"@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.9.tgz" - integrity sha512-Pwyi89uO4YrGKxL/eNJ8lfEH55DnRloGPOseaA8NFNL6jAUnn+KccaISiFazCj5IolPPDjGSdzQzXVzODVRqUQ== - 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-optimise-call-expression" "^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" - semver "^6.3.1" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.9.tgz" - integrity sha512-+svjVa/tFwsNSG4NEy1h85+HQ5imbT92Q5/bgtS7P0GTQlP8WuFdqsiABmQouhiFGyV66oGxZFpeYHza1rNsKw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - regexpu-core "^5.3.1" - semver "^6.3.1" - -"@babel/helper-define-polyfill-provider@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz" - integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - -"@babel/helper-environment-visitor@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" - integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== - -"@babel/helper-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" - integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== - dependencies: - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helper-hoist-variables@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" - integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-member-expression-to-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" - integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.0.0", "@babel/helper-module-imports@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" - integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-module-imports@^7.16.7": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" - integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== - dependencies: - "@babel/traverse" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/helper-module-transforms@^7.12.1", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.9.tgz" - integrity sha512-t+WA2Xn5K+rTeGtC8jCsdAH52bjggG5TKRuRrAGNM/mjIbO4GxvlLMFOEz9wXY5I2XQ60PMFsAG2WIcG82dQMQ== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/helper-validator-identifier" "^7.22.5" - -"@babel/helper-optimise-call-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" - integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-plugin-utils@7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz" - integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" - integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== - -"@babel/helper-remap-async-to-generator@^7.22.5": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz" - integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-wrap-function" "^7.22.9" - -"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz" - integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-member-expression-to-functions" "^7.22.5" - "@babel/helper-optimise-call-expression" "^7.22.5" - -"@babel/helper-simple-access@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" - integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" - integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-split-export-declaration@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" - integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== - dependencies: - "@babel/types" "^7.22.5" - -"@babel/helper-string-parser@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" - integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== - -"@babel/helper-string-parser@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" - integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== - -"@babel/helper-validator-identifier@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" - integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== - -"@babel/helper-validator-identifier@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" - integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== - -"@babel/helper-validator-option@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" - integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== - -"@babel/helper-wrap-function@^7.22.9": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.9.tgz" - integrity sha512-sZ+QzfauuUEfxSEjKFmi3qDSHgLsTPK/pEpoD/qonZKOtTPTLbf59oabPQ4rKekt9lFcj/hTZaOhWwFYrgjk+Q== - dependencies: - "@babel/helper-function-name" "^7.22.5" - "@babel/template" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/helpers@^7.12.5", "@babel/helpers@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz" - integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== - dependencies: - "@babel/template" "^7.22.5" - "@babel/traverse" "^7.22.6" - "@babel/types" "^7.22.5" - -"@babel/highlight@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" - integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== - dependencies: - "@babel/helper-validator-identifier" "^7.22.5" - chalk "^2.0.0" - js-tokens "^4.0.0" - -"@babel/parser@^7.12.7", "@babel/parser@^7.18.8", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" - integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== - -"@babel/parser@^7.25.9", "@babel/parser@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.26.3.tgz#8c51c5db6ddf08134af1ddbacf16aaab48bac234" - integrity sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA== - dependencies: - "@babel/types" "^7.26.3" - -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" - integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" - integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== - 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-proposal-object-rest-spread@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" - -"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": - version "7.21.0-placeholder-for-preset-env.2" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" - integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== - -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-syntax-async-generators@^7.8.4": - version "7.8.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" - integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-class-properties@^7.12.13": - version "7.12.13" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" - integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== - dependencies: - "@babel/helper-plugin-utils" "^7.12.13" - -"@babel/plugin-syntax-class-static-block@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" - integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-dynamic-import@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" - integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-export-namespace-from@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" - integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.3" - -"@babel/plugin-syntax-import-assertions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" - integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-attributes@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" - integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-import-meta@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" - integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-json-strings@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" - integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-jsx@7.12.1": - version "7.12.1" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.12.1.tgz" - integrity sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" - integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-logical-assignment-operators@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" - integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" - integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-numeric-separator@^7.10.4": - version "7.10.4" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" - integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== - dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - -"@babel/plugin-syntax-object-rest-spread@7.8.3", "@babel/plugin-syntax-object-rest-spread@^7.8.0", "@babel/plugin-syntax-object-rest-spread@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" - integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-catch-binding@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" - integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-optional-chaining@^7.8.3": - version "7.8.3" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" - integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== - dependencies: - "@babel/helper-plugin-utils" "^7.8.0" - -"@babel/plugin-syntax-private-property-in-object@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" - integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-top-level-await@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" - integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== - dependencies: - "@babel/helper-plugin-utils" "^7.14.5" - -"@babel/plugin-syntax-typescript@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" - integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" - integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-transform-arrow-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" - integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-async-generator-functions@^7.22.7": - version "7.22.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz" - integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== - dependencies: - "@babel/helper-environment-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" - "@babel/plugin-syntax-async-generators" "^7.8.4" - -"@babel/plugin-transform-async-to-generator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" - integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.5" - -"@babel/plugin-transform-block-scoped-functions@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" - integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-block-scoping@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz" - integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" - integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-class-static-block@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz" - integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-transform-classes@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" - integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.6" - "@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-split-export-declaration" "^7.22.6" - globals "^11.1.0" - -"@babel/plugin-transform-computed-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" - integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/template" "^7.22.5" - -"@babel/plugin-transform-destructuring@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz" - integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" - integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-duplicate-keys@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" - integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-dynamic-import@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz" - integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - -"@babel/plugin-transform-exponentiation-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" - integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== - dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-export-namespace-from@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz" - integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - -"@babel/plugin-transform-for-of@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" - integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-function-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" - integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== - dependencies: - "@babel/helper-compilation-targets" "^7.22.5" - "@babel/helper-function-name" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-json-strings@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz" - integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-transform-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" - integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-logical-assignment-operators@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz" - integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-transform-member-expression-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" - integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-amd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" - integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-modules-commonjs@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" - integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-simple-access" "^7.22.5" - -"@babel/plugin-transform-modules-systemjs@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz" - integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - -"@babel/plugin-transform-modules-umd@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" - integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== - dependencies: - "@babel/helper-module-transforms" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" - integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-new-target@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" - integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz" - integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - -"@babel/plugin-transform-numeric-separator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz" - integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-transform-object-rest-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz" - integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== - dependencies: - "@babel/compat-data" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.5" - "@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-object-super@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" - integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.5" - -"@babel/plugin-transform-optional-catch-binding@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz" - integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - -"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz" - integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== - 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" - -"@babel/plugin-transform-parameters@^7.12.1", "@babel/plugin-transform-parameters@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" - integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-methods@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" - integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-private-property-in-object@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz" - integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - -"@babel/plugin-transform-property-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" - integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-constant-elements@^7.18.12": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz" - integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-display-name@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" - integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-react-jsx-development@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz" - integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== - dependencies: - "@babel/plugin-transform-react-jsx" "^7.22.5" - -"@babel/plugin-transform-react-jsx@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" - integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/plugin-transform-react-pure-annotations@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz" - integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-regenerator@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz" - integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - regenerator-transform "^0.15.1" - -"@babel/plugin-transform-reserved-words@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" - integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-runtime@^7.18.6": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz" - integrity sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ== - dependencies: - "@babel/helper-module-imports" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" - semver "^6.3.1" - -"@babel/plugin-transform-shorthand-properties@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" - integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-spread@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" - integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" - -"@babel/plugin-transform-sticky-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" - integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-template-literals@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" - integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typeof-symbol@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" - integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-typescript@^7.22.5": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.9.tgz" - integrity sha512-BnVR1CpKiuD0iobHPaM1iLvcwPYN2uVFAqoLVSpEDKWuOikoCv5HbKLxclhKYUXlWkX86DoZGtqI4XhbOsyrMg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-create-class-features-plugin" "^7.22.9" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-syntax-typescript" "^7.22.5" - -"@babel/plugin-transform-unicode-escapes@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz" - integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-property-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" - integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" - integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/plugin-transform-unicode-sets-regex@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" - integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - -"@babel/preset-env@^7.18.6", "@babel/preset-env@^7.19.4": - version "7.22.9" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz" - integrity sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g== - dependencies: - "@babel/compat-data" "^7.22.9" - "@babel/helper-compilation-targets" "^7.22.9" - "@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/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" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.22.5" - "@babel/plugin-syntax-import-attributes" "^7.22.5" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@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-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-class-properties" "^7.22.5" - "@babel/plugin-transform-class-static-block" "^7.22.5" - "@babel/plugin-transform-classes" "^7.22.6" - "@babel/plugin-transform-computed-properties" "^7.22.5" - "@babel/plugin-transform-destructuring" "^7.22.5" - "@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-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-function-name" "^7.22.5" - "@babel/plugin-transform-json-strings" "^7.22.5" - "@babel/plugin-transform-literals" "^7.22.5" - "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" - "@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-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-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-private-methods" "^7.22.5" - "@babel/plugin-transform-private-property-in-object" "^7.22.5" - "@babel/plugin-transform-property-literals" "^7.22.5" - "@babel/plugin-transform-regenerator" "^7.22.5" - "@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-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" - babel-plugin-polyfill-corejs2 "^0.4.4" - babel-plugin-polyfill-corejs3 "^0.8.2" - babel-plugin-polyfill-regenerator "^0.5.1" - core-js-compat "^3.31.0" - semver "^6.3.1" - -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== - 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" - -"@babel/preset-react@^7.18.6": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz" - integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-transform-react-display-name" "^7.22.5" - "@babel/plugin-transform-react-jsx" "^7.22.5" - "@babel/plugin-transform-react-jsx-development" "^7.22.5" - "@babel/plugin-transform-react-pure-annotations" "^7.22.5" - -"@babel/preset-typescript@^7.18.6": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz" - integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== - dependencies: - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - "@babel/plugin-transform-modules-commonjs" "^7.22.5" - "@babel/plugin-transform-typescript" "^7.22.5" - -"@babel/regjsgen@^0.8.0": - version "0.8.0" - resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" - integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== - -"@babel/runtime-corejs3@^7.18.6": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.6.tgz" - integrity sha512-M+37LLIRBTEVjktoJjbw4KVhupF0U/3PYUCbBwgAd9k17hoKhRu1n935QiG7Tuxv0LJOMrb2vuKEeYUlv0iyiw== - dependencies: - core-js-pure "^3.30.2" - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.1.2", "@babel/runtime@^7.10.3", "@babel/runtime@^7.12.13", "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.8", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.13", "@babel/runtime@^7.8.4": - version "7.22.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" - integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/runtime@^7.18.3", "@babel/runtime@^7.26.0", "@babel/runtime@^7.5.5", "@babel/runtime@^7.8.7": - version "7.26.0" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.26.0.tgz#8600c2f595f277c60815256418b85356a65173c1" - integrity sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw== - dependencies: - regenerator-runtime "^0.14.0" - -"@babel/template@^7.12.7", "@babel/template@^7.22.5": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" - integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== - dependencies: - "@babel/code-frame" "^7.22.5" - "@babel/parser" "^7.22.5" - "@babel/types" "^7.22.5" - -"@babel/template@^7.25.9": - version "7.25.9" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.9.tgz#ecb62d81a8a6f5dc5fe8abfc3901fc52ddf15016" - integrity sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg== - dependencies: - "@babel/code-frame" "^7.25.9" - "@babel/parser" "^7.25.9" - "@babel/types" "^7.25.9" - -"@babel/traverse@^7.12.9", "@babel/traverse@^7.18.8", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.4.5": - version "7.22.8" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz" - integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== - 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/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.22.7" - "@babel/types" "^7.22.5" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.25.9": - version "7.26.4" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.26.4.tgz#ac3a2a84b908dde6d463c3bfa2c5fdc1653574bd" - integrity sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w== - dependencies: - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.3" - "@babel/parser" "^7.26.3" - "@babel/template" "^7.25.9" - "@babel/types" "^7.26.3" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/types@^7.12.7", "@babel/types@^7.20.0", "@babel/types@^7.22.5", "@babel/types@^7.4.4": - version "7.22.5" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" - integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== - dependencies: - "@babel/helper-string-parser" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.5" - to-fast-properties "^2.0.0" - -"@babel/types@^7.25.9", "@babel/types@^7.26.3": - version "7.26.3" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.26.3.tgz#37e79830f04c2b5687acc77db97fbc75fb81f3c0" - integrity sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA== - dependencies: - "@babel/helper-string-parser" "^7.25.9" - "@babel/helper-validator-identifier" "^7.25.9" - -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - -"@discoveryjs/json-ext@0.5.7": - version "0.5.7" - resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" - integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== - -"@docsearch/css@3.5.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@docsearch/css/-/css-3.5.1.tgz" - integrity sha512-2Pu9HDg/uP/IT10rbQ+4OrTQuxIWdKVUEdcw9/w7kZJv9NeHS6skJx1xuRiFyoGKwAzcHXnLp7csE99sj+O1YA== - -"@docsearch/react@^3.1.1": - version "3.5.1" - resolved "https://registry.npmjs.org/@docsearch/react/-/react-3.5.1.tgz" - integrity sha512-t5mEODdLzZq4PTFAm/dvqcvZFdPDMdfPE5rJS5SC8OUq9mPzxEy6b+9THIqNM9P0ocCb4UC5jqBrxKclnuIbzQ== - dependencies: - "@algolia/autocomplete-core" "1.9.3" - "@algolia/autocomplete-preset-algolia" "1.9.3" - "@docsearch/css" "3.5.1" - algoliasearch "^4.0.0" - -"@docusaurus/core@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/core/-/core-2.4.1.tgz" - integrity sha512-SNsY7PshK3Ri7vtsLXVeAJGS50nJN3RgF836zkyUfAD01Fq+sAk5EwWgLw+nnm5KVNGDu7PRR2kRGDsWvqpo0g== - dependencies: - "@babel/core" "^7.18.6" - "@babel/generator" "^7.18.7" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-transform-runtime" "^7.18.6" - "@babel/preset-env" "^7.18.6" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@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/react-loadable" "5.5.2" - "@docusaurus/utils" "2.4.1" - "@docusaurus/utils-common" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" - "@slorber/static-site-generator-webpack-plugin" "^4.0.7" - "@svgr/webpack" "^6.2.1" - autoprefixer "^10.4.7" - babel-loader "^8.2.5" - babel-plugin-dynamic-import-node "^2.3.3" - boxen "^6.2.1" - chalk "^4.1.2" - chokidar "^3.5.3" - clean-css "^5.3.0" - cli-table3 "^0.6.2" - combine-promises "^1.1.0" - commander "^5.1.0" - copy-webpack-plugin "^11.0.0" - core-js "^3.23.3" - css-loader "^6.7.1" - css-minimizer-webpack-plugin "^4.0.0" - cssnano "^5.1.12" - del "^6.1.1" - detect-port "^1.3.0" - escape-html "^1.0.3" - eta "^2.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - html-minifier-terser "^6.1.0" - html-tags "^3.2.0" - html-webpack-plugin "^5.5.0" - import-fresh "^3.3.0" - leven "^3.1.0" - lodash "^4.17.21" - mini-css-extract-plugin "^2.6.1" - postcss "^8.4.14" - postcss-loader "^7.0.0" - prompts "^2.4.2" - react-dev-utils "^12.0.1" - react-helmet-async "^1.3.0" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - react-loadable-ssr-addon-v5-slorber "^1.0.1" - react-router "^5.3.3" - react-router-config "^5.1.1" - react-router-dom "^5.3.3" - rtl-detect "^1.0.4" - semver "^7.3.7" - serve-handler "^6.1.3" - shelljs "^0.8.5" - terser-webpack-plugin "^5.3.3" - tslib "^2.4.0" - update-notifier "^5.1.0" - url-loader "^4.1.1" - wait-on "^6.0.1" - webpack "^5.73.0" - webpack-bundle-analyzer "^4.5.0" - webpack-dev-server "^4.9.3" - webpack-merge "^5.8.0" - webpackbar "^5.0.2" - -"@docusaurus/cssnano-preset@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/cssnano-preset/-/cssnano-preset-2.4.1.tgz" - integrity sha512-ka+vqXwtcW1NbXxWsh6yA1Ckii1klY9E53cJ4O9J09nkMBgrNX3iEFED1fWdv8wf4mJjvGi5RLZ2p9hJNjsLyQ== - dependencies: - cssnano-preset-advanced "^5.3.8" - postcss "^8.4.14" - postcss-sort-media-queries "^4.2.1" - tslib "^2.4.0" - -"@docusaurus/logger@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/logger/-/logger-2.4.1.tgz" - integrity sha512-5h5ysIIWYIDHyTVd8BjheZmQZmEgWDR54aQ1BX9pjFfpyzFo5puKXKYrYJXbjEHGyVhEzmB9UXwbxGfaZhOjcg== - dependencies: - chalk "^4.1.2" - tslib "^2.4.0" - -"@docusaurus/mdx-loader@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/mdx-loader/-/mdx-loader-2.4.1.tgz" - integrity sha512-4KhUhEavteIAmbBj7LVFnrVYDiU51H5YWW1zY6SmBSte/YLhDutztLTBE0PQl1Grux1jzUJeaSvAzHpTn6JJDQ== - dependencies: - "@babel/parser" "^7.18.8" - "@babel/traverse" "^7.18.8" - "@docusaurus/logger" "2.4.1" - "@docusaurus/utils" "2.4.1" - "@mdx-js/mdx" "^1.6.22" - escape-html "^1.0.3" - file-loader "^6.2.0" - fs-extra "^10.1.0" - image-size "^1.0.1" - mdast-util-to-string "^2.0.0" - remark-emoji "^2.2.0" - stringify-object "^3.3.0" - tslib "^2.4.0" - unified "^9.2.2" - unist-util-visit "^2.0.3" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@docusaurus/module-type-aliases@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/module-type-aliases/-/module-type-aliases-2.4.1.tgz" - integrity sha512-gLBuIFM8Dp2XOCWffUDSjtxY7jQgKvYujt7Mx5s4FCTfoL5dN1EVbnrn+O2Wvh8b0a77D57qoIDY7ghgmatR1A== - dependencies: - "@docusaurus/react-loadable" "5.5.2" - "@docusaurus/types" "2.4.1" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - "@types/react-router-dom" "*" - react-helmet-async "*" - react-loadable "npm:@docusaurus/react-loadable@5.5.2" - -"@docusaurus/plugin-content-blog@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-blog/-/plugin-content-blog-2.4.1.tgz" - integrity sha512-E2i7Knz5YIbE1XELI6RlTnZnGgS52cUO4BlCiCUCvQHbR+s1xeIWz4C6BtaVnlug0Ccz7nFSksfwDpVlkujg5Q== - 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" - cheerio "^1.0.0-rc.12" - feed "^4.2.2" - fs-extra "^10.1.0" - lodash "^4.17.21" - reading-time "^1.5.0" - tslib "^2.4.0" - unist-util-visit "^2.0.3" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-docs@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-2.4.1.tgz" - integrity sha512-Lo7lSIcpswa2Kv4HEeUcGYqaasMUQNpjTXpV0N8G6jXgZaQurqp7E8NGYeGbDXnb48czmHWbzDL4S3+BbK0VzA== - 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" - "@types/react-router-config" "^5.0.6" - combine-promises "^1.1.0" - fs-extra "^10.1.0" - import-fresh "^3.3.0" - js-yaml "^4.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - webpack "^5.73.0" - -"@docusaurus/plugin-content-pages@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-content-pages/-/plugin-content-pages-2.4.1.tgz" - integrity sha512-/UjuH/76KLaUlL+o1OvyORynv6FURzjurSjvn2lbWTFc4tpYY2qLYTlKpTCBVPhlLUQsfyFnshEJDLmPneq2oA== - 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" - fs-extra "^10.1.0" - tslib "^2.4.0" - webpack "^5.73.0" - -"@docusaurus/plugin-debug@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-debug/-/plugin-debug-2.4.1.tgz" - integrity sha512-7Yu9UPzRShlrH/G8btOpR0e6INFZr0EegWplMjOqelIwAcx3PKyR8mgPTxGTxcqiYj6hxSCRN0D8R7YrzImwNA== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils" "2.4.1" - fs-extra "^10.1.0" - react-json-view "^1.21.3" - tslib "^2.4.0" - -"@docusaurus/plugin-google-analytics@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-analytics/-/plugin-google-analytics-2.4.1.tgz" - integrity sha512-dyZJdJiCoL+rcfnm0RPkLt/o732HvLiEwmtoNzOoz9MSZz117UH2J6U2vUDtzUzwtFLIf32KkeyzisbwUCgcaQ== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" - tslib "^2.4.0" - -"@docusaurus/plugin-google-gtag@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-gtag/-/plugin-google-gtag-2.4.1.tgz" - integrity sha512-mKIefK+2kGTQBYvloNEKtDmnRD7bxHLsBcxgnbt4oZwzi2nxCGjPX6+9SQO2KCN5HZbNrYmGo5GJfMgoRvy6uA== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" - tslib "^2.4.0" - -"@docusaurus/plugin-google-tag-manager@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-google-tag-manager/-/plugin-google-tag-manager-2.4.1.tgz" - integrity sha512-Zg4Ii9CMOLfpeV2nG74lVTWNtisFaH9QNtEw48R5QE1KIwDBdTVaiSA18G1EujZjrzJJzXN79VhINSbOJO/r3g== - dependencies: - "@docusaurus/core" "2.4.1" - "@docusaurus/types" "2.4.1" - "@docusaurus/utils-validation" "2.4.1" - tslib "^2.4.0" - -"@docusaurus/plugin-sitemap@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/plugin-sitemap/-/plugin-sitemap-2.4.1.tgz" - integrity sha512-lZx+ijt/+atQ3FVE8FOHV/+X3kuok688OydDXrqKRJyXBJZKgGjA2Qa8RjQ4f27V2woaXhtnyrdPop/+OjVMRg== - 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" - fs-extra "^10.1.0" - sitemap "^7.1.1" - tslib "^2.4.0" - -"@docusaurus/preset-classic@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/preset-classic/-/preset-classic-2.4.1.tgz" - integrity sha512-P4//+I4zDqQJ+UDgoFrjIFaQ1MeS9UD1cvxVQaI6O7iBmiHQm0MGROP1TbE7HlxlDPXFJjZUK3x3cAoK63smGQ== - dependencies: - "@docusaurus/core" "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/plugin-debug" "2.4.1" - "@docusaurus/plugin-google-analytics" "2.4.1" - "@docusaurus/plugin-google-gtag" "2.4.1" - "@docusaurus/plugin-google-tag-manager" "2.4.1" - "@docusaurus/plugin-sitemap" "2.4.1" - "@docusaurus/theme-classic" "2.4.1" - "@docusaurus/theme-common" "2.4.1" - "@docusaurus/theme-search-algolia" "2.4.1" - "@docusaurus/types" "2.4.1" - -"@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -"@docusaurus/theme-classic@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-classic/-/theme-classic-2.4.1.tgz" - integrity sha512-Rz0wKUa+LTW1PLXmwnf8mn85EBzaGSt6qamqtmnh9Hflkc+EqiYMhtUJeLdV+wsgYq4aG0ANc+bpUDpsUhdnwg== - 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" - "@mdx-js/react" "^1.6.22" - clsx "^1.2.1" - copy-text-to-clipboard "^3.0.1" - infima "0.2.0-alpha.43" - lodash "^4.17.21" - nprogress "^0.2.0" - postcss "^8.4.14" - prism-react-renderer "^1.3.5" - prismjs "^1.28.0" - react-router-dom "^5.3.3" - rtlcss "^3.5.0" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-common@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-common/-/theme-common-2.4.1.tgz" - integrity sha512-G7Zau1W5rQTaFFB3x3soQoZpkgMbl/SYNG8PfMFIjKa3M3q8n0m/GRf5/H/e5BqOvt8c+ZWIXGCiz+kUCSHovA== - 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" - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router-config" "*" - clsx "^1.2.1" - parse-numeric-range "^1.3.0" - prism-react-renderer "^1.3.5" - tslib "^2.4.0" - use-sync-external-store "^1.2.0" - utility-types "^3.10.0" - -"@docusaurus/theme-search-algolia@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-search-algolia/-/theme-search-algolia-2.4.1.tgz" - integrity sha512-6BcqW2lnLhZCXuMAvPRezFs1DpmEKzXFKlYjruuas+Xy3AQeFzDJKTJFIm49N77WFCTyxff8d3E4Q9pi/+5McQ== - 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" - algoliasearch "^4.13.1" - algoliasearch-helper "^3.10.0" - clsx "^1.2.1" - eta "^2.0.0" - fs-extra "^10.1.0" - lodash "^4.17.21" - tslib "^2.4.0" - utility-types "^3.10.0" - -"@docusaurus/theme-translations@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/theme-translations/-/theme-translations-2.4.1.tgz" - integrity sha512-T1RAGP+f86CA1kfE8ejZ3T3pUU3XcyvrGMfC/zxCtc2BsnoexuNI9Vk2CmuKCb+Tacvhxjv5unhxXce0+NKyvA== - dependencies: - fs-extra "^10.1.0" - tslib "^2.4.0" - -"@docusaurus/types@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/types/-/types-2.4.1.tgz" - integrity sha512-0R+cbhpMkhbRXX138UOc/2XZFF8hiZa6ooZAEEJFp5scytzCw4tC1gChMFXrpa3d2tYE6AX8IrOEpSonLmfQuQ== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - commander "^5.1.0" - joi "^17.6.0" - react-helmet-async "^1.3.0" - utility-types "^3.10.0" - webpack "^5.73.0" - webpack-merge "^5.8.0" - -"@docusaurus/utils-common@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/utils-common/-/utils-common-2.4.1.tgz" - integrity sha512-bCVGdZU+z/qVcIiEQdyx0K13OC5mYwxhSuDUR95oFbKVuXYRrTVrwZIqQljuo1fyJvFTKHiL9L9skQOPokuFNQ== - dependencies: - tslib "^2.4.0" - -"@docusaurus/utils-validation@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/utils-validation/-/utils-validation-2.4.1.tgz" - integrity sha512-unII3hlJlDwZ3w8U+pMO3Lx3RhI4YEbY3YNsQj4yzrkZzlpqZOLuAiZK2JyULnD+TKbceKU0WyWkQXtYbLNDFA== - dependencies: - "@docusaurus/logger" "2.4.1" - "@docusaurus/utils" "2.4.1" - joi "^17.6.0" - js-yaml "^4.1.0" - tslib "^2.4.0" - -"@docusaurus/utils@2.4.1": - version "2.4.1" - resolved "https://registry.npmjs.org/@docusaurus/utils/-/utils-2.4.1.tgz" - integrity sha512-1lvEZdAQhKNht9aPXPoh69eeKnV0/62ROhQeFKKxmzd0zkcuE/Oc5Gpnt00y/f5bIsmOsYMY7Pqfm/5rteT5GA== - dependencies: - "@docusaurus/logger" "2.4.1" - "@svgr/webpack" "^6.2.1" - escape-string-regexp "^4.0.0" - file-loader "^6.2.0" - fs-extra "^10.1.0" - github-slugger "^1.4.0" - globby "^11.1.0" - gray-matter "^4.0.3" - js-yaml "^4.1.0" - lodash "^4.17.21" - micromatch "^4.0.5" - resolve-pathname "^3.0.0" - shelljs "^0.8.5" - tslib "^2.4.0" - url-loader "^4.1.1" - webpack "^5.73.0" - -"@emnapi/runtime@^1.2.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60" - integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw== - dependencies: - tslib "^2.4.0" - -"@emotion/babel-plugin@^11.13.5": - version "11.13.5" - resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz#eab8d65dbded74e0ecfd28dc218e75607c4e7bc0" - integrity sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ== - dependencies: - "@babel/helper-module-imports" "^7.16.7" - "@babel/runtime" "^7.18.3" - "@emotion/hash" "^0.9.2" - "@emotion/memoize" "^0.9.0" - "@emotion/serialize" "^1.3.3" - babel-plugin-macros "^3.1.0" - convert-source-map "^1.5.0" - escape-string-regexp "^4.0.0" - find-root "^1.1.0" - source-map "^0.5.7" - stylis "4.2.0" - -"@emotion/cache@^11.13.5", "@emotion/cache@^11.14.0": - version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.14.0.tgz#ee44b26986eeb93c8be82bb92f1f7a9b21b2ed76" - integrity sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA== - dependencies: - "@emotion/memoize" "^0.9.0" - "@emotion/sheet" "^1.4.0" - "@emotion/utils" "^1.4.2" - "@emotion/weak-memoize" "^0.4.0" - stylis "4.2.0" - -"@emotion/hash@^0.9.2": - version "0.9.2" - resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.2.tgz#ff9221b9f58b4dfe61e619a7788734bd63f6898b" - integrity sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g== - -"@emotion/is-prop-valid@^1.1.0": - version "1.2.1" - resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== - dependencies: - "@emotion/memoize" "^0.8.1" - -"@emotion/is-prop-valid@^1.3.0": - version "1.3.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz#8d5cf1132f836d7adbe42cf0b49df7816fc88240" - integrity sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw== - dependencies: - "@emotion/memoize" "^0.9.0" - -"@emotion/memoize@^0.8.1": - version "0.8.1" - resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" - integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== - -"@emotion/memoize@^0.9.0": - version "0.9.0" - resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.9.0.tgz#745969d649977776b43fc7648c556aaa462b4102" - integrity sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ== - -"@emotion/react@^11.13.3": - version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.14.0.tgz#cfaae35ebc67dd9ef4ea2e9acc6cd29e157dd05d" - integrity sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.13.5" - "@emotion/cache" "^11.14.0" - "@emotion/serialize" "^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" - "@emotion/utils" "^1.4.2" - "@emotion/weak-memoize" "^0.4.0" - hoist-non-react-statics "^3.3.1" - -"@emotion/serialize@^1.3.3": - version "1.3.3" - resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.3.3.tgz#d291531005f17d704d0463a032fe679f376509e8" - integrity sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA== - dependencies: - "@emotion/hash" "^0.9.2" - "@emotion/memoize" "^0.9.0" - "@emotion/unitless" "^0.10.0" - "@emotion/utils" "^1.4.2" - csstype "^3.0.2" - -"@emotion/sheet@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.4.0.tgz#c9299c34d248bc26e82563735f78953d2efca83c" - integrity sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg== - -"@emotion/styled@^11.13.0": - version "11.14.0" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.14.0.tgz#f47ca7219b1a295186d7661583376fcea95f0ff3" - integrity sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA== - dependencies: - "@babel/runtime" "^7.18.3" - "@emotion/babel-plugin" "^11.13.5" - "@emotion/is-prop-valid" "^1.3.0" - "@emotion/serialize" "^1.3.3" - "@emotion/use-insertion-effect-with-fallbacks" "^1.2.0" - "@emotion/utils" "^1.4.2" - -"@emotion/stylis@^0.8.4": - version "0.8.5" - resolved "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz" - integrity sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ== - -"@emotion/unitless@^0.10.0": - version "0.10.0" - resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.10.0.tgz#2af2f7c7e5150f497bdabd848ce7b218a27cf745" - integrity sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg== - -"@emotion/unitless@^0.7.4": - version "0.7.5" - resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz" - integrity sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg== - -"@emotion/use-insertion-effect-with-fallbacks@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz#8a8cb77b590e09affb960f4ff1e9a89e532738bf" - integrity sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg== - -"@emotion/utils@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.4.2.tgz#6df6c45881fcb1c412d6688a311a98b7f59c1b52" - integrity sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA== - -"@emotion/weak-memoize@^0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz#5e13fac887f08c44f76b0ccaf3370eb00fec9bb6" - integrity sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg== - -"@exodus/schemasafe@^1.0.0-rc.2": - version "1.3.0" - resolved "https://registry.npmjs.org/@exodus/schemasafe/-/schemasafe-1.3.0.tgz" - integrity sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw== - -"@hapi/hoek@^9.0.0": - version "9.3.0" - resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" - integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== - -"@hapi/topo@^5.0.0": - version "5.1.0" - resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" - integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@hpke/chacha20poly1305@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@hpke/chacha20poly1305/-/chacha20poly1305-1.6.1.tgz#4f9bf7086acdf69f05500d8c93f045316990c7f6" - integrity sha512-VpuZs9EGZDpvcgLsXsSlpDbrc8MVJCXsEPI/BmvweVtGAjFBimPh4rV7X1Pl2Ch/Ay+cQw929UAt5ennq2RAEA== - dependencies: - "@hpke/common" "^1.6.1" - "@noble/ciphers" "^1.0.0" - -"@hpke/common@^1.6.1", "@hpke/common@^1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@hpke/common/-/common-1.7.1.tgz#54421f964c280692eb1033471ca1b93cd366c03c" - integrity sha512-/PBcoBsgr/bWBwJfAF1vKFBRa8tFu1g7mSuCDgpjBlRABXvLbWSF07Rb4rI5PlO8Ng16pjgvI7fgHzaLyZ9lmw== - -"@hpke/core@^1.6.0": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@hpke/core/-/core-1.7.1.tgz#dcd8e8c2fbf9902fe68f520e57bd3222bd9758fa" - integrity sha512-1cup0EARfFY7ZIIcPXBBs+LmEi7s4xghcQWVjtVUgdVzp5ZDrNpfn6iH7UbV26ZvTcinMU+NFaCfUk0G1rvfjA== - dependencies: - "@hpke/common" "^1.7.1" - -"@hpke/dhkem-x25519@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@hpke/dhkem-x25519/-/dhkem-x25519-1.6.1.tgz#f8682d9c23182da17ddafac1c6d9d1ab74922f6d" - integrity sha512-SUZWdplu9tNgVXkjN6+sRbZWVGAM22p1pM5a91ApWzW6G5QLpan5NH5I/Cy7AwiBYDYrzTepuIseaewawt4YWw== - dependencies: - "@hpke/common" "^1.6.1" - "@noble/curves" "^1.6.0" - "@noble/hashes" "^1.5.0" - -"@hpke/dhkem-x448@^1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@hpke/dhkem-x448/-/dhkem-x448-1.6.1.tgz#bf47cf36c1014dbbceddf32fd9e20faf3a404090" - integrity sha512-HYOAK8Ff/hlCdTQee8Khgd0A1GFSInGAZsjHImckeb8oDJg6JejDTOARaXULolXsZwPeS/N0UZOH2au4qtfMMg== - dependencies: - "@hpke/common" "^1.6.1" - "@noble/curves" "^1.6.0" - "@noble/hashes" "^1.5.0" - -"@icons-pack/react-simple-icons@^10.1.0": - version "10.2.0" - resolved "https://registry.yarnpkg.com/@icons-pack/react-simple-icons/-/react-simple-icons-10.2.0.tgz#18bb0dfb6241de35e7412e7430eb8fb54013bdf0" - integrity sha512-QDUxup8D3GdIIzwGpxQs6bjeFV5mJes25qqf4aqP/PaBYQNCar7AiyD8C14636TosCG0A/QqAUwm/Hviep4d4g== - -"@img/sharp-darwin-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.33.5.tgz#ef5b5a07862805f1e8145a377c8ba6e98813ca08" - integrity sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ== - optionalDependencies: - "@img/sharp-libvips-darwin-arm64" "1.0.4" - -"@img/sharp-darwin-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.33.5.tgz#e03d3451cd9e664faa72948cc70a403ea4063d61" - integrity sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q== - optionalDependencies: - "@img/sharp-libvips-darwin-x64" "1.0.4" - -"@img/sharp-libvips-darwin-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.0.4.tgz#447c5026700c01a993c7804eb8af5f6e9868c07f" - integrity sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg== - -"@img/sharp-libvips-darwin-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.0.4.tgz#e0456f8f7c623f9dbfbdc77383caa72281d86062" - integrity sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ== - -"@img/sharp-libvips-linux-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.0.4.tgz#979b1c66c9a91f7ff2893556ef267f90ebe51704" - integrity sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA== - -"@img/sharp-libvips-linux-arm@1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.0.5.tgz#99f922d4e15216ec205dcb6891b721bfd2884197" - integrity sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g== - -"@img/sharp-libvips-linux-s390x@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.0.4.tgz#f8a5eb1f374a082f72b3f45e2fb25b8118a8a5ce" - integrity sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA== - -"@img/sharp-libvips-linux-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.0.4.tgz#d4c4619cdd157774906e15770ee119931c7ef5e0" - integrity sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw== - -"@img/sharp-libvips-linuxmusl-arm64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.0.4.tgz#166778da0f48dd2bded1fa3033cee6b588f0d5d5" - integrity sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA== - -"@img/sharp-libvips-linuxmusl-x64@1.0.4": - version "1.0.4" - resolved "https://registry.yarnpkg.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.0.4.tgz#93794e4d7720b077fcad3e02982f2f1c246751ff" - integrity sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw== - -"@img/sharp-linux-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.33.5.tgz#edb0697e7a8279c9fc829a60fc35644c4839bb22" - integrity sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA== - optionalDependencies: - "@img/sharp-libvips-linux-arm64" "1.0.4" - -"@img/sharp-linux-arm@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.33.5.tgz#422c1a352e7b5832842577dc51602bcd5b6f5eff" - integrity sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ== - optionalDependencies: - "@img/sharp-libvips-linux-arm" "1.0.5" - -"@img/sharp-linux-s390x@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.33.5.tgz#f5c077926b48e97e4a04d004dfaf175972059667" - integrity sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q== - optionalDependencies: - "@img/sharp-libvips-linux-s390x" "1.0.4" - -"@img/sharp-linux-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.33.5.tgz#d806e0afd71ae6775cc87f0da8f2d03a7c2209cb" - integrity sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA== - optionalDependencies: - "@img/sharp-libvips-linux-x64" "1.0.4" - -"@img/sharp-linuxmusl-arm64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.33.5.tgz#252975b915894fb315af5deea174651e208d3d6b" - integrity sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" - -"@img/sharp-linuxmusl-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.33.5.tgz#3f4609ac5d8ef8ec7dadee80b560961a60fd4f48" - integrity sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw== - optionalDependencies: - "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - -"@img/sharp-wasm32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-wasm32/-/sharp-wasm32-0.33.5.tgz#6f44f3283069d935bb5ca5813153572f3e6f61a1" - integrity sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg== - dependencies: - "@emnapi/runtime" "^1.2.0" - -"@img/sharp-win32-ia32@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.33.5.tgz#1a0c839a40c5351e9885628c85f2e5dfd02b52a9" - integrity sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ== - -"@img/sharp-win32-x64@0.33.5": - version "0.33.5" - resolved "https://registry.yarnpkg.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.33.5.tgz#56f00962ff0c4e0eb93d34a047d29fa995e3e342" - integrity sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg== - -"@jest/schemas@^29.6.0": - version "29.6.0" - resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz" - integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== - dependencies: - "@sinclair/typebox" "^0.27.8" - -"@jest/types@^29.6.1": - version "29.6.1" - resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz" - integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== - dependencies: - "@jest/schemas" "^29.6.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - -"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": - version "0.3.3" - resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" - integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== - dependencies: - "@jridgewell/set-array" "^1.0.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/gen-mapping@^0.3.5": - version "0.3.8" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" - integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== - dependencies: - "@jridgewell/set-array" "^1.2.1" - "@jridgewell/sourcemap-codec" "^1.4.10" - "@jridgewell/trace-mapping" "^0.3.24" - -"@jridgewell/resolve-uri@3.1.0": - version "3.1.0" - resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== - -"@jridgewell/resolve-uri@^3.1.0": - version "3.1.2" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" - integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== - -"@jridgewell/set-array@^1.0.1": - version "1.1.2" - resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" - integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== - -"@jridgewell/set-array@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" - integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== - -"@jridgewell/source-map@^0.3.3": - version "0.3.5" - resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" - integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== - dependencies: - "@jridgewell/gen-mapping" "^0.3.0" - "@jridgewell/trace-mapping" "^0.3.9" - -"@jridgewell/sourcemap-codec@1.4.14": - version "1.4.14" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== - -"@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.15" - resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" - integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== - -"@jridgewell/sourcemap-codec@^1.4.14": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" - integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== - -"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.18" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" - integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - -"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": - version "0.3.25" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" - integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@leichtgewicht/ip-codec@^2.0.1": - version "2.0.4" - resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" - integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== - -"@mdx-js/mdx@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-1.6.22.tgz" - integrity sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA== - dependencies: - "@babel/core" "7.12.9" - "@babel/plugin-syntax-jsx" "7.12.1" - "@babel/plugin-syntax-object-rest-spread" "7.8.3" - "@mdx-js/util" "1.6.22" - babel-plugin-apply-mdx-type-prop "1.6.22" - babel-plugin-extract-import-names "1.6.22" - camelcase-css "2.0.1" - detab "2.0.4" - hast-util-raw "6.0.1" - lodash.uniq "4.5.0" - mdast-util-to-hast "10.0.1" - remark-footnotes "2.0.0" - remark-mdx "1.6.22" - remark-parse "8.0.3" - remark-squeeze-paragraphs "4.0.0" - style-to-object "0.3.0" - unified "9.2.0" - unist-builder "2.0.3" - unist-util-visit "2.0.3" - -"@mdx-js/react@^1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/react/-/react-1.6.22.tgz" - integrity sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg== - -"@mdx-js/util@1.6.22": - version "1.6.22" - resolved "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz" - integrity sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA== - -"@mui/core-downloads-tracker@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@mui/core-downloads-tracker/-/core-downloads-tracker-6.2.1.tgz#5e56311c5aeab91141a16edee95c1688536d75fc" - integrity sha512-U/8vS1+1XiHBnnRRESSG1gvr6JDHdPjrpnW6KEebkAQWBn6wrpbSF/XSZ8/vJIRXH5NyDmMHi4Ro5Q70//JKhA== - -"@mui/icons-material@^6.1.5": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@mui/icons-material/-/icons-material-6.2.1.tgz#9f92e0c8f33db871d6afa2232d0e2daa4545dbe3" - integrity sha512-bP0XtW+t5KFL+wjfQp2UctN/8CuWqF1qaxbYuCAsJhL+AzproM8gGOh2n8sNBcrjbVckzDNqaXqxdpn+OmoWug== - dependencies: - "@babel/runtime" "^7.26.0" - -"@mui/material@^6.1.5": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@mui/material/-/material-6.2.1.tgz#168f2a1f62d8955ddfc7b395b256ee7afa9bbf9d" - integrity sha512-7VlKGsRKsy1bOSOPaSNgpkzaL+0C7iWAVKd2KYyAvhR9fTLJtiAMpq+KuzgEh1so2mtvQERN0tZVIceWMiIesw== - dependencies: - "@babel/runtime" "^7.26.0" - "@mui/core-downloads-tracker" "^6.2.1" - "@mui/system" "^6.2.1" - "@mui/types" "^7.2.20" - "@mui/utils" "^6.2.1" - "@popperjs/core" "^2.11.8" - "@types/react-transition-group" "^4.4.12" - clsx "^2.1.1" - csstype "^3.1.3" - prop-types "^15.8.1" - react-is "^19.0.0" - react-transition-group "^4.4.5" - -"@mui/private-theming@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@mui/private-theming/-/private-theming-6.2.1.tgz#734a92654e645eb820383f2ce8ef813f8fa4bb25" - integrity sha512-u1y0gpcfrRRxCcIdVeU5eIvkinA82Q8ft178WUNYuoFQrsOrXdlBdZlRVi+eYuUFp1iXI55Cud7sMZZtETix5Q== - dependencies: - "@babel/runtime" "^7.26.0" - "@mui/utils" "^6.2.1" - prop-types "^15.8.1" - -"@mui/styled-engine@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@mui/styled-engine/-/styled-engine-6.2.1.tgz#47ce0d1ae7d32a36f4d459e15319a76aaf6f4a58" - integrity sha512-6R3OgYw6zgCZWFYYMfxDqpGfJA78mUTOIlUDmmJlr60ogVNCrM87X0pqx5TbZ2OwUyxlJxN9qFgRr+J9H6cOBg== - dependencies: - "@babel/runtime" "^7.26.0" - "@emotion/cache" "^11.13.5" - "@emotion/serialize" "^1.3.3" - "@emotion/sheet" "^1.4.0" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/system@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@mui/system/-/system-6.2.1.tgz#1bc267e0719741bd463a7bc9be4fd7ed8760836a" - integrity sha512-0lc8CbBP4WAAF+SmGMFJI9bpIyQvW3zvwIDzLsb26FIB/4Z0pO7qGe8mkAl0RM63Vb37899qxnThhHKgAAdy6w== - dependencies: - "@babel/runtime" "^7.26.0" - "@mui/private-theming" "^6.2.1" - "@mui/styled-engine" "^6.2.1" - "@mui/types" "^7.2.20" - "@mui/utils" "^6.2.1" - clsx "^2.1.1" - csstype "^3.1.3" - prop-types "^15.8.1" - -"@mui/types@^7.2.20": - version "7.2.20" - resolved "https://registry.yarnpkg.com/@mui/types/-/types-7.2.20.tgz#16d8c9178b42b62ba95bbedbda8f343feb373d1e" - integrity sha512-straFHD7L8v05l/N5vcWk+y7eL9JF0C2mtph/y4BPm3gn2Eh61dDwDB65pa8DLss3WJfDXYC7Kx5yjP0EmXpgw== - -"@mui/utils@^6.2.1": - version "6.2.1" - resolved "https://registry.yarnpkg.com/@mui/utils/-/utils-6.2.1.tgz#b89485bef828d66c09ae86ef0dde7e4f35bcffa5" - integrity sha512-ubLqGIMhKUH2TF/Um+wRzYXgAooQw35th+DPemGrTpgrZHpOgcnUDIDbwsk1e8iQiuJ3mV/ErTtcQrecmlj5cg== - dependencies: - "@babel/runtime" "^7.26.0" - "@mui/types" "^7.2.20" - "@types/prop-types" "^15.7.14" - clsx "^2.1.1" - prop-types "^15.8.1" - react-is "^19.0.0" - -"@next/env@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/env/-/env-15.1.2.tgz#fa36e47bbaa33b9ecac228aa786bb05bbc15351c" - integrity sha512-Hm3jIGsoUl6RLB1vzY+dZeqb+/kWPZ+h34yiWxW0dV87l8Im/eMOwpOA+a0L78U0HM04syEjXuRlCozqpwuojQ== - -"@next/swc-darwin-arm64@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.1.2.tgz#822265999fc76f828f4c671a5ef861b8e2c5213e" - integrity sha512-b9TN7q+j5/7+rGLhFAVZiKJGIASuo8tWvInGfAd8wsULjB1uNGRCj1z1WZwwPWzVQbIKWFYqc+9L7W09qwt52w== - -"@next/swc-darwin-x64@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-x64/-/swc-darwin-x64-15.1.2.tgz#78d277bce3d35c6e8d9ad423b6f5b0031aa9a1e2" - integrity sha512-caR62jNDUCU+qobStO6YJ05p9E+LR0EoXh1EEmyU69cYydsAy7drMcOlUlRtQihM6K6QfvNwJuLhsHcCzNpqtA== - -"@next/swc-linux-arm64-gnu@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.1.2.tgz#4d48c8c37da869b0fdbb51f3f3f71df7a3b6b1bb" - integrity sha512-fHHXBusURjBmN6VBUtu6/5s7cCeEkuGAb/ZZiGHBLVBXMBy4D5QpM8P33Or8JD1nlOjm/ZT9sEE5HouQ0F+hUA== - -"@next/swc-linux-arm64-musl@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.1.2.tgz#0efbaffc2bc3fad4a6458c91b1655b0c3d509577" - integrity sha512-9CF1Pnivij7+M3G74lxr+e9h6o2YNIe7QtExWq1KUK4hsOLTBv6FJikEwCaC3NeYTflzrm69E5UfwEAbV2U9/g== - -"@next/swc-linux-x64-gnu@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.1.2.tgz#fcdb19e2a7602f85f103190539d0cf42eca7f217" - integrity sha512-tINV7WmcTUf4oM/eN3Yuu/f8jQ5C6AkueZPKeALs/qfdfX57eNv4Ij7rt0SA6iZ8+fMobVfcFVv664Op0caCCg== - -"@next/swc-linux-x64-musl@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.1.2.tgz#06b09f1712498dd5c61fac10c56a09535469b4c4" - integrity sha512-jf2IseC4WRsGkzeUw/cK3wci9pxR53GlLAt30+y+B+2qAQxMw6WAC3QrANIKxkcoPU3JFh/10uFfmoMDF9JXKg== - -"@next/swc-win32-arm64-msvc@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.1.2.tgz#63159223241ff45e8df76b24fc979bbb933c74df" - integrity sha512-wvg7MlfnaociP7k8lxLX4s2iBJm4BrNiNFhVUY+Yur5yhAJHfkS8qPPeDEUH8rQiY0PX3u/P7Q/wcg6Mv6GSAA== - -"@next/swc-win32-x64-msvc@15.1.2": - version "15.1.2" - resolved "https://registry.yarnpkg.com/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.1.2.tgz#6e6b33b1d725c0e98fa76773fe437fb02ad6540b" - integrity sha512-D3cNA8NoT3aWISWmo7HF5Eyko/0OdOO+VagkoJuiTk7pyX3P/b+n8XA/MYvyR+xSVcbKn68B1rY9fgqjNISqzQ== - -"@nicolo-ribaudo/semver-v6@^6.3.3": - version "6.3.3" - resolved "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz" - integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== - -"@noble/ciphers@0.5.3": - version "0.5.3" - resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-0.5.3.tgz#48b536311587125e0d0c1535f73ec8375cd76b23" - integrity sha512-B0+6IIHiqEs3BPMT0hcRmHvEj2QHOLu+uwt+tqDDeVd0oyVzh7BPrDcPjRnV1PV/5LaknXJJQvOuRGR0zQJz+w== - -"@noble/ciphers@^1.0.0": - version "1.1.3" - resolved "https://registry.yarnpkg.com/@noble/ciphers/-/ciphers-1.1.3.tgz#eb27085aa7ce94d8c6eaeb64299bab0589920ec1" - integrity sha512-Ygv6WnWJHLLiW4fnNDC1z+i13bud+enXOFRBlpxI+NJliPWx5wdR+oWlTjLuBPTqjUjtHXtjkU6w3kuuH6upZA== - -"@noble/curves@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" - integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== - dependencies: - "@noble/hashes" "1.4.0" - -"@noble/curves@1.7.0", "@noble/curves@^1.3.0", "@noble/curves@^1.4.0", "@noble/curves@^1.6.0", "@noble/curves@~1.7.0": - version "1.7.0" - resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.7.0.tgz#0512360622439256df892f21d25b388f52505e45" - integrity sha512-UTMhXK9SeDhFJVrHeUJ5uZlI6ajXg10O6Ddocf9S6GjbSBVZsJo88HzKwXznNfGpMTRDyJkqMjNDPYgf0qFWnw== - dependencies: - "@noble/hashes" "1.6.0" - -"@noble/hashes@1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" - integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== - -"@noble/hashes@1.6.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.0.tgz#d4bfb516ad6e7b5111c216a5cc7075f4cf19e6c5" - integrity sha512-YUULf0Uk4/mAA89w+k3+yUYh6NrEvxZa5T6SY3wlMvE2chHkxFUUIDI8/XW1QSC357iA5pSnqt7XEhvFOqmDyQ== - -"@noble/hashes@1.6.1", "@noble/hashes@^1.2.0", "@noble/hashes@^1.4.0", "@noble/hashes@^1.5.0", "@noble/hashes@~1.6.0": - version "1.6.1" - resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.6.1.tgz#df6e5943edcea504bac61395926d6fd67869a0d5" - integrity sha512-pq5D8h10hHBjyqX+cfBm0i8JUXJ0UhczFc4r74zbuT9XgewFo2E3J1cOaGtdZynILNmQ685YWGzGE1Zv6io50w== - -"@nodelib/fs.scandir@2.1.5": - version "2.1.5" - resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" - integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== - dependencies: - "@nodelib/fs.stat" "2.0.5" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": - version "2.0.5" - resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" - integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.8" - resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" - integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== - dependencies: - "@nodelib/fs.scandir" "2.1.5" - fastq "^1.6.0" - -"@polka/url@^1.0.0-next.20": - version "1.0.0-next.21" - resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" - integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== - -"@popperjs/core@^2.11.8": - version "2.11.8" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" - integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== - -"@react-oauth/google@^0.12.1": - version "0.12.1" - resolved "https://registry.yarnpkg.com/@react-oauth/google/-/google-0.12.1.tgz#b76432c3a525e9afe076f787d2ded003fcc1bee9" - integrity sha512-qagsy22t+7UdkYAiT5ZhfM4StXi9PPNvw0zuwNmabrWyMKddczMtBIOARflbaIj+wHiQjnMAsZmzsUYuXeyoSg== - -"@redocly/ajv@^8.11.0": - version "8.11.0" - resolved "https://registry.npmjs.org/@redocly/ajv/-/ajv-8.11.0.tgz" - integrity sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -"@redocly/openapi-core@1.0.0-beta.123", "@redocly/openapi-core@^1.0.0-beta.104": - version "1.0.0-beta.123" - resolved "https://registry.npmjs.org/@redocly/openapi-core/-/openapi-core-1.0.0-beta.123.tgz" - integrity sha512-W6MbUWpb/VaV+Kf0c3jmMIJw3WwwF7iK5nAfcOS+ZwrlbxtIl37+1hEydFlJ209vCR9HL12PaMwdh2Vpihj6Jw== - dependencies: - "@redocly/ajv" "^8.11.0" - "@types/node" "^14.11.8" - colorette "^1.2.0" - js-levenshtein "^1.1.6" - js-yaml "^4.1.0" - lodash.isequal "^4.5.0" - minimatch "^5.0.1" - node-fetch "^2.6.1" - pluralize "^8.0.0" - yaml-ast-parser "0.0.43" - -"@scure/base@~1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@scure/base/-/base-1.2.1.tgz#dd0b2a533063ca612c17aa9ad26424a2ff5aa865" - integrity sha512-DGmGtC8Tt63J5GfHgfl5CuAXh96VF/LD8K9Hr/Gv0J2lAoRGlPOMpqMpMbCTOoOJMZCk2Xt+DskdDyn6dEFdzQ== - -"@scure/bip32@1.6.0", "@scure/bip32@^1.5.0": - version "1.6.0" - resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-1.6.0.tgz#6dbc6b4af7c9101b351f41231a879d8da47e0891" - integrity sha512-82q1QfklrUUdXJzjuRU7iG7D7XiFx5PHYVS0+oeNKhyDLT7WPqs6pBcM2W5ZdwOwKCwoE1Vy1se+DHjcXwCYnA== - dependencies: - "@noble/curves" "~1.7.0" - "@noble/hashes" "~1.6.0" - "@scure/base" "~1.2.1" - -"@scure/bip39@1.5.0", "@scure/bip39@^1.4.0": - version "1.5.0" - resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-1.5.0.tgz#c8f9533dbd787641b047984356531d84485f19be" - integrity sha512-Dop+ASYhnrwm9+HA/HwXg7j2ZqM6yk2fyLWb5znexjctFY3+E+eU8cIWI0Pql0Qx4hPZCijlGq4OL71g+Uz30A== - dependencies: - "@noble/hashes" "~1.6.0" - "@scure/base" "~1.2.1" - -"@sideway/address@^4.1.3": - version "4.1.4" - resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" - integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== - dependencies: - "@hapi/hoek" "^9.0.0" - -"@sideway/formula@^3.0.1": - version "3.0.1" - resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" - integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== - -"@sideway/pinpoint@^2.0.0": - version "2.0.0" - resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" - integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== - -"@sinclair/typebox@^0.27.8": - version "0.27.8" - resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" - integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== - -"@sindresorhus/is@^0.14.0": - version "0.14.0" - resolved "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz" - integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== - -"@slorber/static-site-generator-webpack-plugin@^4.0.7": - version "4.0.7" - resolved "https://registry.npmjs.org/@slorber/static-site-generator-webpack-plugin/-/static-site-generator-webpack-plugin-4.0.7.tgz" - integrity sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA== - dependencies: - eval "^0.1.8" - p-map "^4.0.0" - webpack-sources "^3.2.2" - -"@svgr/babel-plugin-add-jsx-attribute@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.5.1.tgz" - integrity sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ== - -"@svgr/babel-plugin-remove-jsx-attribute@*": - version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz" - integrity sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA== - -"@svgr/babel-plugin-remove-jsx-empty-expression@*": - version "8.0.0" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz" - integrity sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA== - -"@svgr/babel-plugin-replace-jsx-attribute-value@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.5.1.tgz" - integrity sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg== - -"@svgr/babel-plugin-svg-dynamic-title@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.5.1.tgz" - integrity sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw== - -"@svgr/babel-plugin-svg-em-dimensions@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.5.1.tgz" - integrity sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA== - -"@svgr/babel-plugin-transform-react-native-svg@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.5.1.tgz" - integrity sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg== - -"@svgr/babel-plugin-transform-svg-component@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.5.1.tgz" - integrity sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ== - -"@svgr/babel-preset@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.5.1.tgz" - integrity sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw== - dependencies: - "@svgr/babel-plugin-add-jsx-attribute" "^6.5.1" - "@svgr/babel-plugin-remove-jsx-attribute" "*" - "@svgr/babel-plugin-remove-jsx-empty-expression" "*" - "@svgr/babel-plugin-replace-jsx-attribute-value" "^6.5.1" - "@svgr/babel-plugin-svg-dynamic-title" "^6.5.1" - "@svgr/babel-plugin-svg-em-dimensions" "^6.5.1" - "@svgr/babel-plugin-transform-react-native-svg" "^6.5.1" - "@svgr/babel-plugin-transform-svg-component" "^6.5.1" - -"@svgr/core@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/core/-/core-6.5.1.tgz" - integrity sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - camelcase "^6.2.0" - cosmiconfig "^7.0.1" - -"@svgr/hast-util-to-babel-ast@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.5.1.tgz" - integrity sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw== - dependencies: - "@babel/types" "^7.20.0" - entities "^4.4.0" - -"@svgr/plugin-jsx@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.5.1.tgz" - integrity sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw== - dependencies: - "@babel/core" "^7.19.6" - "@svgr/babel-preset" "^6.5.1" - "@svgr/hast-util-to-babel-ast" "^6.5.1" - svg-parser "^2.0.4" - -"@svgr/plugin-svgo@^6.5.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.5.1.tgz" - integrity sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ== - dependencies: - cosmiconfig "^7.0.1" - deepmerge "^4.2.2" - svgo "^2.8.0" - -"@svgr/webpack@^6.2.1": - version "6.5.1" - resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.5.1.tgz" - integrity sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA== - dependencies: - "@babel/core" "^7.19.6" - "@babel/plugin-transform-react-constant-elements" "^7.18.12" - "@babel/preset-env" "^7.19.4" - "@babel/preset-react" "^7.18.6" - "@babel/preset-typescript" "^7.18.6" - "@svgr/core" "^6.5.1" - "@svgr/plugin-jsx" "^6.5.1" - "@svgr/plugin-svgo" "^6.5.1" - -"@swc/counter@0.1.3": - version "0.1.3" - resolved "https://registry.yarnpkg.com/@swc/counter/-/counter-0.1.3.tgz#cc7463bd02949611c6329596fccd2b0ec782b0e9" - integrity sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== - -"@swc/helpers@0.5.15": - version "0.5.15" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.15.tgz#79efab344c5819ecf83a43f3f9f811fc84b516d7" - integrity sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g== - dependencies: - tslib "^2.8.0" - -"@szmarczak/http-timer@^1.1.2": - version "1.1.2" - resolved "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz" - integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== - dependencies: - defer-to-connect "^1.0.1" - -"@trysound/sax@0.2.0": - version "0.2.0" - resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" - integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== - -"@tsconfig/docusaurus@^1.0.5": - version "1.0.7" - resolved "https://registry.npmjs.org/@tsconfig/docusaurus/-/docusaurus-1.0.7.tgz" - integrity sha512-ffTXxGIP/IRMCjuzHd6M4/HdIrw1bMfC7Bv8hMkTadnePkpe0lG0oDSdbRpSDZb2rQMAgpbWiR10BvxvNYwYrg== - -"@turnkey/api-key-stamper@0.4.3": - version "0.4.3" - resolved "https://registry.yarnpkg.com/@turnkey/api-key-stamper/-/api-key-stamper-0.4.3.tgz#27e79978d07395b2ac4cfda1d1f45f0d12a582c1" - integrity sha512-K0U87qq91z/W5H86MV3kQtdU2x+hFNoyT1BMa9z4CDbphnlvjxg6FVvAKaf7aM40IN/sQfDOb8EwxQIlwXFMjA== - dependencies: - "@noble/curves" "^1.3.0" - "@turnkey/encoding" "0.4.0" - sha256-uint8array "^0.10.7" - -"@turnkey/crypto@2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@turnkey/crypto/-/crypto-2.3.0.tgz#6cc8a4f9876558834d570f5eac6a070e7f581d76" - integrity sha512-RdsSn9nKzr2Ik8TssvQ6qwPuUzUfbV+G0u3XYTaGxAHS8ifWtgvwkiWRLRqy0Y89xh7GaU+OmFjwCO9qwBoWfQ== - dependencies: - "@noble/ciphers" "0.5.3" - "@noble/curves" "1.4.0" - "@noble/hashes" "1.4.0" - "@turnkey/encoding" "0.4.0" - bs58 "^5.0.0" - bs58check "3.0.1" - -"@turnkey/encoding@0.4.0": - version "0.4.0" - resolved "https://registry.yarnpkg.com/@turnkey/encoding/-/encoding-0.4.0.tgz#9d06efe6447322bcc9eb4d51b48961054a3c102d" - integrity sha512-ptLgcpWVt34KTPx0omF2QLJrosW6I//clCJ4G2+yngYFCzrdR0yBchV/BOcfME67mK1v3MmauyXl9AAnQTmB4Q== - -"@turnkey/http@2.17.1": - version "2.17.1" - resolved "https://registry.yarnpkg.com/@turnkey/http/-/http-2.17.1.tgz#26a963ffcc68466f77f1e9c5c22b6a9718e73122" - integrity sha512-qFYcfvLT90S2+f8tOegTRgvkO1St1YoWTfmpL+wWPPXHuse/z+zn5HEBHmtUm/olwv6Ur+AccKzhVbU/+Xw/MA== - dependencies: - "@turnkey/api-key-stamper" "0.4.3" - "@turnkey/encoding" "0.4.0" - "@turnkey/webauthn-stamper" "0.5.0" - cross-fetch "^3.1.5" - -"@turnkey/iframe-stamper@2.0.0": - version "2.0.0" - resolved "https://registry.yarnpkg.com/@turnkey/iframe-stamper/-/iframe-stamper-2.0.0.tgz#9cbd30457c8c5d6bec913b870755c5cda7e47c6a" - integrity sha512-14IPfloVCV3ngoxsy3KoEUbEtYYxPU5H6T4WcNzY8Z67A1NJZfipk6pTaN5h3efkUm208G2TvDd63sZOdbyuxQ== - -"@turnkey/sdk-browser@1.11.0": - version "1.11.0" - resolved "https://registry.yarnpkg.com/@turnkey/sdk-browser/-/sdk-browser-1.11.0.tgz#7023f007eeba3e1bfb2e309e20ab4822cff42e25" - integrity sha512-oMuo9Lj0UZnwD6Pen53g62QeEy+Ax70KZc2XX/Ui4kpFWmF1QsagWaLKTKXk8ZP3c1LURqKA17Kv+L3mUo2DhA== - dependencies: - "@turnkey/api-key-stamper" "0.4.3" - "@turnkey/crypto" "2.3.0" - "@turnkey/encoding" "0.4.0" - "@turnkey/http" "2.17.1" - "@turnkey/iframe-stamper" "2.0.0" - "@turnkey/wallet-stamper" "1.0.2" - "@turnkey/webauthn-stamper" "0.5.0" - bs58check "^3.0.1" - buffer "^6.0.3" - cross-fetch "^3.1.5" - elliptic "^6.5.5" - hpke-js "^1.2.7" - -"@turnkey/sdk-react@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@turnkey/sdk-react/-/sdk-react-2.0.2.tgz#def3a264071decae6914c1a6cba88a413345faf3" - integrity sha512-dNfUTLr6+ItWOgbxpI5UOZnESkclWXvgWQm2deAg/RiwjTiFmUPGukbxmTqjHrAuLtMpfFNRE0lwrGELYftV0w== - dependencies: - "@emotion/react" "^11.13.3" - "@emotion/styled" "^11.13.0" - "@icons-pack/react-simple-icons" "^10.1.0" - "@mui/icons-material" "^6.1.5" - "@mui/material" "^6.1.5" - "@noble/hashes" "1.4.0" - "@react-oauth/google" "^0.12.1" - "@turnkey/crypto" "2.3.0" - "@turnkey/sdk-browser" "1.11.0" - "@turnkey/sdk-server" "1.7.1" - "@turnkey/wallet-stamper" "1.0.2" - libphonenumber-js "^1.11.14" - next "^15.0.2" - react-apple-login "^1.1.6" - react-international-phone "^4.3.0" - usehooks-ts "^3.1.0" - -"@turnkey/sdk-server@1.7.1": - version "1.7.1" - resolved "https://registry.yarnpkg.com/@turnkey/sdk-server/-/sdk-server-1.7.1.tgz#d008f81efe6accdbb4781a686b39fda4c3c7d279" - integrity sha512-f2oLDK7bXv8E61xhWmritga5NXm4AojiNlBZjN7bRdEy06x5vE15d2vY/OzOEaa943gKeZRWgo53CSLQRfsTvg== - dependencies: - "@turnkey/api-key-stamper" "0.4.3" - "@turnkey/http" "2.17.1" - buffer "^6.0.3" - cross-fetch "^3.1.5" - elliptic "^6.5.5" - -"@turnkey/wallet-stamper@1.0.2": - version "1.0.2" - resolved "https://registry.yarnpkg.com/@turnkey/wallet-stamper/-/wallet-stamper-1.0.2.tgz#7bf2048d34c1b1dfffb64a7dd1eda3492979436b" - integrity sha512-C4Lup8yN90Qn3HUTCZ0RiRwIWT1y9oqV5wqXmYaBPlaV52DC0N3LJl20Nh3vZu9Had79Rnz/OBm+ZWDAHi5SCg== - dependencies: - "@turnkey/crypto" "2.3.0" - "@turnkey/encoding" "0.4.0" - optionalDependencies: - viem "^2.21.35" - -"@turnkey/webauthn-stamper@0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@turnkey/webauthn-stamper/-/webauthn-stamper-0.5.0.tgz#014b8c20b1732af49dacb04f396edf010d3b7f47" - integrity sha512-iUbTUwD4f4ibdLy5PWWb7ITEz4S4VAP9/mNjFhoRY3cKVVTDfmykrVTKjPOIHWzDgAmLtgrLvySIIC9ZBVENBw== - dependencies: - sha256-uint8array "^0.10.7" - -"@types/body-parser@*": - version "1.19.2" - resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" - integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== - dependencies: - "@types/connect" "*" - "@types/node" "*" - -"@types/bonjour@^3.5.9": - version "3.5.10" - resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" - integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== - dependencies: - "@types/node" "*" - -"@types/connect-history-api-fallback@^1.3.5": - version "1.5.0" - resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz" - integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== - dependencies: - "@types/express-serve-static-core" "*" - "@types/node" "*" - -"@types/connect@*": - version "3.4.35" - resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" - integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== - dependencies: - "@types/node" "*" - -"@types/eslint-scope@^3.7.3": - version "3.7.4" - resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" - integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== - dependencies: - "@types/eslint" "*" - "@types/estree" "*" - -"@types/eslint@*": - version "8.44.0" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.0.tgz" - integrity sha512-gsF+c/0XOguWgaOgvFs+xnnRqt9GwgTvIks36WpE6ueeI4KCEHHd8K/CKHqhOqrJKsYH8m27kRzQEvWXAwXUTw== - dependencies: - "@types/estree" "*" - "@types/json-schema" "*" - -"@types/estree@*", "@types/estree@^1.0.0": - version "1.0.1" - resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" - integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== - -"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": - version "4.17.35" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" - integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== - dependencies: - "@types/node" "*" - "@types/qs" "*" - "@types/range-parser" "*" - "@types/send" "*" - -"@types/express@*", "@types/express@^4.17.13": - version "4.17.17" - resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" - integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== - dependencies: - "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.33" - "@types/qs" "*" - "@types/serve-static" "*" - -"@types/hast@^2.0.0": - version "2.3.5" - resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.5.tgz" - integrity sha512-SvQi0L/lNpThgPoleH53cdjB3y9zpLlVjRbqB3rH8hx1jiRSBGAhyjV3H+URFjNVRqt2EdYNrbZE5IsGlNfpRg== - dependencies: - "@types/unist" "^2" - -"@types/history@^4.7.11": - version "4.7.11" - resolved "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz" - integrity sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA== - -"@types/html-minifier-terser@^6.0.0": - version "6.1.0" - resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== - -"@types/http-errors@*": - version "2.0.1" - resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz" - integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== - -"@types/http-proxy@^1.17.8": - version "1.17.11" - resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz" - integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== - dependencies: - "@types/node" "*" - -"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": - version "2.0.4" - resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== - -"@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== - dependencies: - "@types/istanbul-lib-coverage" "*" - -"@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== - dependencies: - "@types/istanbul-lib-report" "*" - -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": - version "7.0.12" - resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" - integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== - -"@types/mdast@^3.0.0": - version "3.0.12" - resolved "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.12.tgz" - integrity sha512-DT+iNIRNX884cx0/Q1ja7NyUPpZuv0KPyL5rGNxm1WC1OtHstl7n4Jb7nk+xacNShQMbczJjt8uFzznpp6kYBg== - dependencies: - "@types/unist" "^2" - -"@types/mime@*", "@types/mime@^1": - version "1.3.2" - resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" - integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== - -"@types/node@*": - version "20.4.1" - resolved "https://registry.npmjs.org/@types/node/-/node-20.4.1.tgz" - integrity sha512-JIzsAvJeA/5iY6Y/OxZbv1lUcc8dNSE77lb2gnBH+/PJ3lFR1Ccvgwl5JWnHAkNHcRsT0TbpVOsiMKZ1F/yyJg== - -"@types/node@^14.11.8": - version "14.18.63" - resolved "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz" - integrity sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ== - -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.npmjs.org/@types/node/-/node-17.0.45.tgz" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - -"@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== - -"@types/parse5@^5.0.0": - version "5.0.3" - resolved "https://registry.npmjs.org/@types/parse5/-/parse5-5.0.3.tgz" - integrity sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw== - -"@types/prop-types@*": - version "15.7.5" - resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== - -"@types/prop-types@^15.7.14": - version "15.7.14" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.14.tgz#1433419d73b2a7ebfc6918dcefd2ec0d5cd698f2" - integrity sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ== - -"@types/qs@*": - version "6.9.7" - resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" - integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== - -"@types/range-parser@*": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" - integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== - -"@types/react-router-config@*", "@types/react-router-config@^5.0.6": - version "5.0.7" - resolved "https://registry.npmjs.org/@types/react-router-config/-/react-router-config-5.0.7.tgz" - integrity sha512-pFFVXUIydHlcJP6wJm7sDii5mD/bCmmAY0wQzq+M+uX7bqS95AQqHZWP1iNMKrWVQSuHIzj5qi9BvrtLX2/T4w== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "^5.1.0" - -"@types/react-router-dom@*": - version "5.3.3" - resolved "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz" - integrity sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - "@types/react-router" "*" - -"@types/react-router@*", "@types/react-router@^5.1.0": - version "5.1.20" - resolved "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz" - integrity sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q== - dependencies: - "@types/history" "^4.7.11" - "@types/react" "*" - -"@types/react-transition-group@^4.4.12": - version "4.4.12" - resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.12.tgz#b5d76568485b02a307238270bfe96cb51ee2a044" - integrity sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w== - -"@types/react@*": - version "18.2.14" - resolved "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz" - integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== - dependencies: - "@types/prop-types" "*" - "@types/scheduler" "*" - csstype "^3.0.2" - -"@types/retry@0.12.0": - version "0.12.0" - resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" - integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== - -"@types/sax@^1.2.1": - version "1.2.4" - resolved "https://registry.npmjs.org/@types/sax/-/sax-1.2.4.tgz" - integrity sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw== - dependencies: - "@types/node" "*" - -"@types/scheduler@*": - version "0.16.3" - resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" - integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== - -"@types/send@*": - version "0.17.1" - resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" - integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== - dependencies: - "@types/mime" "^1" - "@types/node" "*" - -"@types/serve-index@^1.9.1": - version "1.9.1" - resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== - dependencies: - "@types/express" "*" - -"@types/serve-static@*", "@types/serve-static@^1.13.10": - version "1.15.2" - resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz" - integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== - dependencies: - "@types/http-errors" "*" - "@types/mime" "*" - "@types/node" "*" - -"@types/sockjs@^0.3.33": - version "0.3.33" - resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" - integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== - dependencies: - "@types/node" "*" - -"@types/unist@^2", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": - version "2.0.7" - resolved "https://registry.npmjs.org/@types/unist/-/unist-2.0.7.tgz" - integrity sha512-cputDpIbFgLUaGQn6Vqg3/YsJwxUwHLO13v3i5ouxT4lat0khip9AEWxtERujXV9wxIB1EyF97BSJFt6vpdI8g== - -"@types/ws@^8.5.5": - version "8.5.5" - resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz" - integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== - dependencies: - "@types/node" "*" - -"@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== - -"@types/yargs@^17.0.8": - version "17.0.24" - resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" - integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== - dependencies: - "@types/yargs-parser" "*" - -"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" - integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== - dependencies: - "@webassemblyjs/helper-numbers" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - -"@webassemblyjs/floating-point-hex-parser@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" - integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== - -"@webassemblyjs/helper-api-error@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" - integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== - -"@webassemblyjs/helper-buffer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" - integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== - -"@webassemblyjs/helper-numbers@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" - integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== - dependencies: - "@webassemblyjs/floating-point-hex-parser" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@xtuc/long" "4.2.2" - -"@webassemblyjs/helper-wasm-bytecode@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" - integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== - -"@webassemblyjs/helper-wasm-section@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" - integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - -"@webassemblyjs/ieee754@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" - integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== - dependencies: - "@xtuc/ieee754" "^1.2.0" - -"@webassemblyjs/leb128@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" - integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== - dependencies: - "@xtuc/long" "4.2.2" - -"@webassemblyjs/utf8@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" - integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== - -"@webassemblyjs/wasm-edit@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" - integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/helper-wasm-section" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-opt" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - "@webassemblyjs/wast-printer" "1.11.6" - -"@webassemblyjs/wasm-gen@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" - integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wasm-opt@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" - integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-buffer" "1.11.6" - "@webassemblyjs/wasm-gen" "1.11.6" - "@webassemblyjs/wasm-parser" "1.11.6" - -"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" - integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@webassemblyjs/helper-api-error" "1.11.6" - "@webassemblyjs/helper-wasm-bytecode" "1.11.6" - "@webassemblyjs/ieee754" "1.11.6" - "@webassemblyjs/leb128" "1.11.6" - "@webassemblyjs/utf8" "1.11.6" - -"@webassemblyjs/wast-printer@1.11.6": - version "1.11.6" - resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" - integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== - dependencies: - "@webassemblyjs/ast" "1.11.6" - "@xtuc/long" "4.2.2" - -"@xtuc/ieee754@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" - integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== - -"@xtuc/long@4.2.2": - version "4.2.2" - resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" - integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== - -abitype@1.0.7: - version "1.0.7" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.7.tgz#876a0005d211e1c9132825d45bcee7b46416b284" - integrity sha512-ZfYYSktDQUwc2eduYu8C4wOs+RDPmnRYMh7zNfzeMtGGgb0U+6tLGjixUic6mXf5xKKCcgT5Qp6cv39tOARVFw== - -abitype@^1.0.6: - version "1.0.8" - resolved "https://registry.yarnpkg.com/abitype/-/abitype-1.0.8.tgz#3554f28b2e9d6e9f35eb59878193eabd1b9f46ba" - integrity sha512-ZeiI6h3GnW06uYDLx0etQtX/p8E24UaHHBj57RSjK7YBFe7iuVn07EDpOeP451D06sF27VOz9JJPlIKJmXgkEg== - -accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: - version "1.3.8" - resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" - integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== - dependencies: - mime-types "~2.1.34" - negotiator "0.6.3" - -acorn-import-assertions@^1.9.0: - version "1.9.0" - resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" - integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== - -acorn-walk@^8.0.0: - version "8.2.0" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== - -acorn@^8.0.4, acorn@^8.7.1, acorn@^8.8.2: - version "8.10.0" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" - integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== - -address@^1.0.1, address@^1.1.2: - version "1.2.2" - resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" - integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== - -aggregate-error@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" - integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== - dependencies: - clean-stack "^2.0.0" - indent-string "^4.0.0" - -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - -ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: - version "3.5.2" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" - integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== - -ajv-keywords@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" - integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== - dependencies: - fast-deep-equal "^3.1.3" - -ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^8.0.0, ajv@^8.9.0: - version "8.12.0" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" - integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== - dependencies: - fast-deep-equal "^3.1.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - uri-js "^4.2.2" - -algoliasearch-helper@^3.10.0: - version "3.13.3" - resolved "https://registry.npmjs.org/algoliasearch-helper/-/algoliasearch-helper-3.13.3.tgz" - integrity sha512-jhbbuYZ+fheXpaJlqdJdFa1jOsrTWKmRRTYDM3oVTto5VodZzM7tT+BHzslAotaJf/81CKrm6yLRQn8WIr/K4A== - dependencies: - "@algolia/events" "^4.0.1" - -algoliasearch@^4.0.0, algoliasearch@^4.13.1: - version "4.18.0" - resolved "https://registry.npmjs.org/algoliasearch/-/algoliasearch-4.18.0.tgz" - integrity sha512-pCuVxC1SVcpc08ENH32T4sLKSyzoU7TkRIDBMwSLfIiW+fq4znOmWDkAygHZ6pRcO9I1UJdqlfgnV7TRj+MXrA== - 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" - -ansi-align@^3.0.0, ansi-align@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz" - integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== - dependencies: - string-width "^4.1.0" - -ansi-html-community@^0.0.8: - version "0.0.8" - resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" - integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== - -ansi-regex@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" - integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== - -ansi-regex@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" - integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== - -ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" - integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== - dependencies: - color-convert "^1.9.0" - -ansi-styles@^4.0.0, ansi-styles@^4.1.0: - version "4.3.0" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -anymatch@~3.1.2: - version "3.1.3" - resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" - integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== - dependencies: - normalize-path "^3.0.0" - picomatch "^2.0.4" - -arg@^5.0.0: - version "5.0.2" - resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" - integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== - -argparse@^1.0.7: - version "1.0.10" - resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" - integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== - dependencies: - sprintf-js "~1.0.2" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-flatten@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" - integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== - -array-flatten@^2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" - integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -asap@~2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" - integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== - -at-least-node@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" - integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== - -autoprefixer@^10.4.12, autoprefixer@^10.4.7: - version "10.4.14" - resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" - integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== - dependencies: - browserslist "^4.21.5" - caniuse-lite "^1.0.30001464" - fraction.js "^4.2.0" - normalize-range "^0.1.2" - picocolors "^1.0.0" - postcss-value-parser "^4.2.0" - -axios@^0.25.0: - version "0.25.0" - resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" - integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== - dependencies: - follow-redirects "^1.14.7" - -babel-loader@^8.2.5: - version "8.3.0" - resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" - integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== - dependencies: - find-cache-dir "^3.3.1" - loader-utils "^2.0.0" - make-dir "^3.1.0" - schema-utils "^2.6.5" - -babel-plugin-apply-mdx-type-prop@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-apply-mdx-type-prop/-/babel-plugin-apply-mdx-type-prop-1.6.22.tgz" - integrity sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - "@mdx-js/util" "1.6.22" - -babel-plugin-dynamic-import-node@^2.3.3: - version "2.3.3" - resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz" - integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ== - dependencies: - object.assign "^4.1.0" - -babel-plugin-extract-import-names@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/babel-plugin-extract-import-names/-/babel-plugin-extract-import-names-1.6.22.tgz" - integrity sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ== - dependencies: - "@babel/helper-plugin-utils" "7.10.4" - -babel-plugin-macros@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" - integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== - dependencies: - "@babel/runtime" "^7.12.5" - cosmiconfig "^7.0.0" - resolve "^1.19.0" - -babel-plugin-polyfill-corejs2@^0.4.4: - version "0.4.4" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz" - integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.1" - "@nicolo-ribaudo/semver-v6" "^6.3.3" - -babel-plugin-polyfill-corejs3@^0.8.2: - version "0.8.2" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz" - integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" - core-js-compat "^3.31.0" - -babel-plugin-polyfill-regenerator@^0.5.1: - version "0.5.1" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz" - integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.1" - -"babel-plugin-styled-components@>= 1.12.0": - version "2.1.4" - resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz" - integrity sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-module-imports" "^7.22.5" - "@babel/plugin-syntax-jsx" "^7.22.5" - lodash "^4.17.21" - picomatch "^2.3.1" - -bail@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz" - integrity sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ== - -balanced-match@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" - integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== - -base-x@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" - integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== - -base16@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/base16/-/base16-1.0.0.tgz" - integrity sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ== - -base64-js@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" - integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== - -batch@0.6.1: - version "0.6.1" - resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" - integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== - -big.js@^5.2.2: - version "5.2.2" - resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" - integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== - -binary-extensions@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" - integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== - -bn.js@^4.11.9: - version "4.12.1" - resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.1.tgz#215741fe3c9dba2d7e12c001d0cfdbae43975ba7" - integrity sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg== - -body-parser@1.20.1: - version "1.20.1" - resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" - integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== - dependencies: - bytes "3.1.2" - content-type "~1.0.4" - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - http-errors "2.0.0" - iconv-lite "0.4.24" - on-finished "2.4.1" - qs "6.11.0" - raw-body "2.5.1" - type-is "~1.6.18" - unpipe "1.0.0" - -bonjour-service@^1.0.11: - version "1.1.1" - resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" - integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== - dependencies: - array-flatten "^2.1.2" - dns-equal "^1.0.0" - fast-deep-equal "^3.1.3" - multicast-dns "^7.2.5" - -boolbase@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" - integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== - -boxen@^5.0.0: - version "5.1.2" - resolved "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz" - integrity sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ== - dependencies: - ansi-align "^3.0.0" - camelcase "^6.2.0" - chalk "^4.1.0" - cli-boxes "^2.2.1" - string-width "^4.2.2" - type-fest "^0.20.2" - widest-line "^3.1.0" - wrap-ansi "^7.0.0" - -boxen@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/boxen/-/boxen-6.2.1.tgz" - integrity sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw== - dependencies: - ansi-align "^3.0.1" - camelcase "^6.2.0" - chalk "^4.1.2" - cli-boxes "^3.0.0" - string-width "^5.0.1" - type-fest "^2.5.0" - widest-line "^4.0.1" - wrap-ansi "^8.0.1" - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== - dependencies: - balanced-match "^1.0.0" - -braces@^3.0.2, braces@~3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -brorand@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" - integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== - -browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9: - version "4.21.9" - resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" - integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== - dependencies: - caniuse-lite "^1.0.30001503" - electron-to-chromium "^1.4.431" - node-releases "^2.0.12" - update-browserslist-db "^1.0.11" - -bs58@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" - integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== - dependencies: - base-x "^4.0.0" - -bs58check@3.0.1, bs58check@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/bs58check/-/bs58check-3.0.1.tgz#2094d13720a28593de1cba1d8c4e48602fdd841c" - integrity sha512-hjuuJvoWEybo7Hn/0xOrczQKKEKD63WguEjlhLExYs2wUBcebDC1jDNK17eEAD2lYfw82d5ASC1d7K3SWszjaQ== - dependencies: - "@noble/hashes" "^1.2.0" - bs58 "^5.0.0" - -buffer-from@^1.0.0: - version "1.1.2" - resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" - integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== - -buffer@^6.0.3: - version "6.0.3" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" - integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== - dependencies: - base64-js "^1.3.1" - ieee754 "^1.2.1" - -busboy@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/busboy/-/busboy-1.6.0.tgz#966ea36a9502e43cdb9146962523b92f531f6893" - integrity sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA== - dependencies: - streamsearch "^1.1.0" - -bytes@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" - integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== - -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - -cacheable-request@^6.0.0: - version "6.1.0" - resolved "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz" - integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== - dependencies: - clone-response "^1.0.2" - get-stream "^5.1.0" - http-cache-semantics "^4.0.0" - keyv "^3.0.0" - lowercase-keys "^2.0.0" - normalize-url "^4.1.0" - responselike "^1.0.2" - -call-bind@^1.0.0, call-bind@^1.0.5: - version "1.0.7" - resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz" - integrity sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - set-function-length "^1.2.1" - -call-me-maybe@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz" - integrity sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ== - -callsites@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" - integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== - -camel-case@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" - integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== - dependencies: - pascal-case "^3.1.2" - tslib "^2.0.3" - -camelcase-css@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz" - integrity sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA== - -camelcase@^6.2.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - -camelize@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz" - integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== - -caniuse-api@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" - integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== - dependencies: - browserslist "^4.0.0" - caniuse-lite "^1.0.0" - lodash.memoize "^4.1.2" - lodash.uniq "^4.5.0" - -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: - version "1.0.30001515" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001515.tgz" - integrity sha512-eEFDwUOZbE24sb+Ecsx3+OvNETqjWIdabMy52oOkIgcUtAsQifjUG9q4U9dgTHJM2mfk4uEPxc0+xuFdJ629QA== - -caniuse-lite@^1.0.30001579: - version "1.0.30001690" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz#f2d15e3aaf8e18f76b2b8c1481abde063b8104c8" - integrity sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w== - -ccount@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz" - integrity sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg== - -chalk@^2.0.0: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - -chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -character-entities-legacy@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" - integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== - -character-entities@^1.0.0: - version "1.2.4" - resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" - integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== - -character-reference-invalid@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" - integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== - -cheerio-select@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" - integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== - dependencies: - boolbase "^1.0.0" - css-select "^5.1.0" - css-what "^6.1.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - -cheerio@^1.0.0-rc.12: - version "1.0.0-rc.12" - resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" - integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== - dependencies: - cheerio-select "^2.1.0" - dom-serializer "^2.0.0" - domhandler "^5.0.3" - domutils "^3.0.1" - htmlparser2 "^8.0.1" - parse5 "^7.0.0" - parse5-htmlparser2-tree-adapter "^7.0.0" - -chokidar@^3.4.2, chokidar@^3.5.3: - version "3.5.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" - integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== - dependencies: - anymatch "~3.1.2" - braces "~3.0.2" - glob-parent "~5.1.2" - is-binary-path "~2.1.0" - is-glob "~4.0.1" - normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chrome-trace-event@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" - integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== - -ci-info@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz" - integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== - -ci-info@^3.2.0: - version "3.8.0" - resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" - integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== - -classnames@^2.3.1: - version "2.3.2" - resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" - integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== - -clean-css@^5.2.2, clean-css@^5.3.0: - version "5.3.2" - resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" - integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== - dependencies: - source-map "~0.6.0" - -clean-stack@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz" - integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== - -cli-boxes@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz" - integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== - -cli-boxes@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cli-boxes/-/cli-boxes-3.0.0.tgz" - integrity sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g== - -cli-table3@^0.6.2: - version "0.6.3" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.3.tgz" - integrity sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - -client-only@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" - integrity sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA== - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -cliui@^8.0.1: - version "8.0.1" - resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" - integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.1" - wrap-ansi "^7.0.0" - -clone-deep@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" - integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== - dependencies: - is-plain-object "^2.0.4" - kind-of "^6.0.2" - shallow-clone "^3.0.0" - -clone-response@^1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz" - integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== - dependencies: - mimic-response "^1.0.0" - -clsx@^1.1.0, clsx@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" - integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== - -clsx@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999" - integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA== - -collapse-white-space@^1.0.2: - version "1.0.6" - resolved "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz" - integrity sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ== - -color-convert@^1.9.0: - version "1.9.3" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" - integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.9.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" - integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" - integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== - dependencies: - color-convert "^2.0.1" - color-string "^1.9.0" - -colord@^2.9.1: - version "2.9.3" - resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" - integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== - -colorette@^1.2.0: - version "1.4.0" - resolved "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz" - integrity sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g== - -colorette@^2.0.10: - version "2.0.20" - resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" - integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== - -combine-promises@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/combine-promises/-/combine-promises-1.1.0.tgz" - integrity sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg== - -comma-separated-tokens@^1.0.0: - version "1.0.8" - resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" - integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== - -commander@^2.20.0: - version "2.20.3" - resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" - integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== - -commander@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" - integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== - -commander@^7.2.0: - version "7.2.0" - resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" - integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== - -commander@^8.3.0: - version "8.3.0" - resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" - integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== - -commondir@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" - integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== - -compressible@~2.0.16: - version "2.0.18" - resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" - integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== - dependencies: - mime-db ">= 1.43.0 < 2" - -compression@^1.7.4: - version "1.7.4" - resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" - integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== - dependencies: - accepts "~1.3.5" - bytes "3.0.0" - compressible "~2.0.16" - debug "2.6.9" - on-headers "~1.0.2" - safe-buffer "5.1.2" - vary "~1.1.2" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - -configstore@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz" - integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== - dependencies: - dot-prop "^5.2.0" - graceful-fs "^4.1.2" - make-dir "^3.0.0" - unique-string "^2.0.0" - write-file-atomic "^3.0.0" - xdg-basedir "^4.0.0" - -connect-history-api-fallback@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" - integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== - -consola@^2.15.3: - version "2.15.3" - resolved "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz" - integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw== - -content-disposition@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz" - integrity sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA== - -content-disposition@0.5.4: - version "0.5.4" - resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" - integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== - dependencies: - safe-buffer "5.2.1" - -content-type@~1.0.4: - version "1.0.5" - resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" - integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== - -convert-source-map@^1.5.0, convert-source-map@^1.7.0: - version "1.9.0" - resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" - integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== - -cookie-signature@1.0.6: - version "1.0.6" - resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" - integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== - -cookie@0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" - integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== - -copy-text-to-clipboard@^3.0.1: - version "3.2.0" - resolved "https://registry.npmjs.org/copy-text-to-clipboard/-/copy-text-to-clipboard-3.2.0.tgz" - integrity sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q== - -copy-webpack-plugin@^11.0.0: - version "11.0.0" - resolved "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-11.0.0.tgz" - integrity sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ== - dependencies: - fast-glob "^3.2.11" - glob-parent "^6.0.1" - globby "^13.1.1" - normalize-path "^3.0.0" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - -copyfiles@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/copyfiles/-/copyfiles-2.4.1.tgz" - integrity sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== - dependencies: - glob "^7.0.5" - minimatch "^3.0.3" - mkdirp "^1.0.4" - noms "0.0.0" - through2 "^2.0.1" - untildify "^4.0.0" - yargs "^16.1.0" - -core-js-compat@^3.31.0: - version "3.31.1" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz" - integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== - dependencies: - browserslist "^4.21.9" - -core-js-pure@^3.30.2: - version "3.31.1" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.1.tgz" - integrity sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw== - -core-js@^3.23.3: - version "3.31.1" - resolved "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz" - integrity sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ== - -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - -cosmiconfig@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" - integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.7.2" - -cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" - integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== - dependencies: - "@types/parse-json" "^4.0.0" - import-fresh "^3.2.1" - parse-json "^5.0.0" - path-type "^4.0.0" - yaml "^1.10.0" - -cosmiconfig@^8.2.0: - version "8.2.0" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz" - integrity sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ== - dependencies: - import-fresh "^3.2.1" - js-yaml "^4.1.0" - parse-json "^5.0.0" - path-type "^4.0.0" - -cross-fetch@^3.1.5: - version "3.1.8" - resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.8.tgz" - integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== - dependencies: - node-fetch "^2.6.12" - -cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== - dependencies: - path-key "^3.1.0" - shebang-command "^2.0.0" - which "^2.0.1" - -crypto-random-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" - integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== - -css-color-keywords@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz" - integrity sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg== - -css-declaration-sorter@^6.3.1: - version "6.4.1" - resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz" - integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== - -css-loader@^6.7.1: - version "6.8.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-minimizer-webpack-plugin@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-4.2.2.tgz" - integrity sha512-s3Of/4jKfw1Hj9CxEO1E5oXhQAxlayuHO2y/ML+C6I9sQ7FdzfEV6QgMLN3vI+qFsjJGIAFLKtQK7t8BOXAIyA== - dependencies: - cssnano "^5.1.8" - jest-worker "^29.1.2" - postcss "^8.4.17" - schema-utils "^4.0.0" - serialize-javascript "^6.0.0" - source-map "^0.6.1" - -css-select@^4.1.3: - version "4.3.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" - integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== - dependencies: - boolbase "^1.0.0" - css-what "^6.0.1" - domhandler "^4.3.1" - domutils "^2.8.0" - nth-check "^2.0.1" - -css-select@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" - integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== - dependencies: - boolbase "^1.0.0" - css-what "^6.1.0" - domhandler "^5.0.2" - domutils "^3.0.1" - nth-check "^2.0.1" - -css-to-react-native@^3.0.0: - version "3.2.0" - resolved "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz" - integrity sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ== - dependencies: - camelize "^1.0.0" - css-color-keywords "^1.0.0" - postcss-value-parser "^4.0.2" - -css-tree@^1.1.2, css-tree@^1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" - integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== - dependencies: - mdn-data "2.0.14" - source-map "^0.6.1" - -css-what@^6.0.1, css-what@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" - integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== - -cssesc@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" - integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== - -cssnano-preset-advanced@^5.3.8: - version "5.3.10" - resolved "https://registry.npmjs.org/cssnano-preset-advanced/-/cssnano-preset-advanced-5.3.10.tgz" - integrity sha512-fnYJyCS9jgMU+cmHO1rPSPf9axbQyD7iUhLO5Df6O4G+fKIOMps+ZbU0PdGFejFBBZ3Pftf18fn1eG7MAPUSWQ== - dependencies: - autoprefixer "^10.4.12" - cssnano-preset-default "^5.2.14" - postcss-discard-unused "^5.1.0" - postcss-merge-idents "^5.1.1" - postcss-reduce-idents "^5.2.0" - postcss-zindex "^5.1.0" - -cssnano-preset-default@^5.2.14: - version "5.2.14" - resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" - integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== - dependencies: - css-declaration-sorter "^6.3.1" - cssnano-utils "^3.1.0" - postcss-calc "^8.2.3" - postcss-colormin "^5.3.1" - postcss-convert-values "^5.1.3" - postcss-discard-comments "^5.1.2" - postcss-discard-duplicates "^5.1.0" - postcss-discard-empty "^5.1.1" - postcss-discard-overridden "^5.1.0" - postcss-merge-longhand "^5.1.7" - postcss-merge-rules "^5.1.4" - postcss-minify-font-values "^5.1.0" - postcss-minify-gradients "^5.1.1" - postcss-minify-params "^5.1.4" - postcss-minify-selectors "^5.2.1" - postcss-normalize-charset "^5.1.0" - postcss-normalize-display-values "^5.1.0" - postcss-normalize-positions "^5.1.1" - postcss-normalize-repeat-style "^5.1.1" - postcss-normalize-string "^5.1.0" - postcss-normalize-timing-functions "^5.1.0" - postcss-normalize-unicode "^5.1.1" - postcss-normalize-url "^5.1.0" - postcss-normalize-whitespace "^5.1.1" - postcss-ordered-values "^5.1.3" - postcss-reduce-initial "^5.1.2" - postcss-reduce-transforms "^5.1.0" - postcss-svgo "^5.1.0" - postcss-unique-selectors "^5.1.1" - -cssnano-utils@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" - integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== - -cssnano@^5.1.12, cssnano@^5.1.8: - version "5.1.15" - resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" - integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== - dependencies: - cssnano-preset-default "^5.2.14" - lilconfig "^2.0.3" - yaml "^1.10.2" - -csso@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" - integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== - dependencies: - css-tree "^1.1.2" - -csstype@^3.0.2: - version "3.1.2" - resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" - integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== - -csstype@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81" - integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw== - -debug@2.6.9, debug@^2.6.0: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== - dependencies: - ms "2.0.0" - -debug@4, debug@^4.1.0, debug@^4.1.1: - version "4.3.4" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" - integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== - dependencies: - ms "2.1.2" - -debug@^4.3.1: - version "4.4.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" - integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== - dependencies: - ms "^2.1.3" - -decko@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/decko/-/decko-1.2.0.tgz" - integrity sha512-m8FnyHXV1QX+S1cl+KPFDIl6NMkxtKsy6+U/aYyjrOqWMuwAwYWu7ePqrsUHtDR5Y8Yk2pi/KIDSgF+vT4cPOQ== - -decompress-response@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz" - integrity sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA== - dependencies: - mimic-response "^1.0.0" - -deep-extend@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" - integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== - -deepmerge@^4.2.2: - version "4.3.1" - resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" - integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== - -default-gateway@^6.0.3: - version "6.0.3" - resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" - integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== - dependencies: - execa "^5.0.0" - -defer-to-connect@^1.0.1: - version "1.1.3" - resolved "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz" - integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== - -define-data-property@^1.0.1, define-data-property@^1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz" - integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== - dependencies: - es-define-property "^1.0.0" - es-errors "^1.3.0" - gopd "^1.0.1" - -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== - -define-properties@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz" - integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== - dependencies: - define-data-property "^1.0.1" - has-property-descriptors "^1.0.0" - object-keys "^1.1.1" - -del@^6.1.1: - version "6.1.1" - resolved "https://registry.npmjs.org/del/-/del-6.1.1.tgz" - integrity sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg== - dependencies: - globby "^11.0.1" - graceful-fs "^4.2.4" - is-glob "^4.0.1" - is-path-cwd "^2.2.0" - is-path-inside "^3.0.2" - p-map "^4.0.0" - rimraf "^3.0.2" - slash "^3.0.0" - -depd@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" - integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - -destroy@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" - integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== - -detab@2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/detab/-/detab-2.0.4.tgz" - integrity sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g== - dependencies: - repeat-string "^1.5.4" - -detect-libc@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700" - integrity sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw== - -detect-node@^2.0.4: - version "2.1.0" - resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" - integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== - -detect-port-alt@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" - integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== - dependencies: - address "^1.0.1" - debug "^2.6.0" - -detect-port@^1.3.0: - version "1.5.1" - resolved "https://registry.npmjs.org/detect-port/-/detect-port-1.5.1.tgz" - integrity sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ== - dependencies: - address "^1.0.1" - debug "4" - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -dns-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" - integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== - -dns-packet@^5.2.2: - version "5.6.0" - resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz" - integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== - dependencies: - "@leichtgewicht/ip-codec" "^2.0.1" - -docusaurus-biel@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/docusaurus-biel/-/docusaurus-biel-1.0.1.tgz#d5d822a910a78c06ecce8ce3392f3c33ae1f37ae" - integrity sha512-AEsylfKFOBXAECS35P6CePcZLyNnzuwG9S1qTQBmuZkTcpdss2JIXlCrflEzZgAyBP52OK5HW/GFLOWD/HsSjw== - -docusaurus-plugin-redoc@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/docusaurus-plugin-redoc/-/docusaurus-plugin-redoc-1.6.0.tgz" - integrity sha512-bvOmVcJ9Lo6ymyaHCoXTjN6Ck7/Dog1KRsJgZilB6ukHQ7d6nJrAwAEoDF1rXto8tOvIUqVb6Zzy7qDPvBQA1Q== - dependencies: - "@redocly/openapi-core" "1.0.0-beta.123" - redoc "2.0.0" - -docusaurus-theme-redoc@1.6.4: - version "1.6.4" - resolved "https://registry.npmjs.org/docusaurus-theme-redoc/-/docusaurus-theme-redoc-1.6.4.tgz" - integrity sha512-dEKh/HYWGqGG2Qoy2CgXon28Z32Z/LdNzZvreAQqeYtiXb7Ey9gZFwSstpU4jEcoUa347NCYseLPn8bkxlemCw== - dependencies: - "@redocly/openapi-core" "1.0.0-beta.123" - clsx "^1.2.1" - copyfiles "^2.4.1" - lodash "^4.17.21" - mobx "^6.8.0" - redoc "2.0.0" - styled-components "^5.3.6" - -dom-converter@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" - integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== - dependencies: - utila "~0.4" - -dom-helpers@^5.0.1: - version "5.2.1" - resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.1.tgz#d9400536b2bf8225ad98fe052e029451ac40e902" - integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== - dependencies: - "@babel/runtime" "^7.8.7" - csstype "^3.0.2" - -dom-serializer@^1.0.1: - version "1.4.1" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" - integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.2.0" - entities "^2.0.0" - -dom-serializer@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" - integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.2" - entities "^4.2.0" - -domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" - integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== - -domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: - version "4.3.1" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" - integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== - dependencies: - domelementtype "^2.2.0" - -domhandler@^5.0.2, domhandler@^5.0.3: - version "5.0.3" - resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" - integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== - dependencies: - domelementtype "^2.3.0" - -dompurify@^2.2.8: - version "2.4.7" - resolved "https://registry.npmjs.org/dompurify/-/dompurify-2.4.7.tgz" - integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== - -domutils@^2.5.2, domutils@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" - integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== - dependencies: - dom-serializer "^1.0.1" - domelementtype "^2.2.0" - domhandler "^4.2.0" - -domutils@^3.0.1: - version "3.1.0" - resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" - integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== - dependencies: - dom-serializer "^2.0.0" - domelementtype "^2.3.0" - domhandler "^5.0.3" - -dot-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" - integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -dot-prop@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz" - integrity sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== - dependencies: - is-obj "^2.0.0" - -duplexer3@^0.1.4: - version "0.1.5" - resolved "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.5.tgz" - integrity sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA== - -duplexer@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" - integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== - -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - -ee-first@1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" - integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== - -electron-to-chromium@^1.4.431: - version "1.4.457" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.457.tgz" - integrity sha512-/g3UyNDmDd6ebeWapmAoiyy+Sy2HyJ+/X8KyvNeHfKRFfHaA2W8oF5fxD5F3tjBDcjpwo0iek6YNgxNXDBoEtA== - -elliptic@^6.5.5: - version "6.6.1" - resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.6.1.tgz#3b8ffb02670bf69e382c7f65bf524c97c5405c06" - integrity sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g== - dependencies: - bn.js "^4.11.9" - brorand "^1.1.0" - hash.js "^1.0.0" - hmac-drbg "^1.0.1" - inherits "^2.0.4" - minimalistic-assert "^1.0.1" - minimalistic-crypto-utils "^1.0.1" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - -emojis-list@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" - integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== - -emoticon@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/emoticon/-/emoticon-3.2.0.tgz" - integrity sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg== - -encodeurl@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" - integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== - -end-of-stream@^1.1.0: - version "1.4.4" - resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" - integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== - dependencies: - once "^1.4.0" - -enhanced-resolve@^5.15.0: - version "5.15.0" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - -entities@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" - integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== - -entities@^4.2.0, entities@^4.4.0: - version "4.5.0" - resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" - integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== - -error-ex@^1.3.1: - version "1.3.2" - resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" - integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== - dependencies: - is-arrayish "^0.2.1" - -es-define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz" - integrity sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== - dependencies: - get-intrinsic "^1.2.4" - -es-errors@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz" - integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== - -es-module-lexer@^1.2.1: - version "1.3.0" - resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz" - integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== - -es6-promise@^3.2.1: - version "3.3.1" - resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz" - integrity sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg== - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -escape-goat@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz" - integrity sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q== - -escape-html@^1.0.3, escape-html@~1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" - integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== - -escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== - -escape-string-regexp@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - -eslint-scope@5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" - integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== - dependencies: - esrecurse "^4.3.0" - estraverse "^4.1.1" - -esprima@^4.0.0: - version "4.0.1" - resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" - integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== - -esrecurse@^4.3.0: - version "4.3.0" - resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" - integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== - dependencies: - estraverse "^5.2.0" - -estraverse@^4.1.1: - version "4.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" - integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== - -estraverse@^5.2.0: - version "5.3.0" - resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" - integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== - -esutils@^2.0.2: - version "2.0.3" - resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" - integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== - -eta@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/eta/-/eta-2.2.0.tgz" - integrity sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g== - -etag@~1.8.1: - version "1.8.1" - resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" - integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== - -eval@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/eval/-/eval-0.1.8.tgz" - integrity sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw== - dependencies: - "@types/node" "*" - require-like ">= 0.1.1" - -eventemitter3@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" - integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== - -eventemitter3@^4.0.0, eventemitter3@^4.0.7: - version "4.0.7" - resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" - integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== - -events@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" - integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== - -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - -express@^4.17.3: - version "4.18.2" - resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" - integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== - dependencies: - accepts "~1.3.8" - array-flatten "1.1.1" - body-parser "1.20.1" - content-disposition "0.5.4" - content-type "~1.0.4" - cookie "0.5.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "2.0.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "1.2.0" - fresh "0.5.2" - http-errors "2.0.0" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "2.4.1" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.7" - qs "6.11.0" - range-parser "~1.2.1" - safe-buffer "5.2.1" - send "0.18.0" - serve-static "1.15.0" - setprototypeof "1.2.0" - statuses "2.0.1" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz" - integrity sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug== - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - -fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: - version "3.1.3" - resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" - integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== - -fast-glob@^3.2.11, fast-glob@^3.2.9, fast-glob@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" - integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== - 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" - -fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" - integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== - -fast-safe-stringify@^2.0.7: - version "2.1.1" - resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" - integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== - -fast-url-parser@1.1.3: - version "1.1.3" - resolved "https://registry.npmjs.org/fast-url-parser/-/fast-url-parser-1.1.3.tgz" - integrity sha512-5jOCVXADYNuRkKFzNJ0dCCewsZiYo0dz8QNYljkOpFC6r2U4OBmKtvm/Tsuh4w1YYdDqDb31a8TVhBJ2OJKdqQ== - dependencies: - punycode "^1.3.2" - -fastq@^1.6.0: - version "1.15.0" - resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" - integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== - dependencies: - reusify "^1.0.4" - -faye-websocket@^0.11.3: - version "0.11.4" - resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" - integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== - dependencies: - websocket-driver ">=0.5.1" - -fbemitter@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/fbemitter/-/fbemitter-3.0.0.tgz" - integrity sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw== - dependencies: - fbjs "^3.0.0" - -fbjs-css-vars@^1.0.0: - version "1.0.2" - resolved "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz" - integrity sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ== - -fbjs@^3.0.0, fbjs@^3.0.1: - version "3.0.5" - resolved "https://registry.npmjs.org/fbjs/-/fbjs-3.0.5.tgz" - integrity sha512-ztsSx77JBtkuMrEypfhgc3cI0+0h+svqeie7xHbh1k/IKdcydnvadp/mUaGgjAOXQmQSxsqgaRhS3q9fy+1kxg== - dependencies: - cross-fetch "^3.1.5" - fbjs-css-vars "^1.0.0" - loose-envify "^1.0.0" - object-assign "^4.1.0" - promise "^7.1.1" - setimmediate "^1.0.5" - ua-parser-js "^1.0.35" - -feed@^4.2.2: - version "4.2.2" - resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" - integrity sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ== - dependencies: - xml-js "^1.6.11" - -file-loader@^6.2.0: - version "6.2.0" - resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" - integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== - dependencies: - loader-utils "^2.0.0" - schema-utils "^3.0.0" - -filesize@^8.0.6: - version "8.0.7" - resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" - integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -finalhandler@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" - integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "2.4.1" - parseurl "~1.3.3" - statuses "2.0.1" - unpipe "~1.0.0" - -find-cache-dir@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" - integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== - dependencies: - commondir "^1.0.1" - make-dir "^3.0.2" - pkg-dir "^4.1.0" - -find-root@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" - integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== - -find-up@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" - integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== - dependencies: - locate-path "^3.0.0" - -find-up@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" - integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== - dependencies: - locate-path "^5.0.0" - path-exists "^4.0.0" - -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -flux@^4.0.1: - version "4.0.4" - resolved "https://registry.npmjs.org/flux/-/flux-4.0.4.tgz" - integrity sha512-NCj3XlayA2UsapRpM7va6wU1+9rE5FIL7qoMcmxWHRzbp0yujihMBm9BBHZ1MDIk5h5o2Bl6eGiCe8rYELAmYw== - dependencies: - fbemitter "^3.0.0" - fbjs "^3.0.1" - -follow-redirects@^1.0.0, follow-redirects@^1.14.7: - version "1.15.2" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" - integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== - -foreach@^2.0.4: - version "2.0.6" - resolved "https://registry.npmjs.org/foreach/-/foreach-2.0.6.tgz" - integrity sha512-k6GAGDyqLe9JaebCsFCoudPPWfihKu8pylYXRlqP1J7ms39iPoTtk2fviNglIeQEwdh0bQeKJ01ZPyuyQvKzwg== - -fork-ts-checker-webpack-plugin@^6.5.0: - version "6.5.3" - resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" - integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== - dependencies: - "@babel/code-frame" "^7.8.3" - "@types/json-schema" "^7.0.5" - chalk "^4.1.0" - chokidar "^3.4.2" - cosmiconfig "^6.0.0" - deepmerge "^4.2.2" - fs-extra "^9.0.0" - glob "^7.1.6" - memfs "^3.1.2" - minimatch "^3.0.4" - schema-utils "2.7.0" - semver "^7.3.2" - tapable "^1.0.0" - -forwarded@0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" - integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== - -fraction.js@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" - integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== - -fresh@0.5.2: - version "0.5.2" - resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" - integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== - -fs-extra@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz" - integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== - dependencies: - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-extra@^9.0.0: - version "9.1.0" - resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" - integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== - dependencies: - at-least-node "^1.0.0" - graceful-fs "^4.2.0" - jsonfile "^6.0.1" - universalify "^2.0.0" - -fs-monkey@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz" - integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - -fsevents@~2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -function-bind@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" - integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== - -gensync@^1.0.0-beta.1, gensync@^1.0.0-beta.2: - version "1.0.0-beta.2" - resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" - integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -get-intrinsic@^1.0.2, get-intrinsic@^1.1.3, get-intrinsic@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz" - integrity sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== - dependencies: - es-errors "^1.3.0" - function-bind "^1.1.2" - has-proto "^1.0.1" - has-symbols "^1.0.3" - hasown "^2.0.0" - -get-own-enumerable-property-symbols@^3.0.0: - version "3.0.2" - resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" - integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== - -get-stream@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz" - integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== - dependencies: - pump "^3.0.0" - -get-stream@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" - integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== - dependencies: - pump "^3.0.0" - -get-stream@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" - integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== - -github-slugger@^1.4.0: - version "1.5.0" - resolved "https://registry.npmjs.org/github-slugger/-/github-slugger-1.5.0.tgz" - integrity sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw== - -glob-parent@^5.1.2, glob-parent@~5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" - integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== - dependencies: - is-glob "^4.0.1" - -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-to-regexp@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" - integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== - -glob@^7.0.0, glob@^7.0.5, glob@^7.1.3, glob@^7.1.6: - version "7.2.3" - resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - -global-dirs@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz" - integrity sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA== - dependencies: - ini "2.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - -globals@^11.1.0: - version "11.12.0" - resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" - integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== - -globby@^11.0.1, globby@^11.0.4, globby@^11.1.0: - version "11.1.0" - resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" - integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== - dependencies: - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.2.9" - ignore "^5.2.0" - merge2 "^1.4.1" - slash "^3.0.0" - -globby@^13.1.1: - version "13.2.2" - resolved "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz" - integrity sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w== - dependencies: - dir-glob "^3.0.1" - fast-glob "^3.3.0" - ignore "^5.2.4" - merge2 "^1.4.1" - slash "^4.0.0" - -gopd@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" - integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== - dependencies: - get-intrinsic "^1.1.3" - -got@^9.6.0: - version "9.6.0" - resolved "https://registry.npmjs.org/got/-/got-9.6.0.tgz" - integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== - dependencies: - "@sindresorhus/is" "^0.14.0" - "@szmarczak/http-timer" "^1.1.2" - cacheable-request "^6.0.0" - decompress-response "^3.3.0" - duplexer3 "^0.1.4" - get-stream "^4.1.0" - lowercase-keys "^1.0.1" - mimic-response "^1.0.1" - p-cancelable "^1.0.0" - to-readable-stream "^1.0.0" - url-parse-lax "^3.0.0" - -graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: - version "4.2.11" - resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" - integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== - -gray-matter@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/gray-matter/-/gray-matter-4.0.3.tgz" - integrity sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q== - dependencies: - js-yaml "^3.13.1" - kind-of "^6.0.2" - section-matter "^1.0.0" - strip-bom-string "^1.0.0" - -gzip-size@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" - integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== - dependencies: - duplexer "^0.1.2" - -handle-thing@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" - integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== - -has-flag@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" - integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== - -has-flag@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" - integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== - -has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz" - integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== - dependencies: - es-define-property "^1.0.0" - -has-proto@^1.0.1: - version "1.0.3" - resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz" - integrity sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== - -has-symbols@^1.0.3: - version "1.0.3" - resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" - integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== - -has-yarn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz" - integrity sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw== - -hash.js@^1.0.0, hash.js@^1.0.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" - integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== - dependencies: - inherits "^2.0.3" - minimalistic-assert "^1.0.1" - -hasown@^2.0.0, hasown@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" - integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== - dependencies: - function-bind "^1.1.2" - -hast-to-hyperscript@^9.0.0: - version "9.0.1" - resolved "https://registry.npmjs.org/hast-to-hyperscript/-/hast-to-hyperscript-9.0.1.tgz" - integrity sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA== - dependencies: - "@types/unist" "^2.0.3" - comma-separated-tokens "^1.0.0" - property-information "^5.3.0" - space-separated-tokens "^1.0.0" - style-to-object "^0.3.0" - unist-util-is "^4.0.0" - web-namespaces "^1.0.0" - -hast-util-from-parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-6.0.1.tgz" - integrity sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA== - dependencies: - "@types/parse5" "^5.0.0" - hastscript "^6.0.0" - property-information "^5.0.0" - vfile "^4.0.0" - vfile-location "^3.2.0" - web-namespaces "^1.0.0" - -hast-util-parse-selector@^2.0.0: - version "2.2.5" - resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" - integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== - -hast-util-raw@6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/hast-util-raw/-/hast-util-raw-6.0.1.tgz" - integrity sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig== - dependencies: - "@types/hast" "^2.0.0" - hast-util-from-parse5 "^6.0.0" - hast-util-to-parse5 "^6.0.0" - html-void-elements "^1.0.0" - parse5 "^6.0.0" - unist-util-position "^3.0.0" - vfile "^4.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hast-util-to-parse5@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hast-util-to-parse5/-/hast-util-to-parse5-6.0.0.tgz" - integrity sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ== - dependencies: - hast-to-hyperscript "^9.0.0" - property-information "^5.0.0" - web-namespaces "^1.0.0" - xtend "^4.0.0" - zwitch "^1.0.0" - -hastscript@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" - integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== - dependencies: - "@types/hast" "^2.0.0" - comma-separated-tokens "^1.0.0" - hast-util-parse-selector "^2.0.0" - property-information "^5.0.0" - space-separated-tokens "^1.0.0" - -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - -history@^4.9.0: - version "4.10.1" - resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" - integrity sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew== - dependencies: - "@babel/runtime" "^7.1.2" - loose-envify "^1.2.0" - resolve-pathname "^3.0.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - value-equal "^1.0.1" - -hmac-drbg@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" - integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== - dependencies: - hash.js "^1.0.3" - minimalistic-assert "^1.0.0" - minimalistic-crypto-utils "^1.0.1" - -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.1.0, hoist-non-react-statics@^3.3.1: - version "3.3.2" - resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" - integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== - dependencies: - react-is "^16.7.0" - -hpack.js@^2.1.6: - version "2.1.6" - resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" - integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== - dependencies: - inherits "^2.0.1" - obuf "^1.0.0" - readable-stream "^2.0.1" - wbuf "^1.1.0" - -hpke-js@^1.2.7: - version "1.6.1" - resolved "https://registry.yarnpkg.com/hpke-js/-/hpke-js-1.6.1.tgz#b05ef5218d3ae7fdb367d75731aa219ee603d28f" - integrity sha512-lIYfHM7jxUBamBHFxuy7iZbDMgDhIqW/T9DTg1dNnIZbwheZ9p3MWe+5IZXj2p2Jmqcixkh9IdAhjv/H4CMY2A== - dependencies: - "@hpke/chacha20poly1305" "^1.6.0" - "@hpke/common" "^1.6.1" - "@hpke/core" "^1.6.0" - "@hpke/dhkem-x25519" "^1.6.0" - "@hpke/dhkem-x448" "^1.6.0" - "@noble/hashes" "^1.5.0" - -html-entities@^2.3.2: - version "2.4.0" - resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz" - integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== - -html-minifier-terser@^6.0.2, html-minifier-terser@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" - integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== - dependencies: - camel-case "^4.1.2" - clean-css "^5.2.2" - commander "^8.3.0" - he "^1.2.0" - param-case "^3.0.4" - relateurl "^0.2.7" - terser "^5.10.0" - -html-tags@^3.2.0: - version "3.3.1" - resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" - integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== - -html-void-elements@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/html-void-elements/-/html-void-elements-1.0.5.tgz" - integrity sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w== - -html-webpack-plugin@^5.5.0: - version "5.5.3" - resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz" - integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== - dependencies: - "@types/html-minifier-terser" "^6.0.0" - html-minifier-terser "^6.0.2" - lodash "^4.17.21" - pretty-error "^4.0.0" - tapable "^2.0.0" - -htmlparser2@^6.1.0: - version "6.1.0" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" - integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== - dependencies: - domelementtype "^2.0.1" - domhandler "^4.0.0" - domutils "^2.5.2" - entities "^2.0.0" - -htmlparser2@^8.0.1: - version "8.0.2" - resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" - integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== - dependencies: - domelementtype "^2.3.0" - domhandler "^5.0.3" - domutils "^3.0.1" - entities "^4.4.0" - -http-cache-semantics@^4.0.0: - version "4.1.1" - resolved "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz" - integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== - -http-deceiver@^1.2.7: - version "1.2.7" - resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" - integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== - -http-errors@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" - integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== - dependencies: - depd "2.0.0" - inherits "2.0.4" - setprototypeof "1.2.0" - statuses "2.0.1" - toidentifier "1.0.1" - -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - -http-parser-js@>=0.5.1: - version "0.5.8" - resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" - integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== - -http-proxy-middleware@^2.0.3: - version "2.0.6" - resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" - integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - -http-proxy@^1.18.1: - version "1.18.1" - resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" - integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== - dependencies: - eventemitter3 "^4.0.0" - follow-redirects "^1.0.0" - requires-port "^1.0.0" - -http2-client@^1.2.5: - version "1.3.5" - resolved "https://registry.npmjs.org/http2-client/-/http2-client-1.3.5.tgz" - integrity sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA== - -human-signals@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" - integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== - -iconv-lite@0.4.24: - version "0.4.24" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== - dependencies: - safer-buffer ">= 2.1.2 < 3" - -icss-utils@^5.0.0, icss-utils@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" - integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== - -ieee754@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" - integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== - -ignore@^5.2.0, ignore@^5.2.4: - version "5.2.4" - resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" - integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== - -image-size@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/image-size/-/image-size-1.0.2.tgz" - integrity sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg== - dependencies: - queue "6.0.2" - -immer@^9.0.7: - version "9.0.21" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" - integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== - -import-fresh@^3.1.0, import-fresh@^3.2.1, import-fresh@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" - integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== - dependencies: - parent-module "^1.0.0" - resolve-from "^4.0.0" - -import-lazy@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz" - integrity sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A== - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" - integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== - -indent-string@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" - integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== - -infima@0.2.0-alpha.43: - version "0.2.0-alpha.43" - resolved "https://registry.npmjs.org/infima/-/infima-0.2.0-alpha.43.tgz" - integrity sha512-2uw57LvUqW0rK/SWYnd/2rRfxNA5DDNOh33jxF7fy46VWoNhGxiUQyVZHbBMjQ33mQem0cjdDVwgWVAmlRfgyQ== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@2.0.4, inherits@^2.0.0, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -inherits@2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" - integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== - -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -ini@^1.3.5, ini@~1.3.0: - version "1.3.8" - resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - -inline-style-parser@0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz" - integrity sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q== - -interpret@^1.0.0: - version "1.4.0" - resolved "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== - -invariant@^2.2.4: - version "2.2.4" - resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" - integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== - dependencies: - loose-envify "^1.0.0" - -ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" - integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== - -ipaddr.js@^2.0.1: - version "2.1.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" - integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== - -is-alphabetical@1.0.4, is-alphabetical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" - integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== - -is-alphanumerical@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" - integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== - dependencies: - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-binary-path@~2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" - integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== - dependencies: - binary-extensions "^2.0.0" - -is-buffer@^2.0.0: - version "2.0.5" - resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz" - integrity sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ== - -is-ci@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz" - integrity sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w== - dependencies: - ci-info "^2.0.0" - -is-core-module@^2.11.0: - version "2.13.1" - resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz" - integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== - dependencies: - hasown "^2.0.0" - -is-core-module@^2.16.0: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.0.tgz#6c01ffdd5e33c49c1d2abfa93334a85cb56bd81c" - integrity sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g== - dependencies: - hasown "^2.0.2" - -is-decimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" - integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== - -is-docker@^2.0.0, is-docker@^2.1.1: - version "2.2.1" - resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" - integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== - -is-extendable@^0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" - integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: - version "4.0.3" - resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" - integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== - dependencies: - is-extglob "^2.1.1" - -is-hexadecimal@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" - integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== - -is-installed-globally@^0.4.0: - version "0.4.0" - resolved "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz" - integrity sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ== - dependencies: - global-dirs "^3.0.0" - is-path-inside "^3.0.2" - -is-npm@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz" - integrity sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA== - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" - integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== - -is-obj@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz" - integrity sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== - -is-path-cwd@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" - integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== - -is-path-inside@^3.0.2: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - -is-plain-obj@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-plain-obj@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" - integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== - -is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-regexp@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" - integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== - -is-root@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" - integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== - -is-stream@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" - integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== - -is-typedarray@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" - integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== - -is-whitespace-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" - integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== - -is-word-character@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz" - integrity sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA== - -is-wsl@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" - integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== - dependencies: - is-docker "^2.0.0" - -is-yarn-global@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz" - integrity sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw== - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== - -isobject@^3.0.1: - version "3.0.1" - resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" - integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== - -isows@1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.6.tgz#0da29d706fa51551c663c627ace42769850f86e7" - integrity sha512-lPHCayd40oW98/I0uvgaHKWCSvkzY27LjWLbtzOm64yQ+G3Q5npjjbdppU65iZXkK1Zt+kH9pfegli0AYfwYYw== - -jest-util@^29.6.1: - version "29.6.1" - resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz" - integrity sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg== - dependencies: - "@jest/types" "^29.6.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-worker@^27.4.5: - version "27.5.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" - integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jest-worker@^29.1.2: - version "29.6.1" - resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.1.tgz" - integrity sha512-U+Wrbca7S8ZAxAe9L6nb6g8kPdia5hj32Puu5iOqBCMTMWFHXuK6dOV2IFrpedbTV8fjMFLdWNttQTBL6u2MRA== - dependencies: - "@types/node" "*" - jest-util "^29.6.1" - merge-stream "^2.0.0" - supports-color "^8.0.0" - -jiti@^1.18.2: - version "1.19.1" - resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz" - integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== - -joi@^17.6.0: - version "17.9.2" - resolved "https://registry.npmjs.org/joi/-/joi-17.9.2.tgz" - integrity sha512-Itk/r+V4Dx0V3c7RLFdRh12IOjySm2/WGPMubBT92cQvRfYZhPM2W0hZlctjj72iES8jsRCwp7S/cRmWBnJ4nw== - 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" - -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - -"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" - integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== - -js-yaml@^3.13.1: - version "3.14.1" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" - integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - -js-yaml@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" - integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== - dependencies: - argparse "^2.0.1" - -jsesc@^2.5.1: - version "2.5.2" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" - integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== - -jsesc@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" - integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== - -jsesc@~0.5.0: - version "0.5.0" - resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" - integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== - -json-buffer@3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz" - integrity sha512-CuUqjv0FUZIdXkHPI8MezCnFCdaTAacej1TZYulLoAg1h/PhwkdXFN4V/gzY4g+fMBCOV2xF+rp7t2XD2ns/NQ== - -json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz" - integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== - -json-pointer@0.6.2, json-pointer@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/json-pointer/-/json-pointer-0.6.2.tgz" - integrity sha512-vLWcKbOaXlO+jvRy4qNd+TI1QUPZzfJj1tpJ3vAXDych5XJf93ftpUKe5pKCrzyIIwgBJcOcCVRUfqQP25afBw== - dependencies: - foreach "^2.0.4" - -json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz" - integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== - -json-schema-traverse@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" - integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== - -json5@^2.1.2, json5@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" - integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== - -jsonfile@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" - integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== - dependencies: - universalify "^2.0.0" - optionalDependencies: - graceful-fs "^4.1.6" - -keyv@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz" - integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== - dependencies: - json-buffer "3.0.0" - -kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" - integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== - -kleur@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" - integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== - -latest-version@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz" - integrity sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA== - dependencies: - package-json "^6.3.0" - -launch-editor@^2.6.0: - version "2.6.0" - resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz" - integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== - dependencies: - picocolors "^1.0.0" - shell-quote "^1.7.3" - -leven@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" - integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== - -libphonenumber-js@^1.11.14: - version "1.11.17" - resolved "https://registry.yarnpkg.com/libphonenumber-js/-/libphonenumber-js-1.11.17.tgz#37ddbf16dc4dd45c723a150996c253c58dad034b" - integrity sha512-Jr6v8thd5qRlOlc6CslSTzGzzQW03uiscab7KHQZX1Dfo4R6n6FDhZ0Hri6/X7edLIDv9gl4VMZXhxTjLnl0VQ== - -lilconfig@^2.0.3: - version "2.1.0" - resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" - integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== - -lines-and-columns@^1.1.6: - version "1.2.4" - resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" - integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== - -loader-runner@^4.2.0: - version "4.3.0" - resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" - integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== - -loader-utils@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" - integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== - dependencies: - big.js "^5.2.2" - emojis-list "^3.0.0" - json5 "^2.1.2" - -loader-utils@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" - integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== - -locate-path@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" - integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== - dependencies: - p-locate "^3.0.0" - path-exists "^3.0.0" - -locate-path@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" - integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== - dependencies: - p-locate "^4.1.0" - -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - -lodash.curry@^4.0.1: - version "4.1.1" - resolved "https://registry.npmjs.org/lodash.curry/-/lodash.curry-4.1.1.tgz" - integrity sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA== - -lodash.debounce@^4.0.8: - version "4.0.8" - resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" - integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== - -lodash.flow@^3.3.0: - version "3.5.0" - resolved "https://registry.npmjs.org/lodash.flow/-/lodash.flow-3.5.0.tgz" - integrity sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw== - -lodash.isequal@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz" - integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ== - -lodash.memoize@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" - integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== - -lodash.uniq@4.5.0, lodash.uniq@^4.5.0: - version "4.5.0" - resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" - integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== - -lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21: - version "4.17.21" - resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" - integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== - -loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.2.0, loose-envify@^1.3.1, loose-envify@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz" - integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - -lower-case@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" - integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== - dependencies: - tslib "^2.0.3" - -lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz" - integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== - -lowercase-keys@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz" - integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== - -lru-cache@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" - integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== - dependencies: - yallist "^3.0.2" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -lunr@^2.3.9: - version "2.3.9" - resolved "https://registry.npmjs.org/lunr/-/lunr-2.3.9.tgz" - integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== - -make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -mark.js@^8.11.1: - version "8.11.1" - resolved "https://registry.npmjs.org/mark.js/-/mark.js-8.11.1.tgz" - integrity sha512-1I+1qpDt4idfgLQG+BNWmrqku+7/2bi5nLf4YwF8y8zXvmfiTBY3PV3ZibfrjBueCByROpuBjLLFCajqkgYoLQ== - -markdown-escapes@^1.0.0: - version "1.0.4" - resolved "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz" - integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== - -marked@^4.0.15: - version "4.3.0" - resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - -mdast-squeeze-paragraphs@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-squeeze-paragraphs/-/mdast-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ== - dependencies: - unist-util-remove "^2.0.0" - -mdast-util-definitions@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/mdast-util-definitions/-/mdast-util-definitions-4.0.0.tgz" - integrity sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ== - dependencies: - unist-util-visit "^2.0.0" - -mdast-util-to-hast@10.0.1: - version "10.0.1" - resolved "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-10.0.1.tgz" - integrity sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA== - dependencies: - "@types/mdast" "^3.0.0" - "@types/unist" "^2.0.0" - mdast-util-definitions "^4.0.0" - mdurl "^1.0.0" - unist-builder "^2.0.0" - unist-util-generated "^1.0.0" - unist-util-position "^3.0.0" - unist-util-visit "^2.0.0" - -mdast-util-to-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-2.0.0.tgz" - integrity sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w== - -mdn-data@2.0.14: - version "2.0.14" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" - integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== - -mdurl@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" - integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== - -media-typer@0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" - integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== - -memfs@^3.1.2, memfs@^3.4.3: - version "3.5.3" - resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz" - integrity sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw== - dependencies: - fs-monkey "^1.0.4" - -merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" - integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== - -merge-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" - integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== - -merge2@^1.3.0, merge2@^1.4.1: - version "1.4.1" - resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" - integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== - -micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: - version "4.0.5" - resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" - integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== - dependencies: - braces "^3.0.2" - picomatch "^2.3.1" - -mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": - version "1.52.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" - integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== - -mime-db@~1.33.0: - version "1.33.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz" - integrity sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ== - -mime-types@2.1.18, mime-types@~2.1.17: - version "2.1.18" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz" - integrity sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ== - dependencies: - mime-db "~1.33.0" - -mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: - version "2.1.35" - resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" - integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== - dependencies: - mime-db "1.52.0" - -mime@1.6.0: - version "1.6.0" - resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" - integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== - -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - -mimic-response@^1.0.0, mimic-response@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz" - integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== - -mini-css-extract-plugin@^2.6.1: - version "2.7.6" - resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" - integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== - dependencies: - schema-utils "^4.0.0" - -minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" - integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== - -minimalistic-crypto-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" - integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== - -minimatch@3.1.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1: - version "3.1.2" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" - integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== - dependencies: - brace-expansion "^1.1.7" - -minimatch@^5.0.1: - version "5.1.6" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" - integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== - dependencies: - brace-expansion "^2.0.1" - -minimist@^1.2.0, minimist@^1.2.5: - version "1.2.8" - resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" - integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -mobx-react-lite@^3.4.0: - version "3.4.3" - resolved "https://registry.npmjs.org/mobx-react-lite/-/mobx-react-lite-3.4.3.tgz" - integrity sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg== - -mobx-react@^7.2.0: - version "7.6.0" - resolved "https://registry.npmjs.org/mobx-react/-/mobx-react-7.6.0.tgz" - integrity sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA== - dependencies: - mobx-react-lite "^3.4.0" - -mobx@^6.8.0: - version "6.10.2" - resolved "https://registry.npmjs.org/mobx/-/mobx-6.10.2.tgz" - integrity sha512-B1UGC3ieK3boCjnMEcZSwxqRDMdzX65H/8zOHbuTY8ZhvrIjTUoLRR2TP2bPqIgYRfb3+dUigu8yMZufNjn0LQ== - -mrmime@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" - integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@2.1.3, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -multicast-dns@^7.2.5: - version "7.2.5" - resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" - integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== - dependencies: - dns-packet "^5.2.2" - thunky "^1.0.2" - -nanoid@^3.3.6: - version "3.3.6" - resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" - integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== - -negotiator@0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" - integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== - -neo-async@^2.6.2: - version "2.6.2" - resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" - integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== - -next@^15.0.2: - version "15.1.2" - resolved "https://registry.yarnpkg.com/next/-/next-15.1.2.tgz#305d093a9f3d6900b53fa4abb5b213264b22047c" - integrity sha512-nLJDV7peNy+0oHlmY2JZjzMfJ8Aj0/dd3jCwSZS8ZiO5nkQfcZRqDrRN3U5rJtqVTQneIOGZzb6LCNrk7trMCQ== - dependencies: - "@next/env" "15.1.2" - "@swc/counter" "0.1.3" - "@swc/helpers" "0.5.15" - busboy "1.6.0" - caniuse-lite "^1.0.30001579" - postcss "8.4.31" - styled-jsx "5.1.6" - optionalDependencies: - "@next/swc-darwin-arm64" "15.1.2" - "@next/swc-darwin-x64" "15.1.2" - "@next/swc-linux-arm64-gnu" "15.1.2" - "@next/swc-linux-arm64-musl" "15.1.2" - "@next/swc-linux-x64-gnu" "15.1.2" - "@next/swc-linux-x64-musl" "15.1.2" - "@next/swc-win32-arm64-msvc" "15.1.2" - "@next/swc-win32-x64-msvc" "15.1.2" - sharp "^0.33.5" - -no-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" - integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== - dependencies: - lower-case "^2.0.2" - tslib "^2.0.3" - -node-emoji@^1.10.0: - version "1.11.0" - resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - -node-fetch-h2@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/node-fetch-h2/-/node-fetch-h2-2.3.0.tgz" - integrity sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg== - dependencies: - http2-client "^1.2.5" - -node-fetch@^2.6.1, node-fetch@^2.6.12: - version "2.6.12" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.12.tgz" - integrity sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g== - dependencies: - whatwg-url "^5.0.0" - -node-forge@^1: - version "1.3.1" - resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" - integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== - -node-readfiles@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/node-readfiles/-/node-readfiles-0.2.0.tgz" - integrity sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA== - dependencies: - es6-promise "^3.2.1" - -node-releases@^2.0.12: - version "2.0.13" - resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" - integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== - -noms@0.0.0: - version "0.0.0" - resolved "https://registry.npmjs.org/noms/-/noms-0.0.0.tgz" - integrity sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== - dependencies: - inherits "^2.0.1" - readable-stream "~1.0.31" - -normalize-path@^3.0.0, normalize-path@~3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" - integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== - -normalize-range@^0.1.2: - version "0.1.2" - resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" - integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== - -normalize-url@^4.1.0: - version "4.5.1" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz" - integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== - -normalize-url@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" - integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== - -npm-run-path@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" - integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== - dependencies: - path-key "^3.0.0" - -nprogress@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz" - integrity sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA== - -nth-check@^2.0.1: - version "2.1.1" - resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" - integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== - dependencies: - boolbase "^1.0.0" - -oas-kit-common@^1.0.8: - version "1.0.8" - resolved "https://registry.npmjs.org/oas-kit-common/-/oas-kit-common-1.0.8.tgz" - integrity sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ== - dependencies: - fast-safe-stringify "^2.0.7" - -oas-linter@^3.2.2: - version "3.2.2" - resolved "https://registry.npmjs.org/oas-linter/-/oas-linter-3.2.2.tgz" - integrity sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ== - dependencies: - "@exodus/schemasafe" "^1.0.0-rc.2" - should "^13.2.1" - yaml "^1.10.0" - -oas-resolver@^2.5.6: - version "2.5.6" - resolved "https://registry.npmjs.org/oas-resolver/-/oas-resolver-2.5.6.tgz" - integrity sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ== - dependencies: - node-fetch-h2 "^2.3.0" - oas-kit-common "^1.0.8" - reftools "^1.1.9" - yaml "^1.10.0" - yargs "^17.0.1" - -oas-schema-walker@^1.1.5: - version "1.1.5" - resolved "https://registry.npmjs.org/oas-schema-walker/-/oas-schema-walker-1.1.5.tgz" - integrity sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ== - -oas-validator@^5.0.8: - version "5.0.8" - resolved "https://registry.npmjs.org/oas-validator/-/oas-validator-5.0.8.tgz" - integrity sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw== - dependencies: - call-me-maybe "^1.0.1" - oas-kit-common "^1.0.8" - oas-linter "^3.2.2" - oas-resolver "^2.5.6" - oas-schema-walker "^1.1.5" - reftools "^1.1.9" - should "^13.2.1" - yaml "^1.10.0" - -object-assign@^4.1.0, object-assign@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" - integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== - -object-inspect@^1.9.0: - version "1.13.1" - resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz" - integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== - -object-keys@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" - integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== - -object.assign@^4.1.0: - version "4.1.5" - resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz" - integrity sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ== - dependencies: - call-bind "^1.0.5" - define-properties "^1.2.1" - has-symbols "^1.0.3" - object-keys "^1.1.1" - -obuf@^1.0.0, obuf@^1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" - integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== - -on-finished@2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" - integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== - dependencies: - ee-first "1.1.1" - -on-headers@~1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" - integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== - -once@^1.3.0, once@^1.3.1, once@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" - integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== - dependencies: - wrappy "1" - -onetime@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - -open@^8.0.9, open@^8.4.0: - version "8.4.2" - resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" - integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== - dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" - is-wsl "^2.2.0" - -openapi-sampler@^1.3.0: - version "1.3.1" - resolved "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.3.1.tgz" - integrity sha512-Ert9mvc2tLPmmInwSyGZS+v4Ogu9/YoZuq9oP3EdUklg2cad6+IGndP9yqJJwbgdXwZibiq5fpv6vYujchdJFg== - dependencies: - "@types/json-schema" "^7.0.7" - json-pointer "0.6.2" - -opener@^1.5.2: - version "1.5.2" - resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" - integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== - -ox@0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/ox/-/ox-0.1.2.tgz#0f791be2ccabeaf4928e6d423498fe1c8094e560" - integrity sha512-ak/8K0Rtphg9vnRJlbOdaX9R7cmxD2MiSthjWGaQdMk3D7hrAlDoM+6Lxn7hN52Za3vrXfZ7enfke/5WjolDww== - dependencies: - "@adraffy/ens-normalize" "^1.10.1" - "@noble/curves" "^1.6.0" - "@noble/hashes" "^1.5.0" - "@scure/bip32" "^1.5.0" - "@scure/bip39" "^1.4.0" - abitype "^1.0.6" - eventemitter3 "5.0.1" - -p-cancelable@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz" - integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== - -p-limit@^2.0.0, p-limit@^2.2.0: - version "2.3.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" - integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== - dependencies: - p-try "^2.0.0" - -p-limit@^3.0.2: - version "3.1.0" - resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" - integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== - dependencies: - yocto-queue "^0.1.0" - -p-locate@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" - integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== - dependencies: - p-limit "^2.0.0" - -p-locate@^4.1.0: - version "4.1.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" - integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== - dependencies: - p-limit "^2.2.0" - -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - -p-map@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz" - integrity sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== - dependencies: - aggregate-error "^3.0.0" - -p-retry@^4.5.0: - version "4.6.2" - resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" - integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== - dependencies: - "@types/retry" "0.12.0" - retry "^0.13.1" - -p-try@^2.0.0: - version "2.2.0" - resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" - integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== - -package-json@^6.3.0: - version "6.5.0" - resolved "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz" - integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== - dependencies: - got "^9.6.0" - registry-auth-token "^4.0.0" - registry-url "^5.0.0" - semver "^6.2.0" - -param-case@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" - integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== - dependencies: - dot-case "^3.0.4" - tslib "^2.0.3" - -parent-module@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" - integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== - dependencies: - callsites "^3.0.0" - -parse-entities@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" - integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== - dependencies: - character-entities "^1.0.0" - character-entities-legacy "^1.0.0" - character-reference-invalid "^1.0.0" - is-alphanumerical "^1.0.0" - is-decimal "^1.0.0" - is-hexadecimal "^1.0.0" - -parse-json@^5.0.0: - version "5.2.0" - resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" - integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== - dependencies: - "@babel/code-frame" "^7.0.0" - error-ex "^1.3.1" - json-parse-even-better-errors "^2.3.0" - lines-and-columns "^1.1.6" - -parse-numeric-range@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz" - integrity sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ== - -parse5-htmlparser2-tree-adapter@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" - integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== - dependencies: - domhandler "^5.0.2" - parse5 "^7.0.0" - -parse5@^6.0.0: - version "6.0.1" - resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" - integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== - -parse5@^7.0.0: - version "7.1.2" - resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" - integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== - dependencies: - entities "^4.4.0" - -parseurl@~1.3.2, parseurl@~1.3.3: - version "1.3.3" - resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" - integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== - -pascal-case@^3.1.2: - version "3.1.2" - resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" - integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== - dependencies: - no-case "^3.0.4" - tslib "^2.0.3" - -path-browserify@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz" - integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== - -path-exists@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - -path-is-inside@1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz" - integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w== - -path-key@^3.0.0, path-key@^3.1.0: - version "3.1.1" - resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" - integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== - -path-parse@^1.0.7: - version "1.0.7" - resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" - integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== - -path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" - integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== - -path-to-regexp@2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-2.2.1.tgz" - integrity sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ== - -path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz" - integrity sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA== - dependencies: - isarray "0.0.1" - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -perfect-scrollbar@^1.5.5: - version "1.5.5" - resolved "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz" - integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== - -picocolors@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" - integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== - -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: - version "2.3.1" - resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" - integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== - -pkg-dir@^4.1.0: - version "4.2.0" - resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" - integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== - dependencies: - find-up "^4.0.0" - -pkg-up@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" - integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== - dependencies: - find-up "^3.0.0" - -pluralize@^8.0.0: - version "8.0.0" - resolved "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz" - integrity sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== - -polished@^4.1.3: - version "4.2.2" - resolved "https://registry.npmjs.org/polished/-/polished-4.2.2.tgz" - integrity sha512-Sz2Lkdxz6F2Pgnpi9U5Ng/WdWAUZxmHrNPoVlm3aAemxoy2Qy7LGjQg4uf8qKelDAUW94F4np3iH2YPf2qefcQ== - dependencies: - "@babel/runtime" "^7.17.8" - -postcss-calc@^8.2.3: - version "8.2.4" - resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" - integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== - dependencies: - postcss-selector-parser "^6.0.9" - postcss-value-parser "^4.2.0" - -postcss-colormin@^5.3.1: - version "5.3.1" - resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" - integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - colord "^2.9.1" - postcss-value-parser "^4.2.0" - -postcss-convert-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" - integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-discard-comments@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" - integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== - -postcss-discard-duplicates@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" - integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== - -postcss-discard-empty@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" - integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== - -postcss-discard-overridden@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" - integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== - -postcss-discard-unused@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-5.1.0.tgz" - integrity sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-loader@^7.0.0: - version "7.3.3" - resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz" - integrity sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA== - dependencies: - cosmiconfig "^8.2.0" - jiti "^1.18.2" - semver "^7.3.8" - -postcss-merge-idents@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-5.1.1.tgz" - integrity sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-merge-longhand@^5.1.7: - version "5.1.7" - resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" - integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== - dependencies: - postcss-value-parser "^4.2.0" - stylehacks "^5.1.1" - -postcss-merge-rules@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" - integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - cssnano-utils "^3.1.0" - postcss-selector-parser "^6.0.5" - -postcss-minify-font-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" - integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-minify-gradients@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" - integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== - dependencies: - colord "^2.9.1" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-params@^5.1.4: - version "5.1.4" - resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" - integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== - dependencies: - browserslist "^4.21.4" - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-minify-selectors@^5.2.1: - version "5.2.1" - resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" - integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-modules-extract-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" - integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== - -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - -postcss-modules-scope@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" - integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== - dependencies: - postcss-selector-parser "^6.0.4" - -postcss-modules-values@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" - integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== - dependencies: - icss-utils "^5.0.0" - -postcss-normalize-charset@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" - integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== - -postcss-normalize-display-values@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" - integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-positions@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" - integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-repeat-style@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" - integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-string@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" - integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-timing-functions@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" - integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-normalize-unicode@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" - integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== - dependencies: - browserslist "^4.21.4" - postcss-value-parser "^4.2.0" - -postcss-normalize-url@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" - integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== - dependencies: - normalize-url "^6.0.1" - postcss-value-parser "^4.2.0" - -postcss-normalize-whitespace@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" - integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-ordered-values@^5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" - integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== - dependencies: - cssnano-utils "^3.1.0" - postcss-value-parser "^4.2.0" - -postcss-reduce-idents@^5.2.0: - version "5.2.0" - resolved "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-5.2.0.tgz" - integrity sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-reduce-initial@^5.1.2: - version "5.1.2" - resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" - integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== - dependencies: - browserslist "^4.21.4" - caniuse-api "^3.0.0" - -postcss-reduce-transforms@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" - integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== - dependencies: - postcss-value-parser "^4.2.0" - -postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: - version "6.0.13" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" - integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - -postcss-sort-media-queries@^4.2.1: - version "4.4.1" - resolved "https://registry.npmjs.org/postcss-sort-media-queries/-/postcss-sort-media-queries-4.4.1.tgz" - integrity sha512-QDESFzDDGKgpiIh4GYXsSy6sek2yAwQx1JASl5AxBtU1Lq2JfKBljIPNdil989NcSKRQX1ToiaKphImtBuhXWw== - dependencies: - sort-css-media-queries "2.1.0" - -postcss-svgo@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" - integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== - dependencies: - postcss-value-parser "^4.2.0" - svgo "^2.7.0" - -postcss-unique-selectors@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" - integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== - dependencies: - postcss-selector-parser "^6.0.5" - -postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: - version "4.2.0" - resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" - integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== - -postcss-zindex@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-5.1.0.tgz" - integrity sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A== - -postcss@8.4.31: - version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" - integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -postcss@^8.3.11, postcss@^8.4.14, postcss@^8.4.17, postcss@^8.4.21: - version "8.4.25" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" - integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== - dependencies: - nanoid "^3.3.6" - picocolors "^1.0.0" - source-map-js "^1.0.2" - -prepend-http@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz" - integrity sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA== - -prettier@3.2.5: - version "3.2.5" - resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" - integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== - -pretty-error@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" - integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== - dependencies: - lodash "^4.17.20" - renderkid "^3.0.0" - -pretty-time@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/pretty-time/-/pretty-time-1.1.0.tgz" - integrity sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA== - -prism-react-renderer@^1.3.5: - version "1.3.5" - resolved "https://registry.npmjs.org/prism-react-renderer/-/prism-react-renderer-1.3.5.tgz" - integrity sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg== - -prismjs@^1.27.0, prismjs@^1.28.0, prismjs@^1.29.0: - version "1.29.0" - resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" - integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise@^7.1.1: - version "7.3.1" - resolved "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz" - integrity sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== - dependencies: - asap "~2.0.3" - -prompts@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" - integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== - dependencies: - kleur "^3.0.3" - sisteransi "^1.0.5" - -prop-types@^15.5.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: - version "15.8.1" - resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" - integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== - dependencies: - loose-envify "^1.4.0" - object-assign "^4.1.1" - react-is "^16.13.1" - -property-information@^5.0.0, property-information@^5.3.0: - version "5.6.0" - resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" - integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== - dependencies: - xtend "^4.0.0" - -proxy-addr@~2.0.7: - version "2.0.7" - resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" - integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== - dependencies: - forwarded "0.2.0" - ipaddr.js "1.9.1" - -pump@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" - integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== - dependencies: - end-of-stream "^1.1.0" - once "^1.3.1" - -punycode@^1.3.2: - version "1.4.1" - resolved "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz" - integrity sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ== - -punycode@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" - integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== - -pupa@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz" - integrity sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A== - dependencies: - escape-goat "^2.0.0" - -pure-color@^1.2.0: - version "1.3.0" - resolved "https://registry.npmjs.org/pure-color/-/pure-color-1.3.0.tgz" - integrity sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA== - -qs@6.11.0: - version "6.11.0" - resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" - integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== - dependencies: - side-channel "^1.0.4" - -queue-microtask@^1.2.2: - version "1.2.3" - resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" - integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== - -queue@6.0.2: - version "6.0.2" - resolved "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz" - integrity sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA== - dependencies: - inherits "~2.0.3" - -randombytes@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" - integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== - dependencies: - safe-buffer "^5.1.0" - -range-parser@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz" - integrity sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A== - -range-parser@^1.2.1, range-parser@~1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" - integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== - -raw-body@2.5.1: - version "2.5.1" - resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - -rc@1.2.8, rc@^1.2.8: - version "1.2.8" - resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" - integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -react-apple-login@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/react-apple-login/-/react-apple-login-1.1.6.tgz#bea08cae70efebc966bf867cda50d9a2f8ca1a79" - integrity sha512-ySV6ax0aB+ksA7lKzhr4MvsgjwSH068VtdHJXS+7rL380IJnNQNl14SszR31k3UqB8q8C1H1oyjJFGq4MyO6tw== - -react-base16-styling@^0.6.0: - version "0.6.0" - resolved "https://registry.npmjs.org/react-base16-styling/-/react-base16-styling-0.6.0.tgz" - integrity sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ== - dependencies: - base16 "^1.0.0" - lodash.curry "^4.0.1" - lodash.flow "^3.3.0" - pure-color "^1.2.0" - -react-dev-utils@^12.0.1: - version "12.0.1" - resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" - integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== - dependencies: - "@babel/code-frame" "^7.16.0" - address "^1.1.2" - browserslist "^4.18.1" - chalk "^4.1.2" - cross-spawn "^7.0.3" - detect-port-alt "^1.1.6" - escape-string-regexp "^4.0.0" - filesize "^8.0.6" - find-up "^5.0.0" - fork-ts-checker-webpack-plugin "^6.5.0" - global-modules "^2.0.0" - globby "^11.0.4" - gzip-size "^6.0.0" - immer "^9.0.7" - is-root "^2.1.0" - loader-utils "^3.2.0" - open "^8.4.0" - pkg-up "^3.1.0" - prompts "^2.4.2" - react-error-overlay "^6.0.11" - recursive-readdir "^2.2.2" - shell-quote "^1.7.3" - strip-ansi "^6.0.1" - text-table "^0.2.0" - -react-dom@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz" - integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - scheduler "^0.20.2" - -react-error-overlay@^6.0.11: - version "6.0.11" - resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" - integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== - -react-fast-compare@^3.2.0: - version "3.2.2" - resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz" - integrity sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ== - -react-helmet-async@*, react-helmet-async@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-1.3.0.tgz" - integrity sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg== - dependencies: - "@babel/runtime" "^7.12.5" - invariant "^2.2.4" - prop-types "^15.7.2" - react-fast-compare "^3.2.0" - shallowequal "^1.1.0" - -react-international-phone@^4.3.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/react-international-phone/-/react-international-phone-4.4.0.tgz#1a7e678df0fd5611785aadb22706c80a828ed77c" - integrity sha512-dxjgKrbwYBFtB8aL/x0K0SmtsABEnqeGaMwHm66aFLN3gZqtGDoY/MgKN3qaMPOrv5mwUxjrpYwBx9ea31C5vA== - -react-is@^16.13.1, react-is@^16.6.0, react-is@^16.7.0: - version "16.13.1" - resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" - integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== - -react-is@^19.0.0: - version "19.0.0" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-19.0.0.tgz#d6669fd389ff022a9684f708cf6fa4962d1fea7a" - integrity sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g== - -react-json-view@^1.21.3: - version "1.21.3" - resolved "https://registry.npmjs.org/react-json-view/-/react-json-view-1.21.3.tgz" - integrity sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw== - dependencies: - flux "^4.0.1" - react-base16-styling "^0.6.0" - react-lifecycles-compat "^3.0.4" - react-textarea-autosize "^8.3.2" - -react-lifecycles-compat@^3.0.4: - version "3.0.4" - resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" - integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== - -react-loadable-ssr-addon-v5-slorber@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/react-loadable-ssr-addon-v5-slorber/-/react-loadable-ssr-addon-v5-slorber-1.0.1.tgz" - integrity sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A== - dependencies: - "@babel/runtime" "^7.10.3" - -"react-loadable@npm:@docusaurus/react-loadable@5.5.2": - version "5.5.2" - resolved "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-5.5.2.tgz" - integrity sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ== - dependencies: - "@types/react" "*" - prop-types "^15.6.2" - -react-router-config@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/react-router-config/-/react-router-config-5.1.1.tgz" - integrity sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg== - dependencies: - "@babel/runtime" "^7.1.2" - -react-router-dom@^5.3.3: - version "5.3.4" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-5.3.4.tgz" - integrity sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - loose-envify "^1.3.1" - prop-types "^15.6.2" - react-router "5.3.4" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-router@5.3.4, react-router@^5.3.3: - version "5.3.4" - resolved "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz" - integrity sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA== - dependencies: - "@babel/runtime" "^7.12.13" - history "^4.9.0" - hoist-non-react-statics "^3.1.0" - loose-envify "^1.3.1" - path-to-regexp "^1.7.0" - prop-types "^15.6.2" - react-is "^16.6.0" - tiny-invariant "^1.0.2" - tiny-warning "^1.0.0" - -react-tabs@^3.2.2: - version "3.2.3" - resolved "https://registry.npmjs.org/react-tabs/-/react-tabs-3.2.3.tgz" - integrity sha512-jx325RhRVnS9DdFbeF511z0T0WEqEoMl1uCE3LoZ6VaZZm7ytatxbum0B8bCTmaiV0KsU+4TtLGTGevCic7SWg== - dependencies: - clsx "^1.1.0" - prop-types "^15.5.0" - -react-textarea-autosize@^8.3.2: - version "8.5.2" - resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz" - integrity sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg== - dependencies: - "@babel/runtime" "^7.20.13" - use-composed-ref "^1.3.0" - use-latest "^1.2.1" - -react-transition-group@^4.4.5: - version "4.4.5" - resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.5.tgz#e53d4e3f3344da8521489fbef8f2581d42becdd1" - integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== - dependencies: - "@babel/runtime" "^7.5.5" - dom-helpers "^5.0.1" - loose-envify "^1.4.0" - prop-types "^15.6.2" - -react@^17.0.2: - version "17.0.2" - resolved "https://registry.npmjs.org/react/-/react-17.0.2.tgz" - integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -readable-stream@^2.0.1, readable-stream@~2.3.6: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.0.6: - version "3.6.2" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" - integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -readable-stream@~1.0.31: - version "1.0.34" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@~3.6.0: - version "3.6.0" - resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" - integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== - dependencies: - picomatch "^2.2.1" - -reading-time@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/reading-time/-/reading-time-1.5.0.tgz" - integrity sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg== - -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz" - integrity sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw== - dependencies: - resolve "^1.1.6" - -recursive-readdir@^2.2.2: - version "2.2.3" - resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" - integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== - dependencies: - minimatch "^3.0.5" - -redoc@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/redoc/-/redoc-2.0.0.tgz" - integrity sha512-rU8iLdAkT89ywOkYk66Mr+IofqaMASlRvTew0dJvopCORMIPUcPMxjlJbJNC6wsn2vvMnpUFLQ/0ISDWn9BWag== - dependencies: - "@redocly/openapi-core" "^1.0.0-beta.104" - classnames "^2.3.1" - decko "^1.2.0" - dompurify "^2.2.8" - eventemitter3 "^4.0.7" - json-pointer "^0.6.2" - lunr "^2.3.9" - mark.js "^8.11.1" - marked "^4.0.15" - mobx-react "^7.2.0" - openapi-sampler "^1.3.0" - path-browserify "^1.0.1" - perfect-scrollbar "^1.5.5" - polished "^4.1.3" - prismjs "^1.27.0" - prop-types "^15.7.2" - react-tabs "^3.2.2" - slugify "~1.4.7" - stickyfill "^1.1.1" - style-loader "^3.3.1" - swagger2openapi "^7.0.6" - url-template "^2.0.8" - -redocusaurus@^1.6.3: - version "1.6.4" - resolved "https://registry.npmjs.org/redocusaurus/-/redocusaurus-1.6.4.tgz" - integrity sha512-0o7bDrs5eLOiMR7BLjdZ6nYEQBNvle/MrUJsvfaKShkZHvbelAJPmH7muoiL+JWcxGCiI8vuh9EKTDDqqRkE9A== - dependencies: - docusaurus-plugin-redoc "1.6.0" - docusaurus-theme-redoc "1.6.4" - -reftools@^1.1.9: - version "1.1.9" - resolved "https://registry.npmjs.org/reftools/-/reftools-1.1.9.tgz" - integrity sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w== - -regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== - dependencies: - regenerate "^1.4.2" - -regenerate@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" - integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== - -regenerator-runtime@^0.13.11: - version "0.13.11" - resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" - integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== - -regenerator-runtime@^0.14.0: - version "0.14.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" - integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== - -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== - dependencies: - "@babel/runtime" "^7.8.4" - -regexpu-core@^5.3.1: - version "5.3.2" - resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" - integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== - dependencies: - "@babel/regjsgen" "^0.8.0" - regenerate "^1.4.2" - regenerate-unicode-properties "^10.1.0" - regjsparser "^0.9.1" - unicode-match-property-ecmascript "^2.0.0" - unicode-match-property-value-ecmascript "^2.1.0" - -registry-auth-token@^4.0.0: - version "4.2.2" - resolved "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.2.tgz" - integrity sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg== - dependencies: - rc "1.2.8" - -registry-url@^5.0.0: - version "5.1.0" - resolved "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz" - integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== - dependencies: - rc "^1.2.8" - -regjsparser@^0.9.1: - version "0.9.1" - resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" - integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== - dependencies: - jsesc "~0.5.0" - -relateurl@^0.2.7: - version "0.2.7" - resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" - integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== - -remark-emoji@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/remark-emoji/-/remark-emoji-2.2.0.tgz" - integrity sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w== - dependencies: - emoticon "^3.2.0" - node-emoji "^1.10.0" - unist-util-visit "^2.0.3" - -remark-footnotes@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/remark-footnotes/-/remark-footnotes-2.0.0.tgz" - integrity sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ== - -remark-mdx@1.6.22: - version "1.6.22" - resolved "https://registry.npmjs.org/remark-mdx/-/remark-mdx-1.6.22.tgz" - integrity sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ== - dependencies: - "@babel/core" "7.12.9" - "@babel/helper-plugin-utils" "7.10.4" - "@babel/plugin-proposal-object-rest-spread" "7.12.1" - "@babel/plugin-syntax-jsx" "7.12.1" - "@mdx-js/util" "1.6.22" - is-alphabetical "1.0.4" - remark-parse "8.0.3" - unified "9.2.0" - -remark-parse@8.0.3: - version "8.0.3" - resolved "https://registry.npmjs.org/remark-parse/-/remark-parse-8.0.3.tgz" - integrity sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q== - dependencies: - ccount "^1.0.0" - collapse-white-space "^1.0.2" - is-alphabetical "^1.0.0" - is-decimal "^1.0.0" - is-whitespace-character "^1.0.0" - is-word-character "^1.0.0" - markdown-escapes "^1.0.0" - parse-entities "^2.0.0" - repeat-string "^1.5.4" - state-toggle "^1.0.0" - trim "0.0.1" - trim-trailing-lines "^1.0.0" - unherit "^1.0.4" - unist-util-remove-position "^2.0.0" - vfile-location "^3.0.0" - xtend "^4.0.1" - -remark-squeeze-paragraphs@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/remark-squeeze-paragraphs/-/remark-squeeze-paragraphs-4.0.0.tgz" - integrity sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw== - dependencies: - mdast-squeeze-paragraphs "^4.0.0" - -renderkid@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" - integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== - dependencies: - css-select "^4.1.3" - dom-converter "^0.2.0" - htmlparser2 "^6.1.0" - lodash "^4.17.21" - strip-ansi "^6.0.1" - -repeat-string@^1.5.4: - version "1.6.1" - resolved "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - integrity sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w== - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" - integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== - -require-from-string@^2.0.2: - version "2.0.2" - resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" - integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== - -"require-like@>= 0.1.1": - version "0.1.2" - resolved "https://registry.npmjs.org/require-like/-/require-like-0.1.2.tgz" - integrity sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A== - -requires-port@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" - integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== - -resolve-from@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" - integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== - -resolve-pathname@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/resolve-pathname/-/resolve-pathname-3.0.0.tgz" - integrity sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng== - -resolve@^1.1.6, resolve@^1.14.2, resolve@^1.3.2: - version "1.22.2" - resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" - integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== - dependencies: - is-core-module "^2.11.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -resolve@^1.19.0: - version "1.22.10" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" - integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== - dependencies: - is-core-module "^2.16.0" - path-parse "^1.0.7" - supports-preserve-symlinks-flag "^1.0.0" - -responselike@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz" - integrity sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ== - dependencies: - lowercase-keys "^1.0.0" - -retry@^0.13.1: - version "0.13.1" - resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" - integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rimraf@^3.0.2: - version "3.0.2" - resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" - integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== - dependencies: - glob "^7.1.3" - -rtl-detect@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/rtl-detect/-/rtl-detect-1.0.4.tgz" - integrity sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ== - -rtlcss@^3.5.0: - version "3.5.0" - resolved "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz" - integrity sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A== - dependencies: - find-up "^5.0.0" - picocolors "^1.0.0" - postcss "^8.3.11" - strip-json-comments "^3.1.1" - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -rxjs@^7.5.4: - version "7.8.1" - resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" - integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== - dependencies: - tslib "^2.1.0" - -safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -"safer-buffer@>= 2.1.2 < 3": - version "2.1.2" - resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" - integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== - -sax@^1.2.4: - version "1.2.4" - resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== - -scheduler@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz" - integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ== - dependencies: - loose-envify "^1.1.0" - object-assign "^4.1.1" - -schema-utils@2.7.0: - version "2.7.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" - integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== - dependencies: - "@types/json-schema" "^7.0.4" - ajv "^6.12.2" - ajv-keywords "^3.4.1" - -schema-utils@^2.6.5: - version "2.7.1" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" - integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== - dependencies: - "@types/json-schema" "^7.0.5" - ajv "^6.12.4" - ajv-keywords "^3.5.2" - -schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: - version "3.3.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" - integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== - dependencies: - "@types/json-schema" "^7.0.8" - ajv "^6.12.5" - ajv-keywords "^3.5.2" - -schema-utils@^4.0.0: - version "4.2.0" - resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" - integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== - dependencies: - "@types/json-schema" "^7.0.9" - ajv "^8.9.0" - ajv-formats "^2.1.1" - ajv-keywords "^5.1.0" - -section-matter@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/section-matter/-/section-matter-1.0.0.tgz" - integrity sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA== - dependencies: - extend-shallow "^2.0.1" - kind-of "^6.0.0" - -select-hose@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" - integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== - -selfsigned@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" - integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== - dependencies: - node-forge "^1" - -semver-diff@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz" - integrity sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg== - dependencies: - semver "^6.3.0" - -semver@^5.4.1: - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - -semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^7.3.2, semver@^7.3.4, semver@^7.3.7, semver@^7.3.8: - version "7.5.4" - resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" - integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== - dependencies: - lru-cache "^6.0.0" - -semver@^7.6.3: - version "7.6.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" - integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== - -send@0.18.0: - version "0.18.0" - resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" - integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== - dependencies: - debug "2.6.9" - depd "2.0.0" - destroy "1.2.0" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "2.0.0" - mime "1.6.0" - ms "2.1.3" - on-finished "2.4.1" - range-parser "~1.2.1" - statuses "2.0.1" - -serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== - dependencies: - randombytes "^2.1.0" - -serve-handler@^6.1.3: - version "6.1.5" - resolved "https://registry.npmjs.org/serve-handler/-/serve-handler-6.1.5.tgz" - integrity sha512-ijPFle6Hwe8zfmBxJdE+5fta53fdIY0lHISJvuikXB3VYFafRjMRpOffSPvCYsbKyBA7pvy9oYr/BT1O3EArlg== - dependencies: - bytes "3.0.0" - content-disposition "0.5.2" - fast-url-parser "1.1.3" - mime-types "2.1.18" - minimatch "3.1.2" - path-is-inside "1.0.2" - path-to-regexp "2.2.1" - range-parser "1.2.0" - -serve-index@^1.9.1: - version "1.9.1" - resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" - integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== - dependencies: - accepts "~1.3.4" - batch "0.6.1" - debug "2.6.9" - escape-html "~1.0.3" - http-errors "~1.6.2" - mime-types "~2.1.17" - parseurl "~1.3.2" - -serve-static@1.15.0: - version "1.15.0" - resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" - integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.18.0" - -set-function-length@^1.2.1: - version "1.2.2" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz" - integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== - dependencies: - define-data-property "^1.1.4" - es-errors "^1.3.0" - function-bind "^1.1.2" - get-intrinsic "^1.2.4" - gopd "^1.0.1" - has-property-descriptors "^1.0.2" - -setimmediate@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz" - integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== - -setprototypeof@1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" - integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== - -setprototypeof@1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" - integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== - -sha256-uint8array@^0.10.7: - version "0.10.7" - resolved "https://registry.yarnpkg.com/sha256-uint8array/-/sha256-uint8array-0.10.7.tgz#c751fc914f4227b26d996980562065fa4eadcf99" - integrity sha512-1Q6JQU4tX9NqsDGodej6pkrUVQVNapLZnvkwIhddH/JqzBZF1fSaxSWNY6sziXBE8aEa2twtGkXUrwzGeZCMpQ== - -shallow-clone@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" - integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== - dependencies: - kind-of "^6.0.2" - -shallowequal@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz" - integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== - -sharp@^0.33.5: - version "0.33.5" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.33.5.tgz#13e0e4130cc309d6a9497596715240b2ec0c594e" - integrity sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw== - dependencies: - color "^4.2.3" - detect-libc "^2.0.3" - semver "^7.6.3" - optionalDependencies: - "@img/sharp-darwin-arm64" "0.33.5" - "@img/sharp-darwin-x64" "0.33.5" - "@img/sharp-libvips-darwin-arm64" "1.0.4" - "@img/sharp-libvips-darwin-x64" "1.0.4" - "@img/sharp-libvips-linux-arm" "1.0.5" - "@img/sharp-libvips-linux-arm64" "1.0.4" - "@img/sharp-libvips-linux-s390x" "1.0.4" - "@img/sharp-libvips-linux-x64" "1.0.4" - "@img/sharp-libvips-linuxmusl-arm64" "1.0.4" - "@img/sharp-libvips-linuxmusl-x64" "1.0.4" - "@img/sharp-linux-arm" "0.33.5" - "@img/sharp-linux-arm64" "0.33.5" - "@img/sharp-linux-s390x" "0.33.5" - "@img/sharp-linux-x64" "0.33.5" - "@img/sharp-linuxmusl-arm64" "0.33.5" - "@img/sharp-linuxmusl-x64" "0.33.5" - "@img/sharp-wasm32" "0.33.5" - "@img/sharp-win32-ia32" "0.33.5" - "@img/sharp-win32-x64" "0.33.5" - -shebang-command@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" - integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== - dependencies: - shebang-regex "^3.0.0" - -shebang-regex@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" - integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== - -shell-quote@^1.7.3: - version "1.8.1" - resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" - integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== - -shelljs@^0.8.5: - version "0.8.5" - resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.5.tgz" - integrity sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow== - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - -should-equal@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz" - integrity sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA== - dependencies: - should-type "^1.4.0" - -should-format@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz" - integrity sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q== - dependencies: - should-type "^1.3.0" - should-type-adaptors "^1.0.1" - -should-type-adaptors@^1.0.1: - version "1.1.0" - resolved "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.1.0.tgz" - integrity sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA== - dependencies: - should-type "^1.3.0" - should-util "^1.0.0" - -should-type@^1.3.0, should-type@^1.4.0: - version "1.4.0" - resolved "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz" - integrity sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ== - -should-util@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/should-util/-/should-util-1.0.1.tgz" - integrity sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g== - -should@^13.2.1: - version "13.2.3" - resolved "https://registry.npmjs.org/should/-/should-13.2.3.tgz" - integrity sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ== - dependencies: - should-equal "^2.0.0" - should-format "^3.0.3" - should-type "^1.4.0" - should-type-adaptors "^1.0.1" - should-util "^1.0.0" - -side-channel@^1.0.4: - version "1.0.4" - resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" - integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - -signal-exit@^3.0.2, signal-exit@^3.0.3: - version "3.0.7" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" - integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== - dependencies: - is-arrayish "^0.3.1" - -sirv@^1.0.7: - version "1.0.19" - resolved "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz" - integrity sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ== - dependencies: - "@polka/url" "^1.0.0-next.20" - mrmime "^1.0.0" - totalist "^1.0.0" - -sisteransi@^1.0.5: - version "1.0.5" - resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" - integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== - -sitemap@^7.1.1: - version "7.1.1" - resolved "https://registry.npmjs.org/sitemap/-/sitemap-7.1.1.tgz" - integrity sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg== - dependencies: - "@types/node" "^17.0.5" - "@types/sax" "^1.2.1" - arg "^5.0.0" - sax "^1.2.4" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -slash@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" - integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== - -slugify@~1.4.7: - version "1.4.7" - resolved "https://registry.npmjs.org/slugify/-/slugify-1.4.7.tgz" - integrity sha512-tf+h5W1IrjNm/9rKKj0JU2MDMruiopx0jjVA5zCdBtcGjfp0+c5rHw/zADLC3IeKlGHtVbHtpfzvYA0OYT+HKg== - -sockjs@^0.3.24: - version "0.3.24" - resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" - integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== - dependencies: - faye-websocket "^0.11.3" - uuid "^8.3.2" - websocket-driver "^0.7.4" - -sort-css-media-queries@2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/sort-css-media-queries/-/sort-css-media-queries-2.1.0.tgz" - integrity sha512-IeWvo8NkNiY2vVYdPa27MCQiR0MN0M80johAYFVxWWXQ44KU84WNxjslwBHmc/7ZL2ccwkM7/e6S5aiKZXm7jA== - -source-map-js@^1.0.2: - version "1.0.2" - resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" - integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== - -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - -source-map@^0.5.0, source-map@^0.5.7: - version "0.5.7" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== - -source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0: - version "0.6.1" - resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" - integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== - -space-separated-tokens@^1.0.0: - version "1.1.5" - resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" - integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== - -spdy-transport@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" - integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== - dependencies: - debug "^4.1.0" - detect-node "^2.0.4" - hpack.js "^2.1.6" - obuf "^1.1.2" - readable-stream "^3.0.6" - wbuf "^1.7.3" - -spdy@^4.0.2: - version "4.0.2" - resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" - integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== - dependencies: - debug "^4.1.0" - handle-thing "^2.0.0" - http-deceiver "^1.2.7" - select-hose "^2.0.0" - spdy-transport "^3.0.0" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" - integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== - -stable@^0.1.8: - version "0.1.8" - resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" - integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== - -state-toggle@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz" - integrity sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ== - -statuses@2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" - integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== - -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - -std-env@^3.0.1: - version "3.3.3" - resolved "https://registry.npmjs.org/std-env/-/std-env-3.3.3.tgz" - integrity sha512-Rz6yejtVyWnVjC1RFvNmYL10kgjC49EOghxWn0RFqlCHGFpQx+Xe7yW3I4ceK1SGrWIGMjD5Kbue8W/udkbMJg== - -stickyfill@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/stickyfill/-/stickyfill-1.1.1.tgz" - integrity sha512-GCp7vHAfpao+Qh/3Flh9DXEJ/qSi0KJwJw6zYlZOtRYXWUIpMM6mC2rIep/dK8RQqwW0KxGJIllmjPIBOGN8AA== - -streamsearch@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/streamsearch/-/streamsearch-1.1.0.tgz#404dd1e2247ca94af554e841a8ef0eaa238da764" - integrity sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg== - -string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -stringify-object@^3.3.0: - version "3.3.0" - resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" - integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== - dependencies: - get-own-enumerable-property-symbols "^3.0.0" - is-obj "^1.0.1" - is-regexp "^1.0.0" - -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-bom-string@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz" - integrity sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g== - -strip-final-newline@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" - integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== - -strip-json-comments@^3.1.1: - version "3.1.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" - integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" - integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== - -style-loader@^3.3.1: - version "3.3.3" - resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz" - integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== - -style-to-object@0.3.0, style-to-object@^0.3.0: - version "0.3.0" - resolved "https://registry.npmjs.org/style-to-object/-/style-to-object-0.3.0.tgz" - integrity sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA== - dependencies: - inline-style-parser "0.1.1" - -styled-components@^5.3.6: - version "5.3.11" - resolved "https://registry.npmjs.org/styled-components/-/styled-components-5.3.11.tgz" - integrity sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - "@babel/traverse" "^7.4.5" - "@emotion/is-prop-valid" "^1.1.0" - "@emotion/stylis" "^0.8.4" - "@emotion/unitless" "^0.7.4" - babel-plugin-styled-components ">= 1.12.0" - css-to-react-native "^3.0.0" - hoist-non-react-statics "^3.0.0" - shallowequal "^1.1.0" - supports-color "^5.5.0" - -styled-jsx@5.1.6: - version "5.1.6" - resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-5.1.6.tgz#83b90c077e6c6a80f7f5e8781d0f311b2fe41499" - integrity sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA== - dependencies: - client-only "0.0.1" - -stylehacks@^5.1.1: - version "5.1.1" - resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" - integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== - dependencies: - browserslist "^4.21.4" - postcss-selector-parser "^6.0.4" - -stylis@4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.2.0.tgz#79daee0208964c8fe695a42fcffcac633a211a51" - integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== - -supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" - integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== - dependencies: - has-flag "^3.0.0" - -supports-color@^7.1.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-preserve-symlinks-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" - integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== - -svg-parser@^2.0.4: - version "2.0.4" - resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" - integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== - -svgo@^2.7.0, svgo@^2.8.0: - version "2.8.0" - resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" - integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== - dependencies: - "@trysound/sax" "0.2.0" - commander "^7.2.0" - css-select "^4.1.3" - css-tree "^1.1.3" - csso "^4.2.0" - picocolors "^1.0.0" - stable "^0.1.8" - -swagger2openapi@^7.0.6: - version "7.0.8" - resolved "https://registry.npmjs.org/swagger2openapi/-/swagger2openapi-7.0.8.tgz" - integrity sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g== - dependencies: - call-me-maybe "^1.0.1" - node-fetch "^2.6.1" - node-fetch-h2 "^2.3.0" - node-readfiles "^0.2.0" - oas-kit-common "^1.0.8" - oas-resolver "^2.5.6" - oas-schema-walker "^1.1.5" - oas-validator "^5.0.8" - reftools "^1.1.9" - yaml "^1.10.0" - yargs "^17.0.1" - -tapable@^1.0.0: - version "1.1.3" - resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" - integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== - -tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - -terser-webpack-plugin@^5.3.3, terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser@^5.10.0, terser@^5.16.8: - version "5.19.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.19.0.tgz" - integrity sha512-JpcpGOQLOXm2jsomozdMDpd5f8ZHh1rR48OFgWUH3QsyZcfPgv2qDCYbcDEAYNd4OZRj2bWYKpwdll/udZCk/Q== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -text-table@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" - integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== - -through2@^2.0.1: - version "2.0.5" - resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz" - integrity sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== - dependencies: - readable-stream "~2.3.6" - xtend "~4.0.1" - -thunky@^1.0.2: - version "1.1.0" - resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" - integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== - -tiny-invariant@^1.0.2: - version "1.3.1" - resolved "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz" - integrity sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw== - -tiny-warning@^1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" - integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== - -to-fast-properties@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" - integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== - -to-readable-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz" - integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -toidentifier@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" - integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== - -totalist@^1.0.0: - version "1.1.0" - resolved "https://registry.npmjs.org/totalist/-/totalist-1.1.0.tgz" - integrity sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g== - -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" - integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== - -trim-trailing-lines@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz" - integrity sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ== - -trim@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz" - integrity sha512-YzQV+TZg4AxpKxaTHK3c3D+kRDCGVEE7LemdlQZoQXn0iennk10RsIoY6ikzAqJTc9Xjl9C1/waHom/J86ziAQ== - -trough@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz" - integrity sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA== - -tslib@^2.0.3, tslib@^2.1.0, tslib@^2.4.0: - version "2.6.0" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" - integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== - -tslib@^2.8.0: - version "2.8.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - -type-fest@^2.5.0: - version "2.19.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz" - integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== - -type-is@~1.6.18: - version "1.6.18" - resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" - integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - -typedarray-to-buffer@^3.1.5: - version "3.1.5" - resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" - integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== - dependencies: - is-typedarray "^1.0.0" - -typescript@^4.7.4: - version "4.9.5" - resolved "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz" - integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== - -ua-parser-js@^1.0.35: - version "1.0.35" - resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz" - integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== - -unherit@^1.0.4: - version "1.1.3" - resolved "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz" - integrity sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ== - dependencies: - inherits "^2.0.0" - xtend "^4.0.0" - -unicode-canonical-property-names-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" - integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== - -unicode-match-property-ecmascript@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" - integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== - dependencies: - unicode-canonical-property-names-ecmascript "^2.0.0" - unicode-property-aliases-ecmascript "^2.0.0" - -unicode-match-property-value-ecmascript@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" - integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== - -unicode-property-aliases-ecmascript@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" - integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== - -unified@9.2.0: - version "9.2.0" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz" - integrity sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== - dependencies: - bail "^1.0.0" - extend "^3.0.0" - is-buffer "^2.0.0" - is-plain-obj "^2.0.0" - trough "^1.0.0" - vfile "^4.0.0" - -unique-string@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" - integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== - dependencies: - crypto-random-string "^2.0.0" - -unist-builder@2.0.3, unist-builder@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-builder/-/unist-builder-2.0.3.tgz" - integrity sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw== - -unist-util-generated@^1.0.0: - version "1.1.6" - resolved "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-1.1.6.tgz" - integrity sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg== - -unist-util-is@^4.0.0: - version "4.1.0" - resolved "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz" - integrity sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg== - -unist-util-position@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/unist-util-position/-/unist-util-position-3.1.0.tgz" - integrity sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA== - -unist-util-remove-position@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-2.0.1.tgz" - integrity sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA== - dependencies: - unist-util-visit "^2.0.0" - -unist-util-remove@^2.0.0: - version "2.1.0" - resolved "https://registry.npmjs.org/unist-util-remove/-/unist-util-remove-2.1.0.tgz" - integrity sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q== - dependencies: - unist-util-is "^4.0.0" - -unist-util-stringify-position@^2.0.0: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz" - integrity sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g== - dependencies: - "@types/unist" "^2.0.2" - -unist-util-visit-parents@^3.0.0: - version "3.1.1" - resolved "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz" - integrity sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - -unist-util-visit@2.0.3, unist-util-visit@^2.0.0, unist-util-visit@^2.0.3: - version "2.0.3" - resolved "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-2.0.3.tgz" - integrity sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q== - dependencies: - "@types/unist" "^2.0.0" - unist-util-is "^4.0.0" - unist-util-visit-parents "^3.0.0" - -universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== - -unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" - integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== - -untildify@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz" - integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== - -update-browserslist-db@^1.0.11: - version "1.0.11" - resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" - integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== - dependencies: - escalade "^3.1.1" - picocolors "^1.0.0" - -update-notifier@^5.1.0: - version "5.1.0" - resolved "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz" - integrity sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw== - dependencies: - boxen "^5.0.0" - chalk "^4.1.0" - configstore "^5.0.1" - has-yarn "^2.1.0" - import-lazy "^2.1.0" - is-ci "^2.0.0" - is-installed-globally "^0.4.0" - is-npm "^5.0.0" - is-yarn-global "^0.3.0" - latest-version "^5.1.0" - pupa "^2.1.1" - semver "^7.3.4" - semver-diff "^3.1.1" - xdg-basedir "^4.0.0" - -uri-js@^4.2.2: - version "4.4.1" - resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" - integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== - dependencies: - punycode "^2.1.0" - -url-loader@^4.1.1: - version "4.1.1" - resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" - integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== - dependencies: - loader-utils "^2.0.0" - mime-types "^2.1.27" - schema-utils "^3.0.0" - -url-parse-lax@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz" - integrity sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ== - dependencies: - prepend-http "^2.0.0" - -url-template@^2.0.8: - version "2.0.8" - resolved "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz" - integrity sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw== - -use-composed-ref@^1.3.0: - version "1.3.0" - resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" - integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== - -use-isomorphic-layout-effect@^1.1.1: - version "1.1.2" - resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" - integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== - -use-latest@^1.2.1: - version "1.2.1" - resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" - integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== - dependencies: - use-isomorphic-layout-effect "^1.1.1" - -use-sync-external-store@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" - integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== - -usehooks-ts@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/usehooks-ts/-/usehooks-ts-3.1.0.tgz#156119f36efc85f1b1952616c02580f140950eca" - integrity sha512-bBIa7yUyPhE1BCc0GmR96VU/15l/9gP1Ch5mYdLcFBaFGQsdmXkvjV0TtOqW1yUd6VjIwDunm+flSciCQXujiw== - dependencies: - lodash.debounce "^4.0.8" - -util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" - integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== - -utila@~0.4: - version "0.4.0" - resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" - integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== - -utility-types@^3.10.0: - version "3.10.0" - resolved "https://registry.npmjs.org/utility-types/-/utility-types-3.10.0.tgz" - integrity sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg== - -utils-merge@1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" - integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== - -uuid@^8.3.2: - version "8.3.2" - resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" - integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== - -value-equal@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/value-equal/-/value-equal-1.0.1.tgz" - integrity sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw== - -vary@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" - integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== - -vfile-location@^3.0.0, vfile-location@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/vfile-location/-/vfile-location-3.2.0.tgz" - integrity sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA== - -vfile-message@^2.0.0: - version "2.0.4" - resolved "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz" - integrity sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ== - dependencies: - "@types/unist" "^2.0.0" - unist-util-stringify-position "^2.0.0" - -vfile@^4.0.0: - version "4.2.1" - resolved "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz" - integrity sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA== - dependencies: - "@types/unist" "^2.0.0" - is-buffer "^2.0.0" - unist-util-stringify-position "^2.0.0" - vfile-message "^2.0.0" - -viem@^2.21.35: - version "2.21.56" - resolved "https://registry.yarnpkg.com/viem/-/viem-2.21.56.tgz#2b5b60794e5c1162b3b440e457d777402ebd799d" - integrity sha512-lHcVd1sFDlVWu482Sb4j22a5+hXJWE8HwqLgXDH49L7mfdA5QHfkQgeyl7K2kKg6pBbPbxIwd9so/u3LcynKTg== - dependencies: - "@noble/curves" "1.7.0" - "@noble/hashes" "1.6.1" - "@scure/bip32" "1.6.0" - "@scure/bip39" "1.5.0" - abitype "1.0.7" - isows "1.0.6" - ox "0.1.2" - webauthn-p256 "0.0.10" - ws "8.18.0" - -wait-on@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz" - integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== - dependencies: - axios "^0.25.0" - joi "^17.6.0" - lodash "^4.17.21" - minimist "^1.2.5" - rxjs "^7.5.4" - -watchpack@^2.4.0: - version "2.4.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" - integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== - dependencies: - glob-to-regexp "^0.4.1" - graceful-fs "^4.1.2" - -wbuf@^1.1.0, wbuf@^1.7.3: - version "1.7.3" - resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" - integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== - dependencies: - minimalistic-assert "^1.0.0" - -web-namespaces@^1.0.0: - version "1.1.4" - resolved "https://registry.npmjs.org/web-namespaces/-/web-namespaces-1.1.4.tgz" - integrity sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw== - -webauthn-p256@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/webauthn-p256/-/webauthn-p256-0.0.10.tgz#877e75abe8348d3e14485932968edf3325fd2fdd" - integrity sha512-EeYD+gmIT80YkSIDb2iWq0lq2zbHo1CxHlQTeJ+KkCILWpVy3zASH3ByD4bopzfk0uCwXxLqKGLqp2W4O28VFA== - dependencies: - "@noble/curves" "^1.4.0" - "@noble/hashes" "^1.4.0" - -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" - integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== - -webpack-bundle-analyzer@^4.5.0: - version "4.9.0" - resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.0.tgz" - integrity sha512-+bXGmO1LyiNx0i9enBu3H8mv42sj/BJWhZNFwjz92tVnBa9J3JMGo2an2IXlEleoDOPn/Hofl5hr/xCpObUDtw== - dependencies: - "@discoveryjs/json-ext" "0.5.7" - acorn "^8.0.4" - acorn-walk "^8.0.0" - chalk "^4.1.0" - commander "^7.2.0" - gzip-size "^6.0.0" - lodash "^4.17.20" - opener "^1.5.2" - sirv "^1.0.7" - ws "^7.3.1" - -webpack-dev-middleware@^5.3.1: - version "5.3.3" - resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" - integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== - dependencies: - colorette "^2.0.10" - memfs "^3.4.3" - mime-types "^2.1.31" - range-parser "^1.2.1" - schema-utils "^4.0.0" - -webpack-dev-server@^4.9.3: - version "4.15.1" - resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" - integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== - dependencies: - "@types/bonjour" "^3.5.9" - "@types/connect-history-api-fallback" "^1.3.5" - "@types/express" "^4.17.13" - "@types/serve-index" "^1.9.1" - "@types/serve-static" "^1.13.10" - "@types/sockjs" "^0.3.33" - "@types/ws" "^8.5.5" - ansi-html-community "^0.0.8" - bonjour-service "^1.0.11" - chokidar "^3.5.3" - colorette "^2.0.10" - compression "^1.7.4" - connect-history-api-fallback "^2.0.0" - default-gateway "^6.0.3" - express "^4.17.3" - graceful-fs "^4.2.6" - html-entities "^2.3.2" - http-proxy-middleware "^2.0.3" - ipaddr.js "^2.0.1" - launch-editor "^2.6.0" - open "^8.0.9" - p-retry "^4.5.0" - rimraf "^3.0.2" - schema-utils "^4.0.0" - selfsigned "^2.1.1" - serve-index "^1.9.1" - sockjs "^0.3.24" - spdy "^4.0.2" - webpack-dev-middleware "^5.3.1" - ws "^8.13.0" - -webpack-merge@^5.8.0: - version "5.9.0" - resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz" - integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== - dependencies: - clone-deep "^4.0.1" - wildcard "^2.0.0" - -webpack-sources@^3.2.2, webpack-sources@^3.2.3: - version "3.2.3" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" - integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== - -webpack@^5.73.0: - version "5.88.1" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz" - integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -webpackbar@^5.0.2: - version "5.0.2" - resolved "https://registry.npmjs.org/webpackbar/-/webpackbar-5.0.2.tgz" - integrity sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ== - dependencies: - chalk "^4.1.0" - consola "^2.15.3" - pretty-time "^1.1.0" - std-env "^3.0.1" - -websocket-driver@>=0.5.1, websocket-driver@^0.7.4: - version "0.7.4" - resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" - integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== - dependencies: - http-parser-js ">=0.5.1" - safe-buffer ">=5.1.0" - websocket-extensions ">=0.1.1" - -websocket-extensions@>=0.1.1: - version "0.1.4" - resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" - integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== - -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" - integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - -which@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - -which@^2.0.1: - version "2.0.2" - resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" - integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== - dependencies: - isexe "^2.0.0" - -widest-line@^3.1.0: - version "3.1.0" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz" - integrity sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg== - dependencies: - string-width "^4.0.0" - -widest-line@^4.0.1: - version "4.0.1" - resolved "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz" - integrity sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig== - dependencies: - string-width "^5.0.1" - -wildcard@^2.0.0: - version "2.0.1" - resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" - integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== - -write-file-atomic@^3.0.0: - version "3.0.3" - resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" - integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== - dependencies: - imurmurhash "^0.1.4" - is-typedarray "^1.0.0" - signal-exit "^3.0.2" - typedarray-to-buffer "^3.1.5" - -ws@8.18.0: - version "8.18.0" - resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" - integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== - -ws@^7.3.1: - version "7.5.9" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" - integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== - -ws@^8.13.0: - version "8.13.0" - resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" - integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== - -xdg-basedir@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz" - integrity sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q== - -xml-js@^1.6.11: - version "1.6.11" - resolved "https://registry.npmjs.org/xml-js/-/xml-js-1.6.11.tgz" - integrity sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g== - dependencies: - sax "^1.2.4" - -xtend@^4.0.0, xtend@^4.0.1, xtend@~4.0.1: - version "4.0.2" - resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" - integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== - -y18n@^5.0.5: - version "5.0.8" - resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" - integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== - -yallist@^3.0.2: - version "3.1.1" - resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" - integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yaml-ast-parser@0.0.43: - version "0.0.43" - resolved "https://registry.npmjs.org/yaml-ast-parser/-/yaml-ast-parser-0.0.43.tgz" - integrity sha512-2PTINUwsRqSd+s8XxKaJWQlUuEMHJQyEuh2edBbW8KNJz0SJPwUSD2zRWqezFEdN7IzAgeuYHFUCF7o8zRdZ0A== - -yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: - version "1.10.2" - resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" - integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== - -yargs-parser@^20.2.2: - version "20.2.9" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.1.1: - version "21.1.1" - resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" - integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== - -yargs@^16.1.0: - version "16.2.0" - resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2" - -yargs@^17.0.1: - version "17.7.2" - resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" - integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== - dependencies: - cliui "^8.0.1" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.3" - y18n "^5.0.5" - yargs-parser "^21.1.1" - -yocto-queue@^0.1.0: - version "0.1.0" - resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" - integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== - -zwitch@^1.0.0: - version "1.0.5" - resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" - integrity sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==