From 6b13aff0b4f00af169bdd4e0341ee31aad8d437d Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Thu, 21 Nov 2024 04:16:02 -0500 Subject: [PATCH 01/19] ci(repo): Version packages (#4597) Co-authored-by: github-actions[bot] --- .changeset/few-files-switch.md | 3 --- .changeset/fifty-cameras-tease.md | 6 ------ .changeset/friendly-mice-pull.md | 2 -- .changeset/itchy-cycles-sell.md | 5 ----- .changeset/large-bulldogs-tap.md | 2 -- .changeset/mighty-clouds-explode.md | 8 -------- .changeset/orange-radios-nail.md | 2 -- .changeset/polite-seals-bake.md | 5 ----- .changeset/proud-carrots-carry.md | 5 ----- .changeset/proud-poems-walk.md | 5 ----- .changeset/red-chicken-visit.md | 6 ------ .changeset/rude-lions-know.md | 2 -- .changeset/shaggy-donuts-cry.md | 5 ----- .changeset/shy-months-invite.md | 2 -- .changeset/silent-bears-worry.md | 5 ----- .changeset/small-knives-behave.md | 2 -- .changeset/ten-hornets-deny.md | 2 -- .changeset/ten-jeans-double.md | 2 -- .changeset/thin-turkeys-turn.md | 2 -- .changeset/unlucky-teachers-joke.md | 2 -- .changeset/wet-dryers-pay.md | 2 -- packages/astro/CHANGELOG.md | 9 +++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 8 ++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 9 +++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 17 +++++++++++++++++ packages/clerk-js/package.json | 2 +- packages/dev-cli/CHANGELOG.md | 6 ++++++ packages/dev-cli/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 12 ++++++++++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 14 ++++++++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 9 +++++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 10 ++++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 ++++++++++ packages/nuxt/package.json | 2 +- packages/react/CHANGELOG.md | 10 ++++++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 ++++++++++ packages/remix/package.json | 2 +- packages/sdk-node/CHANGELOG.md | 9 +++++++++ packages/sdk-node/package.json | 2 +- packages/shared/CHANGELOG.md | 13 +++++++++++++ packages/shared/package.json | 2 +- packages/tanstack-start/CHANGELOG.md | 10 ++++++++++ packages/tanstack-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 8 ++++++++ packages/types/package.json | 2 +- packages/ui/CHANGELOG.md | 10 ++++++++++ packages/ui/package.json | 2 +- packages/vue/CHANGELOG.md | 10 ++++++++++ packages/vue/package.json | 2 +- 67 files changed, 250 insertions(+), 98 deletions(-) delete mode 100644 .changeset/few-files-switch.md delete mode 100644 .changeset/fifty-cameras-tease.md delete mode 100644 .changeset/friendly-mice-pull.md delete mode 100644 .changeset/itchy-cycles-sell.md delete mode 100644 .changeset/large-bulldogs-tap.md delete mode 100644 .changeset/mighty-clouds-explode.md delete mode 100644 .changeset/orange-radios-nail.md delete mode 100644 .changeset/polite-seals-bake.md delete mode 100644 .changeset/proud-carrots-carry.md delete mode 100644 .changeset/proud-poems-walk.md delete mode 100644 .changeset/red-chicken-visit.md delete mode 100644 .changeset/rude-lions-know.md delete mode 100644 .changeset/shaggy-donuts-cry.md delete mode 100644 .changeset/shy-months-invite.md delete mode 100644 .changeset/silent-bears-worry.md delete mode 100644 .changeset/small-knives-behave.md delete mode 100644 .changeset/ten-hornets-deny.md delete mode 100644 .changeset/ten-jeans-double.md delete mode 100644 .changeset/thin-turkeys-turn.md delete mode 100644 .changeset/unlucky-teachers-joke.md delete mode 100644 .changeset/wet-dryers-pay.md diff --git a/.changeset/few-files-switch.md b/.changeset/few-files-switch.md deleted file mode 100644 index ec380ec43f..0000000000 --- a/.changeset/few-files-switch.md +++ /dev/null @@ -1,3 +0,0 @@ ---- ---- - diff --git a/.changeset/fifty-cameras-tease.md b/.changeset/fifty-cameras-tease.md deleted file mode 100644 index b0c77f8f96..0000000000 --- a/.changeset/fifty-cameras-tease.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/expo-passkeys': patch -'@clerk/clerk-expo': patch ---- -- Replaced import { Buffer } from 'node:buffer' with import { Buffer } from 'buffer'. -- Moved @clerk/expo-passkeys to a devDependency in @clerk/clerk-expo. diff --git a/.changeset/friendly-mice-pull.md b/.changeset/friendly-mice-pull.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/friendly-mice-pull.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/itchy-cycles-sell.md b/.changeset/itchy-cycles-sell.md deleted file mode 100644 index 197c61b142..0000000000 --- a/.changeset/itchy-cycles-sell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Fixes issue where `FormFeedback` was rendering two elements with the same `id` attribute leading to invalid markup. diff --git a/.changeset/large-bulldogs-tap.md b/.changeset/large-bulldogs-tap.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/large-bulldogs-tap.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/mighty-clouds-explode.md b/.changeset/mighty-clouds-explode.md deleted file mode 100644 index 002d0bd6c3..0000000000 --- a/.changeset/mighty-clouds-explode.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -"@clerk/clerk-react": patch -"@clerk/shared": patch -"@clerk/types": patch -"@clerk/vue": patch ---- - -Share hook return types diff --git a/.changeset/orange-radios-nail.md b/.changeset/orange-radios-nail.md deleted file mode 100644 index a49ba48448..0000000000 --- a/.changeset/orange-radios-nail.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- \ No newline at end of file diff --git a/.changeset/polite-seals-bake.md b/.changeset/polite-seals-bake.md deleted file mode 100644 index 7d7212c153..0000000000 --- a/.changeset/polite-seals-bake.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Handle `sign_up_restricted_waitlist` error encountered in an oauth flow diff --git a/.changeset/proud-carrots-carry.md b/.changeset/proud-carrots-carry.md deleted file mode 100644 index b752913364..0000000000 --- a/.changeset/proud-carrots-carry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Exclude `_clerk_session_id` query param from `/waitlist` endpoint \ No newline at end of file diff --git a/.changeset/proud-poems-walk.md b/.changeset/proud-poems-walk.md deleted file mode 100644 index 57167792b6..0000000000 --- a/.changeset/proud-poems-walk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/localizations": patch ---- - -Improve `el-GR` localization. diff --git a/.changeset/red-chicken-visit.md b/.changeset/red-chicken-visit.md deleted file mode 100644 index 4e87d960f1..0000000000 --- a/.changeset/red-chicken-visit.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@clerk/clerk-js": patch -"@clerk/types": patch ---- - -Inject captcha token into every X heartbeats diff --git a/.changeset/rude-lions-know.md b/.changeset/rude-lions-know.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/rude-lions-know.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/shaggy-donuts-cry.md b/.changeset/shaggy-donuts-cry.md deleted file mode 100644 index 555d224ee0..0000000000 --- a/.changeset/shaggy-donuts-cry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/dev-cli': patch ---- - -Fix framework detection for Next.js. `clerk-dev` will now check for `next` as a dependency. diff --git a/.changeset/shy-months-invite.md b/.changeset/shy-months-invite.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/shy-months-invite.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/silent-bears-worry.md b/.changeset/silent-bears-worry.md deleted file mode 100644 index 9af5406880..0000000000 --- a/.changeset/silent-bears-worry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/shared': minor ---- - -Change `useReverification` to handle error in a callback, but still allow an error to be thrown via options. diff --git a/.changeset/small-knives-behave.md b/.changeset/small-knives-behave.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/small-knives-behave.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ten-hornets-deny.md b/.changeset/ten-hornets-deny.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ten-hornets-deny.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/ten-jeans-double.md b/.changeset/ten-jeans-double.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/ten-jeans-double.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/thin-turkeys-turn.md b/.changeset/thin-turkeys-turn.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thin-turkeys-turn.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/unlucky-teachers-joke.md b/.changeset/unlucky-teachers-joke.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/unlucky-teachers-joke.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/.changeset/wet-dryers-pay.md b/.changeset/wet-dryers-pay.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/wet-dryers-pay.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index bf8397549d..c10ded0b9a 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 1.4.14 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 1.4.13 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index eebbf490a2..c51350294e 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "1.4.13", + "version": "1.4.14", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index fedd35b1ce..40715b6a3e 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 1.17.1 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + ## 1.17.0 ### Minor Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 3a704a9cc9..461a9236e8 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "1.17.0", + "version": "1.17.1", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 7884ff3c92..b1716dfc3e 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.3.38 + +### Patch Changes + +- Updated dependencies [[`03482f347741e6ceef2e654de1b101dc59477f90`](https://github.com/clerk/javascript/commit/03482f347741e6ceef2e654de1b101dc59477f90), [`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`152f0b8eeb7687a1fcff75b7395bf8f57ef04591`](https://github.com/clerk/javascript/commit/152f0b8eeb7687a1fcff75b7395bf8f57ef04591), [`aba63de16e677b5896cdf5bc40fa2322480efe7a`](https://github.com/clerk/javascript/commit/aba63de16e677b5896cdf5bc40fa2322480efe7a), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/clerk-js@5.34.4 + - @clerk/clerk-react@5.16.1 + - @clerk/shared@2.16.0 + ## 1.3.37 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index d668972f10..558c06d78d 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "1.3.37", + "version": "1.3.38", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 44eff57ee9..a653103afe 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,22 @@ # Change Log +## 5.34.4 + +### Patch Changes + +- Fixes issue where `FormFeedback` was rendering two elements with the same `id` attribute leading to invalid markup. ([#4552](https://github.com/clerk/javascript/pull/4552)) by [@alexcarpenter](https://github.com/alexcarpenter) + +- Handle `sign_up_restricted_waitlist` error encountered in an oauth flow ([#4603](https://github.com/clerk/javascript/pull/4603)) by [@nikospapcom](https://github.com/nikospapcom) + +- Exclude `_clerk_session_id` query param from `/waitlist` endpoint ([#4594](https://github.com/clerk/javascript/pull/4594)) by [@nikospapcom](https://github.com/nikospapcom) + +- Inject captcha token into every X heartbeats ([#4614](https://github.com/clerk/javascript/pull/4614)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`7510d5cf0ac4d2994849931de8dda75cf605f840`](https://github.com/clerk/javascript/commit/7510d5cf0ac4d2994849931de8dda75cf605f840), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/localizations@3.6.5 + ## 5.34.3 ### Patch Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index aa9ab025b5..03f584b248 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.34.3", + "version": "5.34.4", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/dev-cli/CHANGELOG.md b/packages/dev-cli/CHANGELOG.md index e2f3508d9c..9350d51a17 100644 --- a/packages/dev-cli/CHANGELOG.md +++ b/packages/dev-cli/CHANGELOG.md @@ -1,5 +1,11 @@ # @clerk/dev-cli +## 0.0.9 + +### Patch Changes + +- Fix framework detection for Next.js. `clerk-dev` will now check for `next` as a dependency. ([#4612](https://github.com/clerk/javascript/pull/4612)) by [@BRKalow](https://github.com/BRKalow) + ## 0.0.8 ### Patch Changes diff --git a/packages/dev-cli/package.json b/packages/dev-cli/package.json index b26b670833..7fc9135dc0 100644 --- a/packages/dev-cli/package.json +++ b/packages/dev-cli/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/dev-cli", - "version": "0.0.8", + "version": "0.0.9", "description": "CLI tool designed to simplify the process of iterating on packages within the clerk/javascript repository", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index f8431cab41..7502849f77 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.19.5 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/clerk-react@5.16.1 + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + ## 0.19.4 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 8588fd0ea7..619533d048 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.19.4", + "version": "0.19.5", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index e7f93eacc3..8879848cfe 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,17 @@ # @clerk/expo-passkeys +## 0.0.7 + +### Patch Changes + +- - Replaced import { Buffer } from 'node:buffer' with import { Buffer } from 'buffer'. ([#4601](https://github.com/clerk/javascript/pull/4601)) by [@AlexNti](https://github.com/AlexNti) + + - Moved @clerk/expo-passkeys to a devDependency in @clerk/clerk-expo. + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + ## 0.0.6 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index c508811448..585cf23c5d 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.0.6", + "version": "0.0.7", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 4a9325d875..c57839100f 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,19 @@ # Change Log +## 2.3.7 + +### Patch Changes + +- - Replaced import { Buffer } from 'node:buffer' with import { Buffer } from 'buffer'. ([#4601](https://github.com/clerk/javascript/pull/4601)) by [@AlexNti](https://github.com/AlexNti) + + - Moved @clerk/expo-passkeys to a devDependency in @clerk/clerk-expo. + +- Updated dependencies [[`03482f347741e6ceef2e654de1b101dc59477f90`](https://github.com/clerk/javascript/commit/03482f347741e6ceef2e654de1b101dc59477f90), [`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`152f0b8eeb7687a1fcff75b7395bf8f57ef04591`](https://github.com/clerk/javascript/commit/152f0b8eeb7687a1fcff75b7395bf8f57ef04591), [`aba63de16e677b5896cdf5bc40fa2322480efe7a`](https://github.com/clerk/javascript/commit/aba63de16e677b5896cdf5bc40fa2322480efe7a), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/clerk-js@5.34.4 + - @clerk/clerk-react@5.16.1 + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + ## 2.3.6 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 416c4bcd51..eec3427625 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.3.6", + "version": "2.3.7", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index ddcd4715ff..a8b0f88b09 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.3.16 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 1.3.15 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index b55a009453..9935c93d40 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.3.15", + "version": "1.3.16", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 663048a152..e6cad5726a 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.0.18 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 2.0.17 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index 3a11c37495..a706d22192 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.0.17", + "version": "2.0.18", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 43b29f3a90..1e2ca4b242 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 3.6.5 + +### Patch Changes + +- Improve `el-GR` localization. ([#4593](https://github.com/clerk/javascript/pull/4593)) by [@dikaioai](https://github.com/dikaioai) + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745)]: + - @clerk/types@4.34.1 + ## 3.6.4 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index b23db9e261..87b8a845a6 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.6.4", + "version": "3.6.5", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index ed8e4f62a2..31c68a6076 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 6.4.1 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/clerk-react@5.16.1 + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 6.4.0 ### Minor Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 9cc237ea0d..af9a68aa71 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.4.0", + "version": "6.4.1", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index c585bfbdd6..fa297308fc 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 0.0.2 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/vue@0.0.6 + - @clerk/backend@1.17.1 + ## 0.0.1 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index b0c13f93b0..b1f2b2d017 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "0.0.1", + "version": "0.0.2", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 2b47593389..cf1d086b83 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 5.16.1 + +### Patch Changes + +- Share hook return types ([#4583](https://github.com/clerk/javascript/pull/4583)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + ## 5.16.0 ### Minor Changes diff --git a/packages/react/package.json b/packages/react/package.json index 6aac243dfd..aada4ea2e9 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.16.0", + "version": "5.16.1", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 3b43a2f64c..ac2c0964f0 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.2.54 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/clerk-react@5.16.1 + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 4.2.53 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index b7f992bd9f..826d8c6b88 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.2.53", + "version": "4.2.54", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md index fd2dcd6e88..41e496605f 100644 --- a/packages/sdk-node/CHANGELOG.md +++ b/packages/sdk-node/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 5.0.67 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 5.0.66 ### Patch Changes diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json index 3cd92e23ca..eaa80b6e01 100644 --- a/packages/sdk-node/package.json +++ b/packages/sdk-node/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-sdk-node", - "version": "5.0.66", + "version": "5.0.67", "description": "Clerk server SDK for usage with node", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index a3957bed7d..a0f606f731 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## 2.16.0 + +### Minor Changes + +- Change `useReverification` to handle error in a callback, but still allow an error to be thrown via options. ([#4564](https://github.com/clerk/javascript/pull/4564)) by [@panteliselef](https://github.com/panteliselef) + +### Patch Changes + +- Share hook return types ([#4583](https://github.com/clerk/javascript/pull/4583)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745)]: + - @clerk/types@4.34.1 + ## 2.15.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index 5d54b27597..17f39d613a 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "2.15.0", + "version": "2.16.0", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-start/CHANGELOG.md b/packages/tanstack-start/CHANGELOG.md index 73734e309c..cc31b745bd 100644 --- a/packages/tanstack-start/CHANGELOG.md +++ b/packages/tanstack-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-start +## 0.5.1 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/clerk-react@5.16.1 + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 0.5.0 ### Minor Changes diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index 72315bfe74..a464598d5d 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-start", - "version": "0.5.0", + "version": "0.5.1", "description": "Clerk SDK for TanStack Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 20927402a6..590318dbf5 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.3.28 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/backend@1.17.1 + ## 1.3.27 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index dab08e8d5c..696d68f8c1 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.3.27", + "version": "1.3.28", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index ac05bddf4f..a4a8f36470 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.1.46 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745)]: + - @clerk/types@4.34.1 + ## 2.1.45 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index b5866bf663..1766826130 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.1.45", + "version": "2.1.46", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 8b1263e5ed..a81eb43687 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 4.34.1 + +### Patch Changes + +- Share hook return types ([#4583](https://github.com/clerk/javascript/pull/4583)) by [@wobsoriano](https://github.com/wobsoriano) + +- Inject captcha token into every X heartbeats ([#4614](https://github.com/clerk/javascript/pull/4614)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + ## 4.34.0 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index 26b9f99cc9..758f46af31 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.34.0", + "version": "4.34.1", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 74edf051ca..0b8d1b07cb 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/ui +## 0.1.22 + +### Patch Changes + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`7510d5cf0ac4d2994849931de8dda75cf605f840`](https://github.com/clerk/javascript/commit/7510d5cf0ac4d2994849931de8dda75cf605f840), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + - @clerk/localizations@3.6.5 + - @clerk/elements@0.19.5 + ## 0.1.21 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index 75ca49acda..bc37baf7ea 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/ui", - "version": "0.1.21", + "version": "0.1.22", "repository": { "type": "git", "url": "git+https://github.com/clerk/javascript.git", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 4284e2e262..c31a183597 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/vue +## 0.0.6 + +### Patch Changes + +- Share hook return types ([#4583](https://github.com/clerk/javascript/pull/4583)) by [@wobsoriano](https://github.com/wobsoriano) + +- Updated dependencies [[`e47eb5882a7fd4a8dee25933c6644790d6ea3407`](https://github.com/clerk/javascript/commit/e47eb5882a7fd4a8dee25933c6644790d6ea3407), [`273d16cb0665d4d960838cb294dc356f41814745`](https://github.com/clerk/javascript/commit/273d16cb0665d4d960838cb294dc356f41814745), [`6b0961765e1f3d09679be4b163fa13ac7dd97191`](https://github.com/clerk/javascript/commit/6b0961765e1f3d09679be4b163fa13ac7dd97191)]: + - @clerk/shared@2.16.0 + - @clerk/types@4.34.1 + ## 0.0.5 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index f528bb34ce..f5816f8f0e 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "0.0.5", + "version": "0.0.6", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From b9a93fd86c2a0285d8e1bb9e9ffac2c979aab947 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Thu, 21 Nov 2024 15:59:13 +0200 Subject: [PATCH 02/19] fix(clerk-js): Fix tokenCache.test.ts (#4623) --- .changeset/long-rabbits-ring.md | 5 +++++ .../clerk-js/src/core/auth/AuthCookieService.ts | 17 ++++++++++++++++- packages/clerk-js/src/core/clerk.ts | 2 +- 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 .changeset/long-rabbits-ring.md diff --git a/.changeset/long-rabbits-ring.md b/.changeset/long-rabbits-ring.md new file mode 100644 index 0000000000..7df6cfed75 --- /dev/null +++ b/.changeset/long-rabbits-ring.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Collect captcha token on load diff --git a/packages/clerk-js/src/core/auth/AuthCookieService.ts b/packages/clerk-js/src/core/auth/AuthCookieService.ts index 2887166180..514f2bd9a6 100644 --- a/packages/clerk-js/src/core/auth/AuthCookieService.ts +++ b/packages/clerk-js/src/core/auth/AuthCookieService.ts @@ -1,10 +1,12 @@ import { setDevBrowserJWTInURL } from '@clerk/shared/devBrowser'; import { is4xxError, isClerkAPIResponseError, isNetworkError } from '@clerk/shared/error'; -import type { Clerk, EnvironmentResource } from '@clerk/types'; +import type { EnvironmentResource } from '@clerk/types'; import { clerkCoreErrorTokenRefreshFailed, clerkMissingDevBrowserJwt } from '../errors'; import { eventBus, events } from '../events'; import type { FapiClient } from '../fapiClient'; +import type { Clerk } from '../resources/internal'; +import { SessionTokenCache } from '../tokenCache'; import type { ClientUatCookieHandler } from './cookies/clientUat'; import { createClientUatCookie } from './cookies/clientUat'; import type { SessionCookieHandler } from './cookies/session'; @@ -103,6 +105,19 @@ export class AuthCookieService { return setDevBrowserJWTInURL(url, devBrowserJwt); } + /** + * Will refresh the session token immediately once + * if the captcha heartbeat flag is enabled. + * We want to do this to ensure that we collect at least one token + * even for short-lived sessions. + */ + public forceRefreshSessionToken() { + if (this.clerk.__unstable__environment?.displayConfig.captchaHeartbeat) { + SessionTokenCache.clear(); + void this.refreshSessionToken(); + } + } + private startPollingForToken() { if (!this.poller) { this.poller = new SessionCookiePoller(); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index db377ee7cc..536c5ab7bf 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1828,8 +1828,8 @@ export class Clerk implements ClerkInterface { } } + this.#authService?.forceRefreshSessionToken(); this.#clearClerkQueryParams(); - this.#handleImpersonationFab(); return true; }; From a654446b29bbe23b68f6efa1ba4467fb1b99932b Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Thu, 21 Nov 2024 09:17:46 -0500 Subject: [PATCH 03/19] ci(repo): Version packages (#4624) Co-authored-by: github-actions[bot] --- .changeset/long-rabbits-ring.md | 5 ----- packages/chrome-extension/CHANGELOG.md | 7 +++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 6 ++++++ packages/clerk-js/package.json | 2 +- packages/expo/CHANGELOG.md | 7 +++++++ packages/expo/package.json | 2 +- 7 files changed, 23 insertions(+), 8 deletions(-) delete mode 100644 .changeset/long-rabbits-ring.md diff --git a/.changeset/long-rabbits-ring.md b/.changeset/long-rabbits-ring.md deleted file mode 100644 index 7df6cfed75..0000000000 --- a/.changeset/long-rabbits-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Collect captcha token on load diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index b1716dfc3e..35fbf4fdcf 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 1.3.39 + +### Patch Changes + +- Updated dependencies [[`b9a93fd86c2a0285d8e1bb9e9ffac2c979aab947`](https://github.com/clerk/javascript/commit/b9a93fd86c2a0285d8e1bb9e9ffac2c979aab947)]: + - @clerk/clerk-js@5.34.5 + ## 1.3.38 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 558c06d78d..d48ef0d6a0 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "1.3.38", + "version": "1.3.39", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index a653103afe..3088147ec7 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,11 @@ # Change Log +## 5.34.5 + +### Patch Changes + +- Collect captcha token on load ([#4623](https://github.com/clerk/javascript/pull/4623)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + ## 5.34.4 ### Patch Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 03f584b248..55cb4dc869 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.34.4", + "version": "5.34.5", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index c57839100f..3fb210a586 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.3.8 + +### Patch Changes + +- Updated dependencies [[`b9a93fd86c2a0285d8e1bb9e9ffac2c979aab947`](https://github.com/clerk/javascript/commit/b9a93fd86c2a0285d8e1bb9e9ffac2c979aab947)]: + - @clerk/clerk-js@5.34.5 + ## 2.3.7 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index eec3427625..97c20c92bc 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.3.7", + "version": "2.3.8", "description": "Clerk React Native/Expo library", "keywords": [ "react", From 3c21cd6ff80ac4e4a537739f61c19caa207fb130 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Thu, 21 Nov 2024 17:22:57 +0200 Subject: [PATCH 04/19] Revert "fix(clerk-js): Fix tokenCache.test.ts (#4623)" This reverts commit b9a93fd86c2a0285d8e1bb9e9ffac2c979aab947. --- .../clerk-js/src/core/auth/AuthCookieService.ts | 17 +---------------- packages/clerk-js/src/core/clerk.ts | 2 +- 2 files changed, 2 insertions(+), 17 deletions(-) diff --git a/packages/clerk-js/src/core/auth/AuthCookieService.ts b/packages/clerk-js/src/core/auth/AuthCookieService.ts index 514f2bd9a6..2887166180 100644 --- a/packages/clerk-js/src/core/auth/AuthCookieService.ts +++ b/packages/clerk-js/src/core/auth/AuthCookieService.ts @@ -1,12 +1,10 @@ import { setDevBrowserJWTInURL } from '@clerk/shared/devBrowser'; import { is4xxError, isClerkAPIResponseError, isNetworkError } from '@clerk/shared/error'; -import type { EnvironmentResource } from '@clerk/types'; +import type { Clerk, EnvironmentResource } from '@clerk/types'; import { clerkCoreErrorTokenRefreshFailed, clerkMissingDevBrowserJwt } from '../errors'; import { eventBus, events } from '../events'; import type { FapiClient } from '../fapiClient'; -import type { Clerk } from '../resources/internal'; -import { SessionTokenCache } from '../tokenCache'; import type { ClientUatCookieHandler } from './cookies/clientUat'; import { createClientUatCookie } from './cookies/clientUat'; import type { SessionCookieHandler } from './cookies/session'; @@ -105,19 +103,6 @@ export class AuthCookieService { return setDevBrowserJWTInURL(url, devBrowserJwt); } - /** - * Will refresh the session token immediately once - * if the captcha heartbeat flag is enabled. - * We want to do this to ensure that we collect at least one token - * even for short-lived sessions. - */ - public forceRefreshSessionToken() { - if (this.clerk.__unstable__environment?.displayConfig.captchaHeartbeat) { - SessionTokenCache.clear(); - void this.refreshSessionToken(); - } - } - private startPollingForToken() { if (!this.poller) { this.poller = new SessionCookiePoller(); diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 536c5ab7bf..db377ee7cc 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1828,8 +1828,8 @@ export class Clerk implements ClerkInterface { } } - this.#authService?.forceRefreshSessionToken(); this.#clearClerkQueryParams(); + this.#handleImpersonationFab(); return true; }; From c70994b5b6f92a6550dfe37547f01bbfa810c223 Mon Sep 17 00:00:00 2001 From: panteliselef Date: Thu, 21 Nov 2024 13:14:22 -0500 Subject: [PATCH 05/19] feat(clerk-js): Introduce internal Accountless UI prompt in sandbox (#4625) --- .changeset/clever-bats-own.md | 5 + .changeset/empty-fans-attack.md | 5 + packages/clerk-js/sandbox/app.js | 3 + packages/clerk-js/sandbox/template.html | 8 + packages/clerk-js/src/core/clerk.ts | 11 ++ packages/clerk-js/src/ui/Components.tsx | 7 + .../ui/components/AccountlessPrompt/index.tsx | 176 ++++++++++++++++++ .../clerk-js/src/ui/lazyModules/components.ts | 4 + packages/types/src/clerk.ts | 2 + 9 files changed, 221 insertions(+) create mode 100644 .changeset/clever-bats-own.md create mode 100644 .changeset/empty-fans-attack.md create mode 100644 packages/clerk-js/src/ui/components/AccountlessPrompt/index.tsx diff --git a/.changeset/clever-bats-own.md b/.changeset/clever-bats-own.md new file mode 100644 index 0000000000..bd2a121438 --- /dev/null +++ b/.changeset/clever-bats-own.md @@ -0,0 +1,5 @@ +--- +'@clerk/types': patch +--- + +Add `__internal_claimAccountlessKeysUrl` to `ClerkOptions`. diff --git a/.changeset/empty-fans-attack.md b/.changeset/empty-fans-attack.md new file mode 100644 index 0000000000..e3b32213db --- /dev/null +++ b/.changeset/empty-fans-attack.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Add new internal UI component for accountless. diff --git a/packages/clerk-js/sandbox/app.js b/packages/clerk-js/sandbox/app.js index 6f7debdec9..a2602ca4e3 100644 --- a/packages/clerk-js/sandbox/app.js +++ b/packages/clerk-js/sandbox/app.js @@ -153,6 +153,9 @@ const routes = { '/waitlist': () => { Clerk.mountWaitlist(app, componentControls.waitlist.getProps() ?? {}); }, + '/accountless': () => { + Clerk.__unstable__updateProps({ options: { __internal_claimAccountlessKeysUrl: '/test-url' } }); + }, }; /** diff --git a/packages/clerk-js/sandbox/template.html b/packages/clerk-js/sandbox/template.html index 3d1c1eea4c..fe78ed6bff 100644 --- a/packages/clerk-js/sandbox/template.html +++ b/packages/clerk-js/sandbox/template.html @@ -236,6 +236,14 @@ >Waitlist +
  • + + Accountless + +
  • diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index db377ee7cc..78b322a258 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -1831,6 +1831,7 @@ export class Clerk implements ClerkInterface { this.#clearClerkQueryParams(); this.#handleImpersonationFab(); + this.#handleAccountlessPrompt(); return true; }; @@ -1960,6 +1961,16 @@ export class Clerk implements ClerkInterface { }); }; + #handleAccountlessPrompt = () => { + void this.#componentControls?.ensureMounted().then(controls => { + if (this.#options.__internal_claimAccountlessKeysUrl) { + controls.updateProps({ + options: { __internal_claimAccountlessKeysUrl: this.#options.__internal_claimAccountlessKeysUrl }, + }); + } + }); + }; + #buildUrl = ( key: 'signInUrl' | 'signUpUrl', options: RedirectOptions, diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx index 813800f4aa..f12eac988c 100644 --- a/packages/clerk-js/src/ui/Components.tsx +++ b/packages/clerk-js/src/ui/Components.tsx @@ -23,6 +23,7 @@ import type { AppearanceCascade } from './customizables/parseAppearance'; import { useClerkModalStateParams } from './hooks/useClerkModalStateParams'; import type { ClerkComponentName } from './lazyModules/components'; import { + AccountlessPrompt, BlankCaptchaModal, CreateOrganizationModal, ImpersonationFab, @@ -516,6 +517,12 @@ const Components = (props: ComponentsProps) => { )} + {state.options?.__internal_claimAccountlessKeysUrl && ( + + + + )} + {state.organizationSwitcherPrefetch && } diff --git a/packages/clerk-js/src/ui/components/AccountlessPrompt/index.tsx b/packages/clerk-js/src/ui/components/AccountlessPrompt/index.tsx new file mode 100644 index 0000000000..413030fb60 --- /dev/null +++ b/packages/clerk-js/src/ui/components/AccountlessPrompt/index.tsx @@ -0,0 +1,176 @@ +import type { PointerEventHandler } from 'react'; +import { useCallback, useEffect, useRef } from 'react'; + +import type { LocalizationKey } from '../../customizables'; +import { Col, descriptors, Flex, Link, Text } from '../../customizables'; +import { Portal } from '../../elements/Portal'; +import { InternalThemeProvider, mqu } from '../../styledSystem'; + +type AccountlessPromptProps = { + url?: string; +}; + +type FabContentProps = { title?: LocalizationKey | string; signOutText: LocalizationKey | string; url: string }; + +const FabContent = ({ title, signOutText, url }: FabContentProps) => { + return ( + ({ + width: '100%', + paddingLeft: t.sizes.$4, + paddingRight: t.sizes.$6, + whiteSpace: 'nowrap', + })} + > + + ({ + alignSelf: 'flex-start', + color: t.colors.$primary500, + ':hover': { + cursor: 'pointer', + }, + })} + localizationKey={signOutText} + onClick={ + () => (window.location.href = url) + // clerk-js has been loaded at this point so we can safely access session + // handleSignOutSessionClicked(session!) + } + /> + + ); +}; + +export const _AccountlessPrompt = (props: AccountlessPromptProps) => { + // const { parsedInternalTheme } = useAppearance(); + const containerRef = useRef(null); + + //essentials for calcs + // const eyeWidth = parsedInternalTheme.sizes.$16; + // const eyeHeight = eyeWidth; + const topProperty = '--cl-impersonation-fab-top'; + const rightProperty = '--cl-impersonation-fab-right'; + const defaultTop = 109; + const defaultRight = 23; + + const handleResize = () => { + const current = containerRef.current; + if (!current) { + return; + } + + const offsetRight = window.innerWidth - current.offsetLeft - current.offsetWidth; + const offsetBottom = window.innerHeight - current.offsetTop - current.offsetHeight; + + const outsideViewport = [current.offsetLeft, offsetRight, current.offsetTop, offsetBottom].some(o => o < 0); + + if (outsideViewport) { + document.documentElement.style.setProperty(rightProperty, `${defaultRight}px`); + document.documentElement.style.setProperty(topProperty, `${defaultTop}px`); + } + }; + + const onPointerDown: PointerEventHandler = () => { + window.addEventListener('pointermove', onPointerMove); + window.addEventListener( + 'pointerup', + () => { + window.removeEventListener('pointermove', onPointerMove); + handleResize(); + }, + { once: true }, + ); + }; + + const onPointerMove = useCallback((e: PointerEvent) => { + e.stopPropagation(); + e.preventDefault(); + const current = containerRef.current; + if (!current) { + return; + } + const rightOffestBasedOnViewportAndContent = `${ + window.innerWidth - current.offsetLeft - current.offsetWidth - e.movementX + }px`; + document.documentElement.style.setProperty(rightProperty, rightOffestBasedOnViewportAndContent); + document.documentElement.style.setProperty(topProperty, `${current.offsetTop - -e.movementY}px`); + }, []); + + const repositionFabOnResize = () => { + window.addEventListener('resize', handleResize); + return () => { + window.removeEventListener('resize', handleResize); + }; + }; + + useEffect(repositionFabOnResize, []); + + if (!props.url) { + return null; + } + + return ( + + ({ + touchAction: 'none', //for drag to work on mobile consistently + position: 'fixed', + overflow: 'hidden', + top: `var(${topProperty}, ${defaultTop}px)`, + right: `var(${rightProperty}, ${defaultRight}px)`, + padding: `10px`, + zIndex: t.zIndices.$fab, + boxShadow: t.shadows.$fabShadow, + borderRadius: t.radii.$halfHeight, //to match the circular eye perfectly + backgroundColor: t.colors.$white, + fontFamily: t.fonts.$main, + ':hover': { + cursor: 'grab', + }, + ':hover #cl-impersonationText': { + transition: `max-width ${t.transitionDuration.$slowest} ease, opacity 0ms ease ${t.transitionDuration.$slowest}`, + maxWidth: `min(calc(50vw - 2 * ${defaultRight}px), ${15}ch)`, + [mqu.md]: { + maxWidth: `min(calc(100vw - 2 * ${defaultRight}px), ${15}ch)`, + }, + opacity: 1, + }, + })} + > + 🔓Accountless Mode + ({ + transition: `max-width ${t.transitionDuration.$slowest} ease, opacity ${t.transitionDuration.$fast} ease`, + maxWidth: '0px', + opacity: 1, + })} + > + + + + + ); +}; + +export const AccountlessPrompt = (props: AccountlessPromptProps) => ( + + <_AccountlessPrompt {...props} /> + +); diff --git a/packages/clerk-js/src/ui/lazyModules/components.ts b/packages/clerk-js/src/ui/lazyModules/components.ts index bbcd5ee1a4..8aae06059d 100644 --- a/packages/clerk-js/src/ui/lazyModules/components.ts +++ b/packages/clerk-js/src/ui/lazyModules/components.ts @@ -16,6 +16,7 @@ const componentImportPaths = { BlankCaptchaModal: () => import(/* webpackChunkName: "blankcaptcha" */ './../components/BlankCaptchaModal'), UserVerification: () => import(/* webpackChunkName: "userverification" */ './../components/UserVerification'), Waitlist: () => import(/* webpackChunkName: "waitlist" */ './../components/Waitlist'), + AccountlessPrompt: () => import(/* webpackChunkName: "accountlessPrompt" */ './../components/AccountlessPrompt'), } as const; export const SignIn = lazy(() => componentImportPaths.SignIn().then(module => ({ default: module.SignIn }))); @@ -83,6 +84,9 @@ export const BlankCaptchaModal = lazy(() => export const ImpersonationFab = lazy(() => componentImportPaths.ImpersonationFab().then(module => ({ default: module.ImpersonationFab })), ); +export const AccountlessPrompt = lazy(() => + componentImportPaths.AccountlessPrompt().then(module => ({ default: module.AccountlessPrompt })), +); export const preloadComponent = async (component: unknown) => { return componentImportPaths[component as keyof typeof componentImportPaths]?.(); diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 48d89b411d..3450c49b22 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -745,6 +745,8 @@ export type ClerkOptions = ClerkOptionsNavigation & Record >; + __internal_claimAccountlessKeysUrl?: string; + /** * [EXPERIMENTAL] Provide the underlying host router, required for the new experimental UI components. */ From 727c218f8f176bcde73995dafb503a594e16669b Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Fri, 22 Nov 2024 12:02:18 +0200 Subject: [PATCH 06/19] fix(clerk-js): Catch and ignore captcha errors during heartbeat (#4629) --- .changeset/cyan-ducks-accept.md | 5 +++++ packages/clerk-js/src/core/fraudProtection.ts | 10 ++++++++++ 2 files changed, 15 insertions(+) create mode 100644 .changeset/cyan-ducks-accept.md diff --git a/.changeset/cyan-ducks-accept.md b/.changeset/cyan-ducks-accept.md new file mode 100644 index 0000000000..7bea2c6611 --- /dev/null +++ b/.changeset/cyan-ducks-accept.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Catch and ignore any captcha errors during heartbeat diff --git a/packages/clerk-js/src/core/fraudProtection.ts b/packages/clerk-js/src/core/fraudProtection.ts index 5ad24208c3..3a75ab2dd5 100644 --- a/packages/clerk-js/src/core/fraudProtection.ts +++ b/packages/clerk-js/src/core/fraudProtection.ts @@ -48,6 +48,11 @@ class FraudProtectionService { widgetType: 'invisible', scriptUrl: captchaURL, captchaProvider: 'turnstile', + }).catch(e => { + if (e.captchaError) { + return { captchaError: e.captchaError }; + } + return undefined; }); } @@ -77,6 +82,11 @@ class FraudProtectionService { modalContainerQuerySelector: '#cl-modal-captcha-container', openModal: () => clerk.__internal_openBlankCaptchaModal(), closeModal: () => clerk.__internal_closeBlankCaptchaModal(), + }).catch(e => { + if (e.captchaError) { + return { captchaError: e.captchaError }; + } + return undefined; }); } From 0c477281ba1034a485b1d053472990e70ac3aa78 Mon Sep 17 00:00:00 2001 From: issuedat <165281975+issuedat@users.noreply.github.com> Date: Fri, 22 Nov 2024 11:48:12 +0100 Subject: [PATCH 07/19] fix(clerk-js): Enable captcha for development instances (#4620) --- .changeset/early-games-taste.md | 5 +++++ packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts | 6 +----- 2 files changed, 6 insertions(+), 5 deletions(-) create mode 100644 .changeset/early-games-taste.md diff --git a/.changeset/early-games-taste.md b/.changeset/early-games-taste.md new file mode 100644 index 0000000000..6130b6a886 --- /dev/null +++ b/.changeset/early-games-taste.md @@ -0,0 +1,5 @@ +--- +'@clerk/clerk-js': patch +--- + +Enable captcha for development instances diff --git a/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts b/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts index 2cf78c84db..caa36e5fff 100644 --- a/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts +++ b/packages/clerk-js/src/utils/captcha/retrieveCaptchaInfo.ts @@ -11,11 +11,7 @@ export const retrieveCaptchaInfo = (clerk: Clerk) => { captchaWidgetType: _environment ? _environment.displayConfig.captchaWidgetType : null, captchaProvider, captchaPublicKeyInvisible: _environment ? _environment.displayConfig.captchaPublicKeyInvisible : null, - canUseCaptcha: _environment - ? _environment.userSettings.signUp.captcha_enabled && - clerk.isStandardBrowser && - clerk.instanceType === 'production' - : null, + canUseCaptcha: _environment ? _environment.userSettings.signUp.captcha_enabled && clerk.isStandardBrowser : null, captchaURL: fapiClient .buildUrl({ path: 'cloudflare/turnstile/v0/api.js', From 3f890cf6f219f5bb3e6f888b3eb25c9448a01265 Mon Sep 17 00:00:00 2001 From: Jacek Radko Date: Fri, 22 Nov 2024 07:33:36 -0600 Subject: [PATCH 08/19] fix(repo): Use patched yalc with support for catalog: (#4619) --- .changeset/thick-peas-perform.md | 2 + package.json | 6 ++- packages/astro/package.json | 2 +- packages/backend/package.json | 2 +- packages/chrome-extension/package.json | 2 +- packages/expo-passkeys/package.json | 2 +- packages/expo/package.json | 2 +- packages/express/package.json | 2 +- packages/fastify/package.json | 2 +- packages/nextjs/package.json | 2 +- packages/nuxt/package.json | 2 +- packages/react/package.json | 2 +- packages/remix/package.json | 2 +- packages/sdk-node/package.json | 2 +- packages/shared/package.json | 2 +- packages/tanstack-start/package.json | 2 +- packages/vue/package.json | 2 +- patches/yalc@1.0.0-pre.53.patch | 69 ++++++++++++++++++++++++ playground/app-router/package.json | 6 +-- playground/chrome-extension/package.json | 2 +- playground/expo/package.json | 2 +- playground/express/package.json | 2 +- playground/nextjs/package.json | 4 +- playground/remix-cf-pages/package.json | 2 +- playground/remix-cf-worker/package.json | 2 +- playground/remix-node/package.json | 2 +- playground/vite-react-ts/package.json | 4 +- pnpm-lock.yaml | 54 +++++++++++++++++++ 28 files changed, 158 insertions(+), 29 deletions(-) create mode 100644 .changeset/thick-peas-perform.md create mode 100644 patches/yalc@1.0.0-pre.53.patch diff --git a/.changeset/thick-peas-perform.md b/.changeset/thick-peas-perform.md new file mode 100644 index 0000000000..a845151cc8 --- /dev/null +++ b/.changeset/thick-peas-perform.md @@ -0,0 +1,2 @@ +--- +--- diff --git a/package.json b/package.json index e503f50bb5..5512cd1718 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "version-packages": "changeset version && pnpm install --lockfile-only --engine-strict=false", "version-packages:canary": "./scripts/canary.mjs", "version-packages:snapshot": "./scripts/snapshot.mjs", - "yalc:all": "for d in packages/*/; do echo $d; cd $d; pnpm dlx yalc push --replace --sig; cd '../../'; done" + "yalc:all": "for d in packages/*/; do echo $d; cd $d; pnpm yalc push --replace --sig; cd '../../'; done" }, "devDependencies": { "@actions/core": "^1.10.1", @@ -106,6 +106,7 @@ "typescript": "catalog:repo", "verdaccio": "^5.26.3", "vitest": "2.1.4", + "yalc": "1.0.0-pre.53", "zx": "^7.2.3" }, "packageManager": "pnpm@9.13.0+sha512.beb9e2a803db336c10c9af682b58ad7181ca0fbd0d4119f2b33d5f2582e96d6c0d93c85b23869295b765170fbdaa92890c0da6ada457415039769edf3c959efe", @@ -117,6 +118,9 @@ "overrides": { "jest": "29.7.0", "jest-snapshot-prettier": "npm:prettier@^3" + }, + "patchedDependencies": { + "yalc@1.0.0-pre.53": "patches/yalc@1.0.0-pre.53.patch" } } } diff --git a/packages/astro/package.json b/packages/astro/package.json index c51350294e..fafbfe0271 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -78,7 +78,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack . --ignore-rules no-resolution cjs-resolves-to-esm internal-resolution-error", "lint:publint": "pnpm copy:components && publint", - "publish:local": "pnpm dlx yalc push --replace --sig" + "publish:local": "pnpm yalc push --replace --sig" }, "dependencies": { "@clerk/backend": "workspace:*", diff --git a/packages/backend/package.json b/packages/backend/package.json index 461a9236e8..54bcb53790 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -79,7 +79,7 @@ "build:declarations": "tsc -p tsconfig.declarations.json", "dev": "tsup --watch", "dev:publish": "pnpm dev -- --env.publish", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "build:lib": "tsup --env.NODE_ENV production", "build:runtime": "cpy 'src/runtime/**/*.{mjs,js,cjs}' dist/runtime", "clean": "rimraf ./dist", diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index d48ef0d6a0..338bed1fa8 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -40,7 +40,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack .", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "test": "jest", "test:cache:clear": "jest --clearCache --useStderr", "test:ci": "jest --maxWorkers=70%", diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index 585cf23c5d..cb2bce18ed 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -28,7 +28,7 @@ "lint": "eslint src/", "open:android": "open -a \"Android Studio\" example/android", "open:ios": "xed example/ios", - "publish:local": "pnpm dlx yalc push --replace --sig" + "publish:local": "pnpm yalc push --replace --sig" }, "dependencies": { "@clerk/shared": "workspace:*", diff --git a/packages/expo/package.json b/packages/expo/package.json index 97c20c92bc..f23dd8e918 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -57,7 +57,7 @@ "dev": "tsup --watch", "dev:publish": "pnpm dev -- --env.publish", "lint": "eslint src/", - "publish:local": "pnpm dlx yalc push --replace --sig" + "publish:local": "pnpm yalc push --replace --sig" }, "dependencies": { "@clerk/clerk-js": "workspace:*", diff --git a/packages/express/package.json b/packages/express/package.json index 9935c93d40..04bb617685 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -49,7 +49,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack .", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "test": "jest", "test:cache:clear": "jest --clearCache --useStderr", "test:ci": "jest --maxWorkers=70%" diff --git a/packages/fastify/package.json b/packages/fastify/package.json index a706d22192..e1f5f83047 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -35,7 +35,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack .", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "test": "jest", "test:cache:clear": "jest --clearCache --useStderr" }, diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index af9a68aa71..2dbd33051c 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -61,7 +61,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack . --ignore-rules no-resolution unexpected-module-syntax", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "test": "vitest" }, "dependencies": { diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index b1f2b2d017..f5e9dacb47 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -46,7 +46,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack . --ignore-rules no-resolution cjs-resolves-to-esm", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig" + "publish:local": "pnpm yalc push --replace --sig" }, "dependencies": { "@clerk/backend": "workspace:*", diff --git a/packages/react/package.json b/packages/react/package.json index aada4ea2e9..dcd9fec792 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -70,7 +70,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack .", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "test": "jest", "test:cache:clear": "jest --clearCache --useStderr", "test:ci": "jest --maxWorkers=70%" diff --git a/packages/remix/package.json b/packages/remix/package.json index 826d8c6b88..a7b58820aa 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -70,7 +70,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack .", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig" + "publish:local": "pnpm yalc push --replace --sig" }, "dependencies": { "@clerk/backend": "workspace:*", diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json index eaa80b6e01..ba1d105c72 100644 --- a/packages/sdk-node/package.json +++ b/packages/sdk-node/package.json @@ -43,7 +43,7 @@ "build": "pnpm clean && tsup", "dev": "tsup --watch", "dev:publish": "pnpm dev -- --env.publish", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "clean": "rimraf ./dist", "lint": "eslint src/", "lint:publint": "publint", diff --git a/packages/shared/package.json b/packages/shared/package.json index 17f39d613a..db7ea5f16d 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -124,7 +124,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack .", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "test": "jest", "test:cache:clear": "jest --clearCache --useStderr", "test:ci": "jest --maxWorkers=70%", diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index a464598d5d..b7ec3bb709 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -51,7 +51,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack . --ignore-rules cjs-resolves-to-esm", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig" + "publish:local": "pnpm yalc push --replace --sig" }, "dependencies": { "@clerk/backend": "workspace:*", diff --git a/packages/vue/package.json b/packages/vue/package.json index f5816f8f0e..126d24f4cc 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -46,7 +46,7 @@ "lint": "eslint src/", "lint:attw": "attw --pack . --ignore-rules no-resolution cjs-resolves-to-esm", "lint:publint": "publint", - "publish:local": "pnpm dlx yalc push --replace --sig", + "publish:local": "pnpm yalc push --replace --sig", "test": "vitest", "test:ci": "vitest --maxWorkers=70%" }, diff --git a/patches/yalc@1.0.0-pre.53.patch b/patches/yalc@1.0.0-pre.53.patch new file mode 100644 index 0000000000..63221b43a9 --- /dev/null +++ b/patches/yalc@1.0.0-pre.53.patch @@ -0,0 +1,69 @@ +diff --git a/package.json b/package.json +index 930c1ca9954777dd1492a9e2373029d4644804cc..01e709cffb2a100bc6b0089edf91527d35b1b7fd 100644 +--- a/package.json ++++ b/package.json +@@ -37,6 +37,7 @@ + "ignore": "^5.0.4", + "ini": "^2.0.0", + "npm-packlist": "^2.1.5", ++ "yaml": "2.6.1", + "yargs": "^16.1.1" + }, + "devDependencies": { +diff --git a/src/copy.js b/src/copy.js +index 3a6dca7b7a6ffde2527e7866f923c56f7d7061b8..19ac807a17779219800a0230b0620a5dfd4c641d 100644 +--- a/src/copy.js ++++ b/src/copy.js +@@ -56,6 +56,7 @@ var fs_extra_1 = __importDefault(require("fs-extra")); + var ignore_1 = __importDefault(require("ignore")); + var npm_packlist_1 = __importDefault(require("npm-packlist")); + var path_1 = require("path"); ++var yaml_1 = require("yaml"); + var _1 = require("."); + var _2 = require("."); + var shortSignatureLength = 8; +@@ -120,6 +121,19 @@ var resolveWorkspaceDepVersion = function (version, pkgName, workingDir) { + return '*'; + } + }; ++var resolveCatalogDepVersion = function (subCatalog, pkgName, workingDir) { ++ var _a; ++ var workspaceFilePath = path_1.join(workingDir, '../../pnpm-workspace.yaml'); ++ var workspaceContent = fs_extra_1.default.readFileSync(workspaceFilePath, 'utf8'); ++ var workspaceYaml = yaml_1.parse(workspaceContent); ++ if (!workspaceYaml) { ++ console.warn('Could not find pnpm-workspace.yaml in the working directory.'); ++ } ++ var packages = subCatalog && subCatalog.length > 0 ++ ? ((_a = workspaceYaml === null || workspaceYaml === void 0 ? void 0 : workspaceYaml.catalogs) === null || _a === void 0 ? void 0 : _a[subCatalog]) || [] ++ : (workspaceYaml === null || workspaceYaml === void 0 ? void 0 : workspaceYaml.catalog) || []; ++ return packages[pkgName] || '*'; ++}; + var resolveWorkspaces = function (pkg, workingDir) { + var resolveDeps = function (deps) { + return deps +@@ -130,6 +144,12 @@ var resolveWorkspaces = function (pkg, workingDir) { + console.log("Resolving workspace package " + depPkgName + " version ==> " + resolved); + return resolved; + } ++ if (val.startsWith('catalog:')) { ++ var subCatalog = val.split(':')[1]; ++ var resolved = resolveCatalogDepVersion(subCatalog, depPkgName, workingDir); ++ console.log("Resolving catalog package " + depPkgName + " version ==> " + resolved); ++ return resolved; ++ } + return val; + }) + : deps; +@@ -160,9 +180,9 @@ exports.copyPackageToStore = function (options) { return __awaiter(void 0, void + case 2: + npmList = _c.sent(); + filesToCopy = npmList.filter(function (f) { return !ignoreRule.ignores(f); }); +- if (options.files) { ++ if (options.content) { + console.info('Files included in published content:'); +- filesToCopy.forEach(function (f) { ++ filesToCopy.sort().forEach(function (f) { + console.log("- " + f); + }); + console.info("Total " + filesToCopy.length + " files."); diff --git a/playground/app-router/package.json b/playground/app-router/package.json index 71db1014ba..14161494be 100644 --- a/playground/app-router/package.json +++ b/playground/app-router/package.json @@ -3,11 +3,11 @@ "version": "0.1.0", "private": true, "scripts": { - "dev:yalc": "pnpm yalc && rm -rf .next && next dev --port 4011", - "yalc": "yalc add -- @clerk/nextjs @clerk/clerk-react @clerk/backend @clerk/types @clerk/shared", + "dev:yalc": "pnpm yalc:add && rm -rf .next && next dev --port 4011", + "yalc:add": "pnpm yalc add -- @clerk/nextjs @clerk/clerk-react @clerk/backend @clerk/types @clerk/shared", "dev": "next dev --port 4011", "build": "next build", - "build:yalc": "pnpm yalc && rm -rf .next && next build", + "build:yalc": "pnpm yalc:add && rm -rf .next && next build", "start": "next start", "lint": "next lint" }, diff --git a/playground/chrome-extension/package.json b/playground/chrome-extension/package.json index c64fb769a9..e2d3c219e1 100644 --- a/playground/chrome-extension/package.json +++ b/playground/chrome-extension/package.json @@ -34,6 +34,6 @@ "scripts": { "build": "vite build", "dev": "pnpm yalc:add && nodemon", - "yalc:add": "yalc add -- @clerk/chrome-extension @clerk/clerk-react @clerk/clerk-js @clerk/localizations @clerk/themes @clerk/types @clerk/shared" + "yalc:add": "pnpm yalc add -- @clerk/chrome-extension @clerk/clerk-react @clerk/clerk-js @clerk/localizations @clerk/themes @clerk/types @clerk/shared" } } diff --git a/playground/expo/package.json b/playground/expo/package.json index bcfa81ff17..d2d5366f3e 100644 --- a/playground/expo/package.json +++ b/playground/expo/package.json @@ -8,7 +8,7 @@ "ios": "expo run:ios", "start": "expo start", "web": "expo start --web", - "yalc": "yalc add @clerk/clerk-expo @clerk/clerk-js @clerk/clerk-react @clerk/types @clerk/shared @clerk/types @clerk/expo-passkeys", + "yalc:add": "pnpm yalc add @clerk/clerk-expo @clerk/clerk-js @clerk/clerk-react @clerk/types @clerk/shared @clerk/types @clerk/expo-passkeys", "expo:update": "pnpm expo install --fix" }, "dependencies": { diff --git a/playground/express/package.json b/playground/express/package.json index 7b21aca5f5..61434497ba 100644 --- a/playground/express/package.json +++ b/playground/express/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "start": "ts-node ./src/server.ts", - "yalc:add": "yalc add -- @clerk/express @clerk/types @clerk/backend @clerk/shared", + "yalc:add": "pnpm yalc add -- @clerk/express @clerk/types @clerk/backend @clerk/shared", "dev:fromlocal": " nodemon --watch .yalc --watch src --exec \"pnpm yalc:add && pnpm start\"" }, "author": "", diff --git a/playground/nextjs/package.json b/playground/nextjs/package.json index 03fba79450..3833cf1f45 100644 --- a/playground/nextjs/package.json +++ b/playground/nextjs/package.json @@ -3,8 +3,8 @@ "version": "0.1.0", "private": true, "scripts": { - "dev:yalc": "pnpm yalc && rm -rf .next && next dev --port 4011", - "yalc": "yalc add @clerk/nextjs @clerk/clerk-react @clerk/backend @clerk/types @clerk/shared", + "dev:yalc": "pnpm yalc:add && rm -rf .next && next dev --port 4011", + "yalc:add": "pnpm yalc add @clerk/nextjs @clerk/clerk-react @clerk/backend @clerk/types @clerk/shared", "dev": "rm -rf .next && next dev --port 4011", "build": "next build", "start": "next start", diff --git a/playground/remix-cf-pages/package.json b/playground/remix-cf-pages/package.json index a252ac6fd1..23eca108d0 100644 --- a/playground/remix-cf-pages/package.json +++ b/playground/remix-cf-pages/package.json @@ -8,7 +8,7 @@ "dev": "remix build && run-p \"dev:*\"", "start": "cross-env NODE_ENV=production pnpm dev:wrangler", "typecheck": "tsc -b", - "yalc:add": "yalc add @clerk/types && yalc add @clerk/remix && yalc add @clerk/backend" + "yalc:add": "pnpm yalc add @clerk/types && yalc add @clerk/remix && yalc add @clerk/backend" }, "dependencies": { "@clerk/backend": "file:.yalc/@clerk/backend", diff --git a/playground/remix-cf-worker/package.json b/playground/remix-cf-worker/package.json index 1c638b6fa2..0021e06dda 100644 --- a/playground/remix-cf-worker/package.json +++ b/playground/remix-cf-worker/package.json @@ -8,7 +8,7 @@ "dev:miniflare": "cross-env NODE_ENV=development miniflare ./build/index.js --watch", "dev": "remix build && run-p \"dev:*\"", "start": "cross-env NODE_ENV=production miniflare ./build/index.js", - "yalc:add": "yalc add @clerk/types && yalc add @clerk/remix && yalc add @clerk/backend" + "yalc:add": "pnpm yalc add @clerk/types && yalc add @clerk/remix && yalc add @clerk/backend" }, "dependencies": { "@clerk/backend": "file:.yalc/@clerk/backend", diff --git a/playground/remix-node/package.json b/playground/remix-node/package.json index ba300d292d..9e75db9c6b 100644 --- a/playground/remix-node/package.json +++ b/playground/remix-node/package.json @@ -6,7 +6,7 @@ "dev": "remix dev", "start": "remix-serve build", "clean": "rm -rf .cache build", - "yalc:add": "yalc add -- @clerk/types @clerk/shared @clerk/backend @clerk/remix @clerk/clerk-react" + "yalc:add": "pnpm yalc add -- @clerk/types @clerk/shared @clerk/backend @clerk/remix @clerk/clerk-react" }, "dependencies": { "@clerk/backend": "file:.yalc/@clerk/backend", diff --git a/playground/vite-react-ts/package.json b/playground/vite-react-ts/package.json index 7df232e173..b4990746e3 100644 --- a/playground/vite-react-ts/package.json +++ b/playground/vite-react-ts/package.json @@ -8,8 +8,8 @@ "build": "tsc && vite build", "lint": "eslint src --ext ts,tsx --report-unused-disable-directives --max-warnings 0", "preview": "vite preview", - "dev:yalc": "pnpm yalc && vite", - "yalc": "yalc add -- @clerk/clerk-react @clerk/types @clerk/shared" + "dev:yalc": "pnpm yalc:add && vite", + "yalc:add": "pnpm yalc add -- @clerk/clerk-react @clerk/types @clerk/shared" }, "dependencies": { "@clerk/clerk-js": "file:.yalc/@clerk/clerk-js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2357c78d5b..650a2af936 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,11 @@ overrides: jest: 29.7.0 jest-snapshot-prettier: npm:prettier@^3 +patchedDependencies: + yalc@1.0.0-pre.53: + hash: nepk7g7jbppq422nppscin4xqm + path: patches/yalc@1.0.0-pre.53.patch + importers: .: @@ -205,6 +210,9 @@ importers: vitest: specifier: 2.1.4 version: 2.1.4(@edge-runtime/vm@4.0.4)(@types/node@20.17.5)(jsdom@24.1.3)(msw@2.6.4(@types/node@20.17.5)(typescript@5.6.3))(terser@5.31.1) + yalc: + specifier: 1.0.0-pre.53 + version: 1.0.0-pre.53(patch_hash=nepk7g7jbppq422nppscin4xqm) zx: specifier: ^7.2.3 version: 7.2.3 @@ -9477,6 +9485,9 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + ignore-walk@3.0.4: + resolution: {integrity: sha512-PY6Ii8o1jMRA1z4F2hRkH/xN59ox43DavKvD3oDpfurRlOJyAHpifIwpbdv1n4jt4ov0jSpw3kQ4GhJnpBL6WQ==} + ignore-walk@5.0.1: resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -11409,10 +11420,16 @@ packages: resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==} engines: {node: '>=4'} + npm-bundled@1.1.2: + resolution: {integrity: sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==} + npm-bundled@2.0.1: resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + npm-normalize-package-bin@1.0.1: + resolution: {integrity: sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==} + npm-normalize-package-bin@2.0.0: resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -11424,6 +11441,11 @@ packages: npm-package-arg@7.0.0: resolution: {integrity: sha512-xXxr8y5U0kl8dVkz2oK7yZjPBvqM2fwaO5l3Yg13p03v8+E3qQcD0JNhHzjL1vyGgxcKkD0cco+NLR72iuPk3g==} + npm-packlist@2.2.2: + resolution: {integrity: sha512-Jt01acDvJRhJGthnUJVF/w6gumWOZxO7IkpY/lsX9//zqQgnF7OJaxgQXcerd4uQOLu7W5bkb4mChL9mdfm+Zg==} + engines: {node: '>=10'} + hasBin: true + npm-packlist@5.1.3: resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -15098,6 +15120,10 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} + yalc@1.0.0-pre.53: + resolution: {integrity: sha512-tpNqBCpTXplnduzw5XC+FF8zNJ9L/UXmvQyyQj7NKrDNavbJtHvzmZplL5ES/RCnjX7JR7W9wz5GVDXVP3dHUQ==} + hasBin: true + yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} @@ -26208,6 +26234,10 @@ snapshots: ieee754@1.2.1: {} + ignore-walk@3.0.4: + dependencies: + minimatch: 3.1.2 + ignore-walk@5.0.1: dependencies: minimatch: 5.1.6 @@ -28857,10 +28887,16 @@ snapshots: query-string: 5.1.1 sort-keys: 2.0.0 + npm-bundled@1.1.2: + dependencies: + npm-normalize-package-bin: 1.0.1 + npm-bundled@2.0.1: dependencies: npm-normalize-package-bin: 2.0.0 + npm-normalize-package-bin@1.0.1: {} + npm-normalize-package-bin@2.0.0: {} npm-package-arg@11.0.3: @@ -28877,6 +28913,13 @@ snapshots: semver: 5.7.2 validate-npm-package-name: 3.0.0 + npm-packlist@2.2.2: + dependencies: + glob: 7.2.3 + ignore-walk: 3.0.4 + npm-bundled: 1.1.2 + npm-normalize-package-bin: 1.0.1 + npm-packlist@5.1.3: dependencies: glob: 8.1.0 @@ -33237,6 +33280,17 @@ snapshots: y18n@5.0.8: {} + yalc@1.0.0-pre.53(patch_hash=nepk7g7jbppq422nppscin4xqm): + dependencies: + chalk: 4.1.2 + detect-indent: 6.1.0 + fs-extra: 8.1.0 + glob: 7.2.3 + ignore: 5.2.4 + ini: 2.0.0 + npm-packlist: 2.2.2 + yargs: 16.2.0 + yallist@2.1.2: {} yallist@3.1.1: {} From 7623a99594e7329200b6b374e483152d7679ce66 Mon Sep 17 00:00:00 2001 From: Nikos Douvlis Date: Fri, 22 Nov 2024 15:59:16 +0200 Subject: [PATCH 09/19] fix(clerk-js): Decouple captcha heartbeat from token refresh (#4630) --- .changeset/fast-wolves-love.md | 6 ++ .../src/core/__tests__/tokenCache.test.ts | 2 +- .../src/core/auth/CaptchaHeartbeat.ts | 44 +++++++++++ packages/clerk-js/src/core/clerk.ts | 5 +- packages/clerk-js/src/core/fraudProtection.ts | 74 +------------------ .../clerk-js/src/core/resources/Client.ts | 4 + .../src/core/resources/DisplayConfig.ts | 2 + .../clerk-js/src/core/resources/Session.ts | 23 +++--- packages/clerk-js/src/core/tokenCache.ts | 2 +- .../src/utils/captcha/CaptchaChallenge.ts | 67 +++++++++++++++++ packages/types/src/client.ts | 1 + packages/types/src/displayConfig.ts | 2 + 12 files changed, 144 insertions(+), 88 deletions(-) create mode 100644 .changeset/fast-wolves-love.md create mode 100644 packages/clerk-js/src/core/auth/CaptchaHeartbeat.ts create mode 100644 packages/clerk-js/src/utils/captcha/CaptchaChallenge.ts diff --git a/.changeset/fast-wolves-love.md b/.changeset/fast-wolves-love.md new file mode 100644 index 0000000000..a057d09ee8 --- /dev/null +++ b/.changeset/fast-wolves-love.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': patch +'@clerk/types': patch +--- + +Decouple captcha heartbeat from token refresh mechanism diff --git a/packages/clerk-js/src/core/__tests__/tokenCache.test.ts b/packages/clerk-js/src/core/__tests__/tokenCache.test.ts index 75bbf824d9..6dcf3833ab 100644 --- a/packages/clerk-js/src/core/__tests__/tokenCache.test.ts +++ b/packages/clerk-js/src/core/__tests__/tokenCache.test.ts @@ -125,7 +125,7 @@ describe('MemoryTokenCache', () => { expect(cache.get(key)).toMatchObject(key); // 44s since token created - jest.advanceTimersByTime(44 * 1000); + jest.advanceTimersByTime(45 * 1000); expect(cache.get(key)).toMatchObject(key); // 46s since token created diff --git a/packages/clerk-js/src/core/auth/CaptchaHeartbeat.ts b/packages/clerk-js/src/core/auth/CaptchaHeartbeat.ts new file mode 100644 index 0000000000..173019607e --- /dev/null +++ b/packages/clerk-js/src/core/auth/CaptchaHeartbeat.ts @@ -0,0 +1,44 @@ +import { createWorkerTimers } from '@clerk/shared/workerTimers'; + +import { CaptchaChallenge } from '../../utils/captcha/CaptchaChallenge'; +import type { Clerk } from '../resources/internal'; + +export class CaptchaHeartbeat { + constructor( + private clerk: Clerk, + private captchaChallenge = new CaptchaChallenge(clerk), + private timers = createWorkerTimers(), + ) {} + + public async start() { + if (!this.isEnabled()) { + return; + } + + await this.challengeAndSend(); + this.timers.setInterval(() => { + void this.challengeAndSend(); + }, this.intervalInMs()); + } + + private async challengeAndSend() { + if (!this.clerk.client) { + return; + } + + try { + const params = await this.captchaChallenge.invisible(); + await this.clerk.client.sendCaptchaToken(params); + } catch (e) { + // Ignore unhandled errors + } + } + + private isEnabled() { + return !!this.clerk.__unstable__environment?.displayConfig.captchaHeartbeat; + } + + private intervalInMs() { + return this.clerk.__unstable__environment?.displayConfig.captchaHeartbeatIntervalMs ?? 10 * 60 * 1000; + } +} diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 78b322a258..21f43e6ee6 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -99,6 +99,7 @@ import { assertNoLegacyProp } from '../utils/assertNoLegacyProp'; import { memoizeListenerCallback } from '../utils/memoizeStateListenerCallback'; import { RedirectUrls } from '../utils/redirectUrls'; import { AuthCookieService } from './auth/AuthCookieService'; +import { CaptchaHeartbeat } from './auth/CaptchaHeartbeat'; import { CLERK_SATELLITE_URL, CLERK_SUFFIXED_COOKIES, CLERK_SYNCED, ERROR_CODES } from './constants'; import { clerkErrorInitFailed, @@ -178,6 +179,7 @@ export class Clerk implements ClerkInterface { #domain: DomainOrProxyUrl['domain']; #proxyUrl: DomainOrProxyUrl['proxyUrl']; #authService?: AuthCookieService; + #captchaHeartbeat?: CaptchaHeartbeat; #broadcastChannel: LocalStorageBroadcastChannel | null = null; #componentControls?: ReturnType | null; //@ts-expect-error with being undefined even though it's not possible - related to issue with ts and error thrower @@ -1828,8 +1830,9 @@ export class Clerk implements ClerkInterface { } } + this.#captchaHeartbeat = new CaptchaHeartbeat(this); + void this.#captchaHeartbeat.start(); this.#clearClerkQueryParams(); - this.#handleImpersonationFab(); this.#handleAccountlessPrompt(); return true; diff --git a/packages/clerk-js/src/core/fraudProtection.ts b/packages/clerk-js/src/core/fraudProtection.ts index 3a75ab2dd5..8c96229a17 100644 --- a/packages/clerk-js/src/core/fraudProtection.ts +++ b/packages/clerk-js/src/core/fraudProtection.ts @@ -1,13 +1,8 @@ -import { getCaptchaToken, retrieveCaptchaInfo } from '../utils/captcha'; +import { CaptchaChallenge } from '../utils/captcha/CaptchaChallenge'; import type { Clerk } from './resources/internal'; -/** - * TODO: @nikos Move captcha and fraud detection logic to this class - */ class FraudProtectionService { private inflightRequest: Promise | null = null; - private ticks = 0; - private readonly interval = 6; public async execute Promise>(cb: T): Promise>> { if (this.inflightRequest) { @@ -26,71 +21,8 @@ class FraudProtectionService { return this.inflightRequest ? this.inflightRequest.then(() => null) : Promise.resolve(); } - public async challengeHeartbeat(clerk: Clerk) { - if (!clerk.__unstable__environment?.displayConfig.captchaHeartbeat || this.ticks++ % (this.interval - 1)) { - return undefined; - } - return this.invisibleChallenge(clerk); - } - - /** - * Triggers an invisible challenge. - * This will always use the non-interactive variant of the CAPTCHA challenge and will - * always use the fallback key. - */ - public async invisibleChallenge(clerk: Clerk) { - const { captchaSiteKey, canUseCaptcha, captchaURL, captchaPublicKeyInvisible } = retrieveCaptchaInfo(clerk); - - if (canUseCaptcha && captchaSiteKey && captchaURL && captchaPublicKeyInvisible) { - return getCaptchaToken({ - siteKey: captchaPublicKeyInvisible, - invisibleSiteKey: captchaPublicKeyInvisible, - widgetType: 'invisible', - scriptUrl: captchaURL, - captchaProvider: 'turnstile', - }).catch(e => { - if (e.captchaError) { - return { captchaError: e.captchaError }; - } - return undefined; - }); - } - - return undefined; - } - - /** - * Triggers a smart challenge if the user is required to solve a CAPTCHA. - * Depending on the environment settings, this will either trigger an - * invisible or smart (managed) CAPTCHA challenge. - * Managed challenged start as non-interactive and escalate to interactive if necessary. - * Important: For this to work at the moment, the instance needs to be using SMART protection - * as we need both keys (visible and invisible) to be present. - */ - public async managedChallenge(clerk: Clerk) { - const { captchaSiteKey, canUseCaptcha, captchaURL, captchaWidgetType, captchaProvider, captchaPublicKeyInvisible } = - retrieveCaptchaInfo(clerk); - - if (canUseCaptcha && captchaSiteKey && captchaURL && captchaPublicKeyInvisible) { - return getCaptchaToken({ - siteKey: captchaSiteKey, - widgetType: captchaWidgetType, - invisibleSiteKey: captchaPublicKeyInvisible, - scriptUrl: captchaURL, - captchaProvider, - modalWrapperQuerySelector: '#cl-modal-captcha-wrapper', - modalContainerQuerySelector: '#cl-modal-captcha-container', - openModal: () => clerk.__internal_openBlankCaptchaModal(), - closeModal: () => clerk.__internal_closeBlankCaptchaModal(), - }).catch(e => { - if (e.captchaError) { - return { captchaError: e.captchaError }; - } - return undefined; - }); - } - - return {}; + public managedChallenge(clerk: Clerk) { + return new CaptchaChallenge(clerk).managed(); } } diff --git a/packages/clerk-js/src/core/resources/Client.ts b/packages/clerk-js/src/core/resources/Client.ts index 8e4ac8ed96..d548430305 100644 --- a/packages/clerk-js/src/core/resources/Client.ts +++ b/packages/clerk-js/src/core/resources/Client.ts @@ -94,6 +94,10 @@ export class Client extends BaseResource implements ClientResource { .toString(); } + public sendCaptchaToken(params: unknown): Promise { + return this._basePatch({ body: params }); + } + fromJSON(data: ClientJSON | null): this { if (data) { this.id = data.id; diff --git a/packages/clerk-js/src/core/resources/DisplayConfig.ts b/packages/clerk-js/src/core/resources/DisplayConfig.ts index 62fd568edc..939c9cd37b 100644 --- a/packages/clerk-js/src/core/resources/DisplayConfig.ts +++ b/packages/clerk-js/src/core/resources/DisplayConfig.ts @@ -27,6 +27,7 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource captchaPublicKeyInvisible: string | null = null; captchaOauthBypass: OAuthStrategy[] = []; captchaHeartbeat: boolean = false; + captchaHeartbeatIntervalMs?: number = undefined; homeUrl!: string; instanceEnvironmentType!: string; faviconImageUrl!: string; @@ -85,6 +86,7 @@ export class DisplayConfig extends BaseResource implements DisplayConfigResource // before the introduction of the captcha_oauth_bypass field this.captchaOauthBypass = data.captcha_oauth_bypass || ['oauth_google', 'oauth_microsoft', 'oauth_apple']; this.captchaHeartbeat = data.captcha_heartbeat || false; + this.captchaHeartbeatIntervalMs = data.captcha_heartbeat_interval_ms; this.supportEmail = data.support_email || ''; this.clerkJSVersion = data.clerk_js_version; this.organizationProfileUrl = data.organization_profile_url; diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts index c4a30e7600..3d5fcf5673 100644 --- a/packages/clerk-js/src/core/resources/Session.ts +++ b/packages/clerk-js/src/core/resources/Session.ts @@ -275,20 +275,15 @@ export class Session extends BaseResource implements SessionResource { // this handles all getToken invocations with skipCache: true await fraudProtection.blockUntilReady(); - const createTokenWithCaptchaProtection = async () => { - const heartbeatParams = skipCache ? undefined : await fraudProtection.challengeHeartbeat(Session.clerk); - return Token.create(path, { ...params, ...heartbeatParams }).catch(e => { - if (isClerkAPIResponseError(e) && e.errors[0].code === 'requires_captcha') { - return fraudProtection.execute(async () => { - const captchaParams = await fraudProtection.managedChallenge(Session.clerk); - return Token.create(path, { ...params, ...captchaParams }); - }); - } - throw e; - }); - }; - - const tokenResolver = createTokenWithCaptchaProtection(); + const tokenResolver = Token.create(path, params).catch(e => { + if (isClerkAPIResponseError(e) && e.errors[0].code === 'requires_captcha') { + return fraudProtection.execute(async () => { + const captchaParams = await fraudProtection.managedChallenge(Session.clerk); + return Token.create(path, { ...params, ...captchaParams }); + }); + } + throw e; + }); SessionTokenCache.set({ tokenId, tokenResolver }); return tokenResolver.then(token => { diff --git a/packages/clerk-js/src/core/tokenCache.ts b/packages/clerk-js/src/core/tokenCache.ts index c5e74be3da..102798425e 100644 --- a/packages/clerk-js/src/core/tokenCache.ts +++ b/packages/clerk-js/src/core/tokenCache.ts @@ -26,7 +26,7 @@ interface TokenCache { const KEY_PREFIX = 'clerk'; const DELIMITER = '::'; -const LEEWAY = 11; +const LEEWAY = 10; // This value should have the same value as the INTERVAL_IN_MS in SessionCookiePoller const SYNC_LEEWAY = 5; diff --git a/packages/clerk-js/src/utils/captcha/CaptchaChallenge.ts b/packages/clerk-js/src/utils/captcha/CaptchaChallenge.ts new file mode 100644 index 0000000000..7e3d4dbf26 --- /dev/null +++ b/packages/clerk-js/src/utils/captcha/CaptchaChallenge.ts @@ -0,0 +1,67 @@ +import type { Clerk } from '../../core/resources/internal'; +import { getCaptchaToken } from './getCaptchaToken'; +import { retrieveCaptchaInfo } from './retrieveCaptchaInfo'; + +export class CaptchaChallenge { + public constructor(private clerk: Clerk) {} + + /** + * Triggers an invisible challenge. + * This will always use the non-interactive variant of the CAPTCHA challenge and will + * always use the fallback key. + */ + public async invisible() { + const { captchaSiteKey, canUseCaptcha, captchaURL, captchaPublicKeyInvisible } = retrieveCaptchaInfo(this.clerk); + + if (canUseCaptcha && captchaSiteKey && captchaURL && captchaPublicKeyInvisible) { + return getCaptchaToken({ + siteKey: captchaPublicKeyInvisible, + invisibleSiteKey: captchaPublicKeyInvisible, + widgetType: 'invisible', + scriptUrl: captchaURL, + captchaProvider: 'turnstile', + }).catch(e => { + if (e.captchaError) { + return { captchaError: e.captchaError }; + } + return undefined; + }); + } + + return undefined; + } + + /** + * Triggers a smart challenge if the user is required to solve a CAPTCHA. + * Depending on the environment settings, this will either trigger an + * invisible or smart (managed) CAPTCHA challenge. + * Managed challenged start as non-interactive and escalate to interactive if necessary. + * Important: For this to work at the moment, the instance needs to be using SMART protection + * as we need both keys (visible and invisible) to be present. + */ + public async managed() { + const { captchaSiteKey, canUseCaptcha, captchaURL, captchaWidgetType, captchaProvider, captchaPublicKeyInvisible } = + retrieveCaptchaInfo(this.clerk); + + if (canUseCaptcha && captchaSiteKey && captchaURL && captchaPublicKeyInvisible) { + return getCaptchaToken({ + siteKey: captchaSiteKey, + widgetType: captchaWidgetType, + invisibleSiteKey: captchaPublicKeyInvisible, + scriptUrl: captchaURL, + captchaProvider, + modalWrapperQuerySelector: '#cl-modal-captcha-wrapper', + modalContainerQuerySelector: '#cl-modal-captcha-container', + openModal: () => this.clerk.__internal_openBlankCaptchaModal(), + closeModal: () => this.clerk.__internal_closeBlankCaptchaModal(), + }).catch(e => { + if (e.captchaError) { + return { captchaError: e.captchaError }; + } + return undefined; + }); + } + + return {}; + } +} diff --git a/packages/types/src/client.ts b/packages/types/src/client.ts index a3e06b8ce6..7be8bfdf5c 100644 --- a/packages/types/src/client.ts +++ b/packages/types/src/client.ts @@ -10,6 +10,7 @@ export interface ClientResource extends ClerkResource { signIn: SignInResource; isNew: () => boolean; create: () => Promise; + sendCaptchaToken: (params: unknown) => Promise; destroy: () => Promise; removeSessions: () => Promise; clearCache: () => void; diff --git a/packages/types/src/displayConfig.ts b/packages/types/src/displayConfig.ts index 2eab780801..39a754e008 100644 --- a/packages/types/src/displayConfig.ts +++ b/packages/types/src/displayConfig.ts @@ -22,6 +22,7 @@ export interface DisplayConfigJSON { captcha_provider: CaptchaProvider; captcha_oauth_bypass: OAuthStrategy[] | null; captcha_heartbeat?: boolean; + captcha_heartbeat_interval_ms?: number; home_url: string; instance_environment_type: string; logo_image_url: string; @@ -66,6 +67,7 @@ export interface DisplayConfigResource extends ClerkResource { */ captchaOauthBypass: OAuthStrategy[]; captchaHeartbeat: boolean; + captchaHeartbeatIntervalMs?: number; homeUrl: string; instanceEnvironmentType: string; logoImageUrl: string; From 92a4859800ee368e5223a14d0402c801ece29989 Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Fri, 22 Nov 2024 09:13:28 -0500 Subject: [PATCH 10/19] ci(repo): Version packages (#4627) Co-authored-by: github-actions[bot] --- .changeset/clever-bats-own.md | 5 ----- .changeset/cyan-ducks-accept.md | 5 ----- .changeset/early-games-taste.md | 5 ----- .changeset/empty-fans-attack.md | 5 ----- .changeset/fast-wolves-love.md | 6 ------ .changeset/thick-peas-perform.md | 2 -- packages/astro/CHANGELOG.md | 9 +++++++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 8 ++++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 9 +++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 17 +++++++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 +++++++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 8 ++++++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 10 ++++++++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 +++++++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 +++++++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 7 +++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 10 ++++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 ++++++++++ packages/nuxt/package.json | 2 +- packages/react/CHANGELOG.md | 8 ++++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 ++++++++++ packages/remix/package.json | 2 +- packages/sdk-node/CHANGELOG.md | 9 +++++++++ packages/sdk-node/package.json | 2 +- packages/shared/CHANGELOG.md | 7 +++++++ packages/shared/package.json | 2 +- packages/tanstack-start/CHANGELOG.md | 10 ++++++++++ packages/tanstack-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 +++++++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++++++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 8 ++++++++ packages/types/package.json | 2 +- packages/ui/CHANGELOG.md | 10 ++++++++++ packages/ui/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++++++ packages/vue/package.json | 2 +- 50 files changed, 223 insertions(+), 50 deletions(-) delete mode 100644 .changeset/clever-bats-own.md delete mode 100644 .changeset/cyan-ducks-accept.md delete mode 100644 .changeset/early-games-taste.md delete mode 100644 .changeset/empty-fans-attack.md delete mode 100644 .changeset/fast-wolves-love.md delete mode 100644 .changeset/thick-peas-perform.md diff --git a/.changeset/clever-bats-own.md b/.changeset/clever-bats-own.md deleted file mode 100644 index bd2a121438..0000000000 --- a/.changeset/clever-bats-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/types': patch ---- - -Add `__internal_claimAccountlessKeysUrl` to `ClerkOptions`. diff --git a/.changeset/cyan-ducks-accept.md b/.changeset/cyan-ducks-accept.md deleted file mode 100644 index 7bea2c6611..0000000000 --- a/.changeset/cyan-ducks-accept.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Catch and ignore any captcha errors during heartbeat diff --git a/.changeset/early-games-taste.md b/.changeset/early-games-taste.md deleted file mode 100644 index 6130b6a886..0000000000 --- a/.changeset/early-games-taste.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Enable captcha for development instances diff --git a/.changeset/empty-fans-attack.md b/.changeset/empty-fans-attack.md deleted file mode 100644 index e3b32213db..0000000000 --- a/.changeset/empty-fans-attack.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/clerk-js': patch ---- - -Add new internal UI component for accountless. diff --git a/.changeset/fast-wolves-love.md b/.changeset/fast-wolves-love.md deleted file mode 100644 index a057d09ee8..0000000000 --- a/.changeset/fast-wolves-love.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/clerk-js': patch -'@clerk/types': patch ---- - -Decouple captcha heartbeat from token refresh mechanism diff --git a/.changeset/thick-peas-perform.md b/.changeset/thick-peas-perform.md deleted file mode 100644 index a845151cc8..0000000000 --- a/.changeset/thick-peas-perform.md +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index c10ded0b9a..12c99e1982 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 1.4.15 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/shared@2.16.1 + ## 1.4.14 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index fafbfe0271..574361eb02 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "1.4.14", + "version": "1.4.15", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 40715b6a3e..ce5fa92442 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 1.17.2 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/shared@2.16.1 + ## 1.17.1 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 54bcb53790..97a64d58cb 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "1.17.1", + "version": "1.17.2", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 35fbf4fdcf..4c97fb97f6 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.3.40 + +### Patch Changes + +- Updated dependencies [[`727c218f8f176bcde73995dafb503a594e16669b`](https://github.com/clerk/javascript/commit/727c218f8f176bcde73995dafb503a594e16669b), [`0c477281ba1034a485b1d053472990e70ac3aa78`](https://github.com/clerk/javascript/commit/0c477281ba1034a485b1d053472990e70ac3aa78), [`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/clerk-js@5.34.6 + - @clerk/clerk-react@5.16.2 + - @clerk/shared@2.16.1 + ## 1.3.39 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 338bed1fa8..7d9c633817 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "1.3.39", + "version": "1.3.40", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 3088147ec7..1ed62dcca2 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,22 @@ # Change Log +## 5.34.6 + +### Patch Changes + +- Catch and ignore any captcha errors during heartbeat ([#4629](https://github.com/clerk/javascript/pull/4629)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Enable captcha for development instances ([#4620](https://github.com/clerk/javascript/pull/4620)) by [@issuedat](https://github.com/issuedat) + +- Add new internal UI component for accountless. ([#4625](https://github.com/clerk/javascript/pull/4625)) by [@panteliselef](https://github.com/panteliselef) + +- Decouple captcha heartbeat from token refresh mechanism ([#4630](https://github.com/clerk/javascript/pull/4630)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/localizations@3.6.6 + - @clerk/shared@2.16.1 + ## 5.34.5 ### Patch Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 55cb4dc869..3421a69101 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.34.5", + "version": "5.34.6", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index 7502849f77..443972a0d6 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.19.6 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/clerk-react@5.16.2 + - @clerk/shared@2.16.1 + ## 0.19.5 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 619533d048..18da66208a 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.19.5", + "version": "0.19.6", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 8879848cfe..06fefecfa6 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/expo-passkeys +## 0.0.8 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/shared@2.16.1 + ## 0.0.7 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index cb2bce18ed..2c1d322a45 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.0.7", + "version": "0.0.8", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 3fb210a586..466ce3cf7e 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.3.9 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`727c218f8f176bcde73995dafb503a594e16669b`](https://github.com/clerk/javascript/commit/727c218f8f176bcde73995dafb503a594e16669b), [`0c477281ba1034a485b1d053472990e70ac3aa78`](https://github.com/clerk/javascript/commit/0c477281ba1034a485b1d053472990e70ac3aa78), [`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/clerk-js@5.34.6 + - @clerk/clerk-react@5.16.2 + - @clerk/shared@2.16.1 + ## 2.3.8 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index f23dd8e918..7c915d4c40 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.3.8", + "version": "2.3.9", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index a8b0f88b09..0e0a42affa 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.3.17 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/shared@2.16.1 + ## 1.3.16 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index 04bb617685..a62823b6ef 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.3.16", + "version": "1.3.17", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index e6cad5726a..02f8b98a48 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.0.19 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/shared@2.16.1 + ## 2.0.18 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index e1f5f83047..d1943a92ae 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.0.18", + "version": "2.0.19", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 1e2ca4b242..08e4ed8aef 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 3.6.6 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + ## 3.6.5 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index 87b8a845a6..1b6bf6c16e 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.6.5", + "version": "3.6.6", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index 31c68a6076..ca75d86e73 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 6.4.2 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/clerk-react@5.16.2 + - @clerk/shared@2.16.1 + ## 6.4.1 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index 2dbd33051c..e307f11a70 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.4.1", + "version": "6.4.2", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index fa297308fc..8c267e44be 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 0.0.3 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/shared@2.16.1 + - @clerk/vue@0.0.7 + ## 0.0.2 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index f5e9dacb47..386ad84076 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "0.0.2", + "version": "0.0.3", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index cf1d086b83..f1c87be460 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 5.16.2 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/shared@2.16.1 + ## 5.16.1 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index dcd9fec792..56774eff42 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.16.1", + "version": "5.16.2", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index ac2c0964f0..23e7e2a798 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.2.55 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/clerk-react@5.16.2 + - @clerk/shared@2.16.1 + ## 4.2.54 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index a7b58820aa..fbdeeb6a22 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.2.54", + "version": "4.2.55", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md index 41e496605f..f9dcd0cc96 100644 --- a/packages/sdk-node/CHANGELOG.md +++ b/packages/sdk-node/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 5.0.68 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/shared@2.16.1 + ## 5.0.67 ### Patch Changes diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json index ba1d105c72..173c0735db 100644 --- a/packages/sdk-node/package.json +++ b/packages/sdk-node/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-sdk-node", - "version": "5.0.67", + "version": "5.0.68", "description": "Clerk server SDK for usage with node", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index a0f606f731..2424468eed 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.16.1 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + ## 2.16.0 ### Minor Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index db7ea5f16d..a9e52aa3e5 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "2.16.0", + "version": "2.16.1", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-start/CHANGELOG.md b/packages/tanstack-start/CHANGELOG.md index cc31b745bd..61ea355889 100644 --- a/packages/tanstack-start/CHANGELOG.md +++ b/packages/tanstack-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-start +## 0.5.2 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/clerk-react@5.16.2 + - @clerk/shared@2.16.1 + ## 0.5.1 ### Patch Changes diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index b7ec3bb709..1190d54af8 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-start", - "version": "0.5.1", + "version": "0.5.2", "description": "Clerk SDK for TanStack Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 590318dbf5..8398e0b9e6 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.3.29 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/backend@1.17.2 + - @clerk/shared@2.16.1 + ## 1.3.28 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index 696d68f8c1..f500403a4b 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.3.28", + "version": "1.3.29", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index a4a8f36470..1b2c9231d8 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.1.47 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + ## 2.1.46 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index 1766826130..97304105cb 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.1.46", + "version": "2.1.47", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index a81eb43687..87d0ebcd52 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,13 @@ # Change Log +## 4.34.2 + +### Patch Changes + +- Add `__internal_claimAccountlessKeysUrl` to `ClerkOptions`. ([#4625](https://github.com/clerk/javascript/pull/4625)) by [@panteliselef](https://github.com/panteliselef) + +- Decouple captcha heartbeat from token refresh mechanism ([#4630](https://github.com/clerk/javascript/pull/4630)) by [@nikosdouvlis](https://github.com/nikosdouvlis) + ## 4.34.1 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 758f46af31..93b4091a4c 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.34.1", + "version": "4.34.2", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 0b8d1b07cb..3ae0de2e3b 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/ui +## 0.1.23 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/elements@0.19.6 + - @clerk/localizations@3.6.6 + - @clerk/shared@2.16.1 + ## 0.1.22 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index bc37baf7ea..eb6c5243a5 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/ui", - "version": "0.1.22", + "version": "0.1.23", "repository": { "type": "git", "url": "git+https://github.com/clerk/javascript.git", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index c31a183597..5ba98a51a5 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 0.0.7 + +### Patch Changes + +- Updated dependencies [[`c70994b5b6f92a6550dfe37547f01bbfa810c223`](https://github.com/clerk/javascript/commit/c70994b5b6f92a6550dfe37547f01bbfa810c223), [`7623a99594e7329200b6b374e483152d7679ce66`](https://github.com/clerk/javascript/commit/7623a99594e7329200b6b374e483152d7679ce66)]: + - @clerk/types@4.34.2 + - @clerk/shared@2.16.1 + ## 0.0.6 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 126d24f4cc..3724a46585 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "0.0.6", + "version": "0.0.7", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From 7c27b0cfda6ace9693e9c184392481b00f24a64d Mon Sep 17 00:00:00 2001 From: Jeff Escalante Date: Fri, 22 Nov 2024 11:34:25 -0500 Subject: [PATCH 11/19] feat(clerk-js): Add nonce to theme provider (#4509) Co-authored-by: Jacek --- .changeset/tricky-rings-divide.md | 5 ++++ .../clerk-js/src/ui/lazyModules/providers.tsx | 15 +++++++---- .../ui/styledSystem/InternalThemeProvider.tsx | 20 +++----------- .../ui/styledSystem/StyleCacheProvider.tsx | 26 +++++++++++++++++++ 4 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 .changeset/tricky-rings-divide.md create mode 100644 packages/clerk-js/src/ui/styledSystem/StyleCacheProvider.tsx diff --git a/.changeset/tricky-rings-divide.md b/.changeset/tricky-rings-divide.md new file mode 100644 index 0000000000..54d59a565b --- /dev/null +++ b/.changeset/tricky-rings-divide.md @@ -0,0 +1,5 @@ +--- +"@clerk/clerk-js": minor +--- + +If a nonce is provided, it is now made available to Clerk's internal components. This allows the nonce to be passed in to style-src in CSPs and work correctly. diff --git a/packages/clerk-js/src/ui/lazyModules/providers.tsx b/packages/clerk-js/src/ui/lazyModules/providers.tsx index 5ffad3d9f0..8156534a84 100644 --- a/packages/clerk-js/src/ui/lazyModules/providers.tsx +++ b/packages/clerk-js/src/ui/lazyModules/providers.tsx @@ -12,6 +12,9 @@ const OptionsProvider = lazy(() => import('../contexts').then(m => ({ default: m const AppearanceProvider = lazy(() => import('../customizables').then(m => ({ default: m.AppearanceProvider }))); const VirtualRouter = lazy(() => import('../router').then(m => ({ default: m.VirtualRouter }))); const InternalThemeProvider = lazy(() => import('../styledSystem').then(m => ({ default: m.InternalThemeProvider }))); +const StyleCacheProvider = lazy(() => + import('../styledSystem/StyleCacheProvider').then(m => ({ default: m.StyleCacheProvider })), +); const Portal = lazy(() => import('./../portal').then(m => ({ default: m.Portal }))); const VirtualBodyRootPortal = lazy(() => import('./../portal').then(m => ({ default: m.VirtualBodyRootPortal }))); const FlowMetadataProvider = lazy(() => import('./../elements').then(m => ({ default: m.FlowMetadataProvider }))); @@ -26,11 +29,13 @@ type LazyProvidersProps = React.PropsWithChildren<{ clerk: any; environment: any export const LazyProviders = (props: LazyProvidersProps) => { return ( - - - {props.children} - - + + + + {props.children} + + + ); }; diff --git a/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx b/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx index 240869dc96..09677ad733 100644 --- a/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx +++ b/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx @@ -1,19 +1,9 @@ // eslint-disable-next-line no-restricted-imports -import createCache from '@emotion/cache'; -// eslint-disable-next-line no-restricted-imports -import { CacheProvider, ThemeProvider } from '@emotion/react'; +import { ThemeProvider } from '@emotion/react'; import React from 'react'; import { useAppearance } from '../customizables'; -import type { InternalTheme } from './index'; - -const el = document.querySelector('style#cl-style-insertion-point'); - -const cache = createCache({ - key: 'cl-internal', - prepend: !el, - insertionPoint: el ? (el as HTMLElement) : undefined, -}); +import type { InternalTheme } from './types'; type InternalThemeProviderProps = React.PropsWithChildren<{ theme?: InternalTheme; @@ -22,9 +12,5 @@ type InternalThemeProviderProps = React.PropsWithChildren<{ export const InternalThemeProvider = (props: InternalThemeProviderProps) => { const { parsedInternalTheme } = useAppearance(); - return ( - - {props.children} - - ); + return {props.children}; }; diff --git a/packages/clerk-js/src/ui/styledSystem/StyleCacheProvider.tsx b/packages/clerk-js/src/ui/styledSystem/StyleCacheProvider.tsx new file mode 100644 index 0000000000..37564095c9 --- /dev/null +++ b/packages/clerk-js/src/ui/styledSystem/StyleCacheProvider.tsx @@ -0,0 +1,26 @@ +// eslint-disable-next-line no-restricted-imports +import createCache from '@emotion/cache'; +// eslint-disable-next-line no-restricted-imports +import { CacheProvider } from '@emotion/react'; +import React, { useMemo } from 'react'; + +const el = document.querySelector('style#cl-style-insertion-point'); + +type StyleCacheProviderProps = React.PropsWithChildren<{ + nonce?: string; +}>; + +export const StyleCacheProvider = (props: StyleCacheProviderProps) => { + const cache = useMemo( + () => + createCache({ + key: 'cl-internal', + prepend: !el, + insertionPoint: el ? (el as HTMLElement) : undefined, + nonce: props.nonce, + }), + [props.nonce], + ); + + return {props.children}; +}; From 4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d Mon Sep 17 00:00:00 2001 From: Tom Milewski Date: Fri, 22 Nov 2024 11:40:26 -0500 Subject: [PATCH 12/19] feat(chrome-extension): Handle manifest permissions in a more-deterministic fashion (#4133) --- .changeset/afraid-toes-sin.md | 6 + .changeset/tidy-garlics-boil.md | 5 + .changeset/wise-spiders-play.md | 48 + packages/chrome-extension/README.md | 142 +- .../chrome-extension/docs/clerk-provider.md | 114 + packages/chrome-extension/docs/manifest.md | 53 + .../chrome-extension/docs/service-worker.md | 27 + .../chrome-extension/src/background/clerk.ts | 21 +- .../chrome-extension/src/background/index.ts | 2 +- .../chrome-extension/src/internal/clerk.ts | 102 +- .../src/internal/constants.ts | 12 +- .../internal/utils/__tests__/cookies.test.ts | 67 +- .../internal/utils/__tests__/manifest.test.ts | 75 +- .../src/internal/utils/cookies.ts | 31 +- .../src/internal/utils/errors.ts | 2 - .../src/internal/utils/manifest.ts | 67 +- .../src/internal/utils/request-handler.ts | 39 + .../src/internal/utils/response-handler.ts | 47 + .../src/react/ClerkProvider.tsx | 12 +- packages/chrome-extension/src/types.ts | 2 +- packages/chrome-extension/tsup.config.ts | 7 +- packages/clerk-js/no-rhc/index.d.ts | 3 + packages/clerk-js/no-rhc/index.js | 1 + packages/clerk-js/package.json | 3 +- packages/clerk-js/rspack.config.js | 65 +- packages/clerk-js/src/core/clerk.ts | 60 +- packages/clerk-js/src/core/errors.ts | 14 +- .../clerk-js/src/core/resources/SignIn.ts | 16 + .../clerk-js/src/core/resources/SignUp.ts | 74 +- packages/clerk-js/src/globals.d.ts | 1 + .../components/GoogleOneTap/one-tap-start.tsx | 8 + .../src/utils/captcha/getCaptchaToken.ts | 8 +- packages/clerk-js/src/utils/index.ts | 11 +- packages/react/src/globals.d.ts | 1 + packages/react/src/isomorphicClerk.ts | 6 +- .../browser-extension/.env.chrome.example | 1 + .../.env.development.example | 2 + playground/browser-extension/.gitignore | 5 + playground/browser-extension/README.md | 68 + playground/browser-extension/assets/icon.png | Bin 0 -> 14295 bytes playground/browser-extension/package.json | 48 + playground/browser-extension/pnpm-lock.yaml | 7170 +++++++++++++++++ .../browser-extension/postcss.config.js | 8 + .../browser-extension/src/background/index.ts | 34 + playground/browser-extension/src/content.tsx | 24 + .../src/features/count-button.tsx | 19 + .../browser-extension/src/popup/index.tsx | 31 + .../src/popup/layouts/root-layout.tsx | 47 + .../src/popup/routes/index.tsx | 7 + .../src/popup/routes/sdk-features.tsx | 16 + .../src/popup/routes/settings.tsx | 10 + .../src/popup/routes/sign-in.tsx | 10 + .../src/popup/routes/sign-up.tsx | 10 + playground/browser-extension/src/style.css | 5 + .../src/tabs/background-worker-demo.html | 12 + .../src/tabs/background-worker-demo.tsx | 37 + .../browser-extension/tailwind.config.js | 6 + playground/browser-extension/tsconfig.json | 20 + playground/chrome-extension/.env.example | 1 - playground/chrome-extension/.gitignore | 14 - playground/chrome-extension/README.md | 66 - playground/chrome-extension/demo.png | Bin 180543 -> 0 bytes .../manifest.dev.json.example | 10 - .../chrome-extension/manifest.json.example | 26 - playground/chrome-extension/nodemon.json | 14 - playground/chrome-extension/package.json | 39 - .../chrome-extension/public/dev-icon-128.png | Bin 16876 -> 0 bytes .../chrome-extension/public/dev-icon-32.png | Bin 2529 -> 0 bytes .../chrome-extension/public/icon-128.png | Bin 19200 -> 0 bytes .../chrome-extension/public/icon-32.png | Bin 2613 -> 0 bytes .../src/assets/styles/index.css | 134 - playground/chrome-extension/src/background.ts | 25 - .../src/components/CurrentUser.tsx | 36 - .../src/components/SharedApp.tsx | 130 - playground/chrome-extension/src/global.d.ts | 11 - .../src/pages/background/index.ts | 1 - .../src/pages/content/index.tsx | 1 - .../src/pages/devtools/index.html | 10 - .../src/pages/devtools/index.ts | 6 - .../src/pages/new-tab/index.html | 12 - .../src/pages/new-tab/index.tsx | 11 - .../src/pages/new-tab/new-tab.tsx | 12 - .../src/pages/options/Options.tsx | 12 - .../src/pages/options/index.html | 12 - .../src/pages/options/index.tsx | 11 - .../src/pages/panel/Panel.tsx | 12 - .../src/pages/panel/index.html | 12 - .../src/pages/panel/index.tsx | 11 - .../src/pages/popup/Popup.tsx | 12 - .../src/pages/popup/index.html | 12 - .../src/pages/popup/index.tsx | 11 - playground/chrome-extension/src/vite-env.d.ts | 1 - playground/chrome-extension/tsconfig.json | 24 - playground/chrome-extension/vite.config.ts | 50 - turbo.json | 1 + 95 files changed, 8284 insertions(+), 1198 deletions(-) create mode 100644 .changeset/afraid-toes-sin.md create mode 100644 .changeset/tidy-garlics-boil.md create mode 100644 .changeset/wise-spiders-play.md create mode 100644 packages/chrome-extension/docs/clerk-provider.md create mode 100644 packages/chrome-extension/docs/manifest.md create mode 100644 packages/chrome-extension/docs/service-worker.md create mode 100644 packages/chrome-extension/src/internal/utils/request-handler.ts create mode 100644 packages/chrome-extension/src/internal/utils/response-handler.ts create mode 100644 packages/clerk-js/no-rhc/index.d.ts create mode 100644 packages/clerk-js/no-rhc/index.js create mode 100644 playground/browser-extension/.env.chrome.example create mode 100644 playground/browser-extension/.env.development.example create mode 100644 playground/browser-extension/.gitignore create mode 100644 playground/browser-extension/README.md create mode 100644 playground/browser-extension/assets/icon.png create mode 100644 playground/browser-extension/package.json create mode 100644 playground/browser-extension/pnpm-lock.yaml create mode 100644 playground/browser-extension/postcss.config.js create mode 100644 playground/browser-extension/src/background/index.ts create mode 100644 playground/browser-extension/src/content.tsx create mode 100644 playground/browser-extension/src/features/count-button.tsx create mode 100644 playground/browser-extension/src/popup/index.tsx create mode 100644 playground/browser-extension/src/popup/layouts/root-layout.tsx create mode 100644 playground/browser-extension/src/popup/routes/index.tsx create mode 100644 playground/browser-extension/src/popup/routes/sdk-features.tsx create mode 100644 playground/browser-extension/src/popup/routes/settings.tsx create mode 100644 playground/browser-extension/src/popup/routes/sign-in.tsx create mode 100644 playground/browser-extension/src/popup/routes/sign-up.tsx create mode 100644 playground/browser-extension/src/style.css create mode 100644 playground/browser-extension/src/tabs/background-worker-demo.html create mode 100644 playground/browser-extension/src/tabs/background-worker-demo.tsx create mode 100644 playground/browser-extension/tailwind.config.js create mode 100644 playground/browser-extension/tsconfig.json delete mode 100644 playground/chrome-extension/.env.example delete mode 100644 playground/chrome-extension/.gitignore delete mode 100644 playground/chrome-extension/README.md delete mode 100644 playground/chrome-extension/demo.png delete mode 100644 playground/chrome-extension/manifest.dev.json.example delete mode 100644 playground/chrome-extension/manifest.json.example delete mode 100644 playground/chrome-extension/nodemon.json delete mode 100644 playground/chrome-extension/package.json delete mode 100644 playground/chrome-extension/public/dev-icon-128.png delete mode 100644 playground/chrome-extension/public/dev-icon-32.png delete mode 100644 playground/chrome-extension/public/icon-128.png delete mode 100644 playground/chrome-extension/public/icon-32.png delete mode 100644 playground/chrome-extension/src/assets/styles/index.css delete mode 100644 playground/chrome-extension/src/background.ts delete mode 100644 playground/chrome-extension/src/components/CurrentUser.tsx delete mode 100644 playground/chrome-extension/src/components/SharedApp.tsx delete mode 100644 playground/chrome-extension/src/global.d.ts delete mode 100644 playground/chrome-extension/src/pages/background/index.ts delete mode 100644 playground/chrome-extension/src/pages/content/index.tsx delete mode 100644 playground/chrome-extension/src/pages/devtools/index.html delete mode 100644 playground/chrome-extension/src/pages/devtools/index.ts delete mode 100644 playground/chrome-extension/src/pages/new-tab/index.html delete mode 100644 playground/chrome-extension/src/pages/new-tab/index.tsx delete mode 100644 playground/chrome-extension/src/pages/new-tab/new-tab.tsx delete mode 100644 playground/chrome-extension/src/pages/options/Options.tsx delete mode 100644 playground/chrome-extension/src/pages/options/index.html delete mode 100644 playground/chrome-extension/src/pages/options/index.tsx delete mode 100644 playground/chrome-extension/src/pages/panel/Panel.tsx delete mode 100644 playground/chrome-extension/src/pages/panel/index.html delete mode 100644 playground/chrome-extension/src/pages/panel/index.tsx delete mode 100644 playground/chrome-extension/src/pages/popup/Popup.tsx delete mode 100644 playground/chrome-extension/src/pages/popup/index.html delete mode 100644 playground/chrome-extension/src/pages/popup/index.tsx delete mode 100644 playground/chrome-extension/src/vite-env.d.ts delete mode 100644 playground/chrome-extension/tsconfig.json delete mode 100644 playground/chrome-extension/vite.config.ts diff --git a/.changeset/afraid-toes-sin.md b/.changeset/afraid-toes-sin.md new file mode 100644 index 0000000000..20fe12183a --- /dev/null +++ b/.changeset/afraid-toes-sin.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-js': patch +'@clerk/clerk-react': patch +--- + +Include **BUILD_DISABLE_RHC** to allow for builds which remove remotely hosted code as it is a requirement for browser extensions. diff --git a/.changeset/tidy-garlics-boil.md b/.changeset/tidy-garlics-boil.md new file mode 100644 index 0000000000..b885d2e860 --- /dev/null +++ b/.changeset/tidy-garlics-boil.md @@ -0,0 +1,5 @@ +--- +'@clerk/chrome-extension': major +--- + +Consume packages with remotely hosted code removed as required by Manifest v3. diff --git a/.changeset/wise-spiders-play.md b/.changeset/wise-spiders-play.md new file mode 100644 index 0000000000..5bef3e6c0f --- /dev/null +++ b/.changeset/wise-spiders-play.md @@ -0,0 +1,48 @@ +--- +'@clerk/chrome-extension': major +--- + +#### Permission Updates (BREAKING) + +The `storage` entry in `host_permissions` is now required for all extensions. +While it's likely that this is already enabled in your extension, this change is to ensure that Clerk can store the necessary data for the extension to function properly. + +**How to Update:** Add the following to your `manifest.json` file: + +```json +{ + "host_permissions": ["storage"] +} +``` + +#### Introducing `syncHost` (BREAKING) + +In an effort to make the handling of sync hosts more deterministic, we have introduced a new parameter `syncHost` to `` + +**How to Update:** Replace `syncSessionWithTab` with `syncHost` in the `` component and set `syncHost` to the host that you intend to synchronize with. + +#### Service Workers `createClerkClient` + +We've introduced a new method `createClerkClient` to handle background tasks in your extension! + +```ts +import { createClerkClient } from '@clerk/chrome-extension/background'; + +// Create a new Clerk instance and get a fresh token for the user +async function getToken() { + const clerk = await createClerkClient({ + publishableKey: process.env.PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY, + }); + return await clerk.session?.getToken(); +} + +// Create a listener to listen for messages from content scripts +// NOTE: A runtime listener cannot be async. +// It must return true, in order to keep the connection open and send a response later. +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + // You can use the token in the listener to perform actions on behalf of the user + // OR send the token back to the content script + getToken().then(token => sendResponse({ token })); + return true; +}); +``` diff --git a/packages/chrome-extension/README.md b/packages/chrome-extension/README.md index c644c68d37..d49dc92618 100644 --- a/packages/chrome-extension/README.md +++ b/packages/chrome-extension/README.md @@ -27,7 +27,7 @@ ## Getting Started -[Clerk](https://clerk.com/?utm_source=github&utm_medium=clerk_chrome_extension) is the easiest way to add authentication and user management to your Chrome Extension. Add sign up, sign in, and profile management to your application in minutes. +[Clerk](https://clerk.com/?utm_source=github&utm_medium=clerk_chrome_extension) is the easiest way to add authentication and user management to your Browser Extension. Add sign up, sign in, and profile management to your application in minutes. ### Prerequisites @@ -35,126 +35,48 @@ - An existing Clerk application. [Create your account for free](https://dashboard.clerk.com/sign-up?utm_source=github&utm_medium=clerk_chrome_extension). - An existing React app (using [Vite](https://crxjs.dev/vite-plugin/) for example) -### Installation - -1. Add `@clerk/chrome-extension` to your project: - - ```shell - npm install @clerk/chrome-extension - ``` - -1. Retrieve the **Publishable key** from your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys) and set it as an environment variable. For example, if you used Vite: - - ```sh - VITE_CLERK_PUBLISHABLE_KEY=pk_test_xxx - ``` - -1. Add `` to your app and define the `routerPush` & `routerReplace` properties. For example, with using `react-router-dom`: - - ```tsx - // App.tsx - import { SignedIn, SignedOut, SignIn, SignUp, ClerkProvider } from '@clerk/chrome-extension'; - import { useNavigate, Routes, Route, MemoryRouter } from 'react-router-dom'; - - function HelloUser() { - return

    Hello user

    ; - } - - const publishableKey = process.env.VITE_CLERK_PUBLISHABLE_KEY || ''; - - function ClerkProviderWithRoutes() { - const navigate = useNavigate(); - - return ( - navigate(to)} - routerReplace={to => navigate(to, { replace: true })} - > - - } - /> - - - - - - - - - } - /> - - - ); - } - - function App() { - return ( - - - - ); - } - - export default App; - ``` - -## Usage - -Example repositories: +### Feature Support -- [Standalone](https://github.com/clerk/clerk-chrome-extension-starter/tree/main): The extension is using its own authentication -- [WebSSO](https://github.com/clerk/clerk-chrome-extension-starter/tree/webapp_sso): The extensions shares authentication with a website in the same browser - -### WebSSO - -If you want to use **WebSSO** (extension shares authentication state with a website in same browser) you'll need to add the `syncSessionWithTab` prop to ``. +Please see the latest extension [authentication support matrix](https://clerk.com/docs/references/chrome-extension/overview?utm_source=github&utm_medium=clerk_chrome_extension) in the Clerk documentation for more information. -#### Extension Manifest (`manifest.json`) +### Usage -You must enable the following permissions in your `manifest.json` file: +1. **Installation:** `npm install @clerk/chrome-extension` +2. **Set a consistent extension key**: A browser extension can be identified by its unique key, in a similar way to how a website can be identified by its domain. You will need to explicitly configure your extension's key or it will change often. If the key changes, it can cause the extension to fail. See the [Configure a Consistent Key](https://clerk.com/docs/references/chrome-extension/configure-consistent-crx-id?utm_source=github&utm_medium=clerk_chrome_extension) guide for more information. +3. **Update Clerk Settings**: Once you've set up a consistent extension key, you'll need to configure your Clerk settings to allow the extension to communicate with your Clerk API. + You can do this by adding the extension key to the list of allowed origins in your Clerk settings. Setting the `allowed_origins` is **required** for both **Development** and **Production** instances. -```json -{ - "permissions": ["cookies", "storage"] -} -``` + ```bash + curl -X PATCH https://api.clerk.com/v1/instance \ + -H "Content-type: application/json" \ + -H "Authorization: Bearer " \ + -d '{"allowed_origins": ["chrome-extension://"]}' + ``` -More info on the "cookies" permission: [Google Developer Cookies Reference](https://developer.chrome.com/docs/extensions/reference/cookies/). -More info on the "storage" permission: [Google Developer Storage Reference](https://developer.chrome.com/docs/extensions/reference/storage/). +4. **Set Environment Variables:** Retrieve the **Publishable key** from your [Clerk dashboard](https://dashboard.clerk.com/last-active?path=api-keys&utm_source=github&utm_medium=clerk_chrome_extension) and set it as an environment variable. -#### Host Permissions + ```sh + # Vite + VITE_CLERK_PUBLISHABLE_KEY=pk_test_xxx + ``` -You must enable the following host permissions in your `manifest.json` file: + ```sh + # Plasmo + PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_xxx + ``` -- **Development:** `"host_permissions": ["http://localhost"]` - - If you're using a domain other than `localhost`, you'll want replace that entry with your domain: `http://` -- **Production:** `"host_permissions": ["https:///"]` - - Your Frontend API URL can be found in [Clerk Dashboard](https://dashboard.clerk.com/last-active?path=api-keys) under the **Show API URLs** option. +5. **Update the extension manifest:** You'll need to update your extension manifest permissions to support Clerk. + 1. [**Base configuration**:](/packages/chrome-extension/docs/manifest.md#base-configuration) Use this if you plan to only use Clerk in the context of the extention. + 2. [**Session sync configuration**:](/packages/chrome-extension/docs/manifest.md#sync-host-configuration) Use this if you plan to share authentication with a website in the same browser. +6. **Add Clerk to your app:** Though not required, we generally suggest using Plasmo for browser extension development. This will enforce common standards across your extension as well as allow for easier integration with other browsers in the future. -For more info on host permissions visit [Google's developer `host_permissions` reference](https://developer.chrome.com/docs/extensions/mv3/declare_permissions/#host-permissions). + 1. [**Via `ClerkProvider`:**](/packages/chrome-extension/docs/clerk-provider.md) This is the general approach to all extensions. From here you'll be able to support extension-only authentication as well as sharing authentication with a website in the same browser. + 2. [**Via service workers**:](/packages/chrome-extension/docs/service-workers.md) If you also require the use of background service workers, this will allow you to access the Clerk client from the extension context. -#### Clerk Settings +## Example repositories -Add your Chrome extension origin to your instance's `allowed_origins` using the [Backend API](https://clerk.com/docs/reference/backend-api): - -```bash -curl -X PATCH https://api.clerk.com/v1/instance \ - -H "Authorization: Bearer sk_secret_key" \ - -H "Content-type: application/json" \ - -d '{"allowed_origins": ["chrome-extension://extension_id_goes_here"]}' -``` - -Setting the `allowed_origins` is **required** for both **Development** and **Production** instances. +- [Standalone](https://github.com/clerk/clerk-chrome-extension-starter/tree/main): The extension is using its own authentication +- [WebSSO](https://github.com/clerk/clerk-chrome-extension-starter/tree/webapp_sso): The extensions shares authentication with a website in the same browser ## Support diff --git a/packages/chrome-extension/docs/clerk-provider.md b/packages/chrome-extension/docs/clerk-provider.md new file mode 100644 index 0000000000..150922e5f1 --- /dev/null +++ b/packages/chrome-extension/docs/clerk-provider.md @@ -0,0 +1,114 @@ +# Clerk Provider Usage + +## Core App + +```tsx +// App.tsx +import { SignedIn, SignedOut, SignInButton, UserButton } from '@clerk/chrome-extension'; + +function App() { + return ( + <> +
    + + + + + + +
    +
    + Please Sign In + Welcome! +
    + + ); +} + +export default App; +``` + +## Provider + +Though not required, we generally suggest using Plasmo for browser extension development. +This will enforce common standards across your extension as well as allow for easier integration with other browsers in the future. + +```tsx +// IndexPopup.tsx +import { ClerkProvider } from '@clerk/chrome-extension'; +import App from './App'; + +const PUBLISHABLE_KEY = process.env.PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY; // REQUIRED +const SYNC_HOST = process.env.PLASMO_PUBLIC_CLERK_SYNC_HOST; // OPTIONAL + +function IndexPopup() { + return ( + + + + ); +} + +export default IndexPopup; +``` + +## Routing + +You can hook into the router of your choice to handle navigation. Here's an example using `react-router-dom`: + +```tsx +import { ClerkProvider } from '@clerk/chrome-extension'; +import { useNavigate, Routes, Route, MemoryRouter } from 'react-router-dom'; +import App from './App'; + +const publishableKey = process.env.VITE_CLERK_PUBLISHABLE_KEY; + +function AppWithRouting() { + const navigate = useNavigate(); + + return ( + + } + /> + + Welcome User! + + + + + } + /> + + ); +} + +function IndexPopupWithRouting() { + const navigate = useNavigate(); + + return ( + + navigate(to)} + routerReplace={to => navigate(to, { replace: true })} + > + + + + ); +} + +export default IndexPopupWithRouting; +``` diff --git a/packages/chrome-extension/docs/manifest.md b/packages/chrome-extension/docs/manifest.md new file mode 100644 index 0000000000..88d83a94a2 --- /dev/null +++ b/packages/chrome-extension/docs/manifest.md @@ -0,0 +1,53 @@ +# Clerk Browser Extension Manifest + +## Base Configuration + +All Browser Extensions require, at minimum, the following configuration: + +### Permissions + +```json +{ + "permissions": ["storage"] +} +``` + +More info on the "storage" permission: [Google Developer Storage Reference](https://developer.chrome.com/docs/extensions/reference/storage/). + +## Sync Host Configuration + +When syncing with a host application, you must enable the following permissions: + +### Permissions + +```json +{ + "permissions": ["cookies", "storage"] +} +``` + +More info on the "cookies" permission: [Google Developer Cookies Reference](https://developer.chrome.com/docs/extensions/reference/cookies/). + +More info on the "storage" permission: [Google Developer Storage Reference](https://developer.chrome.com/docs/extensions/reference/storage/). + +### Host Permissions + +You must enable the following host permissions in your `manifest.json` file. This will allow the extension to communicate with the host application. + +```json +{ + "host_permissions": [ + "http://localhost/*" + "https:///*", + "https://YOUR_CLERK_DEVELOPMENT_FRONTEND_API.clerk.accounts.dev/*", + "https:///*" + ] +} +``` + +**Notes:** + +- Please make sure to include `/*` at the end of each `host_permission`. Feel free to later scope this down, if your usage sees fit. +- The `YOUR_PRODUCTION_APP_DOMAIN` and `YOUR_CLERK_PRODUCTION_FRONTEND_API` are only required when you're ready to go to production. + +Your Frontend API URLs can be found in [Clerk Dashboard](https://dashboard.clerk.com/last-active?path=api-keys) under the **Show API URLs** option. diff --git a/packages/chrome-extension/docs/service-worker.md b/packages/chrome-extension/docs/service-worker.md new file mode 100644 index 0000000000..34512a85b4 --- /dev/null +++ b/packages/chrome-extension/docs/service-worker.md @@ -0,0 +1,27 @@ +### Service Workers (Experimental) + +You can also use service workers in the your extension to handle background tasks. + +```ts +import { createClerkClient } from '@clerk/chrome-extension/background'; + +const PUBLISHABLE_KEY = process.env.PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY; +const SYNC_HOST = process.env.PLASMO_PUBLIC_CLERK_SYNC_HOST; // OPTIONAL + +async function getToken() { + const clerk = await createClerkClient({ + publishableKey: PUBLISHABLE_KEY, + syncHost: SYNC_HOST, // OPTIONAL: Add if you want to sync with a host, similarly to the provider above. + }); + return await clerk.session?.getToken(); +} + +// NOTE: A runtime listener cannot be async. +// It must return true, in order to keep the connection open and send a response later. +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + // You can use the token in the listener to perform actions on behalf of the user + // OR send the token back to the content script + getToken().then(token => sendResponse({ token })); + return true; +}); +``` diff --git a/packages/chrome-extension/src/background/clerk.ts b/packages/chrome-extension/src/background/clerk.ts index dd8c372abb..c77b472265 100644 --- a/packages/chrome-extension/src/background/clerk.ts +++ b/packages/chrome-extension/src/background/clerk.ts @@ -1,20 +1,17 @@ -import { Clerk } from '@clerk/clerk-js'; +import { Clerk } from '@clerk/clerk-js/no-rhc'; -import { createClerkClient, type CreateClerkClientOptions as _CreateClerkClientOptions } from '../internal'; +import { + createClerkClient as _createClerkClient, + type CreateClerkClientOptions as _CreateClerkClientOptions, +} from '../internal'; import { SCOPE } from '../types'; -export type CreateClerkClientOptions = Omit<_CreateClerkClientOptions, 'scope'>; - -export let clerk: Clerk; +Clerk.mountComponentRenderer = undefined; -export async function __unstable__createClerkClient(opts: CreateClerkClientOptions): Promise { - if (clerk) { - return clerk; - } +export type CreateClerkClientOptions = Omit<_CreateClerkClientOptions, 'scope'>; - Clerk.mountComponentRenderer = undefined; - clerk = await createClerkClient({ ...opts, scope: SCOPE.background }); +export async function createClerkClient(opts: CreateClerkClientOptions): Promise { + const clerk = await _createClerkClient({ ...opts, scope: SCOPE.BACKGROUND }); await clerk.load({ standardBrowser: false }); - return clerk; } diff --git a/packages/chrome-extension/src/background/index.ts b/packages/chrome-extension/src/background/index.ts index 1d0d35ea3f..470b8219ac 100644 --- a/packages/chrome-extension/src/background/index.ts +++ b/packages/chrome-extension/src/background/index.ts @@ -1,2 +1,2 @@ export type { StorageCache } from '../internal/utils/storage'; -export { __unstable__createClerkClient } from './clerk'; +export { createClerkClient } from './clerk'; diff --git a/packages/chrome-extension/src/internal/clerk.ts b/packages/chrome-extension/src/internal/clerk.ts index 79a1944bfb..0fe5df00d1 100644 --- a/packages/chrome-extension/src/internal/clerk.ts +++ b/packages/chrome-extension/src/internal/clerk.ts @@ -1,14 +1,15 @@ -import { Clerk } from '@clerk/clerk-js'; +import { Clerk } from '@clerk/clerk-js/no-rhc'; import { DEV_BROWSER_JWT_KEY } from '@clerk/shared/devBrowser'; import { parsePublishableKey } from '@clerk/shared/keys'; import browser from 'webextension-polyfill'; import { SCOPE, type Scope } from '../types'; -import { AUTH_HEADER, CLIENT_JWT_KEY, DEFAULT_LOCAL_HOST_PERMISSION } from './constants'; -import type { GetClientCookieParams } from './utils/cookies'; +import { CLIENT_JWT_KEY, DEFAULT_LOCAL_HOST_PERMISSION } from './constants'; import { assertPublishableKey } from './utils/errors'; import { JWTHandler } from './utils/jwt-handler'; -import { getValidPossibleManifestHosts, validateHostPermissionExistence, validateManifest } from './utils/manifest'; +import { validateManifest } from './utils/manifest'; +import { requestHandler } from './utils/request-handler'; +import { responseHandler } from './utils/response-handler'; import { BrowserStorageCache, type StorageCache } from './utils/storage'; export let clerk: Clerk; @@ -22,19 +23,27 @@ export type CreateClerkClientOptions = { publishableKey: string; scope?: Scope; storageCache?: StorageCache; - syncSessionWithTab?: boolean; + syncHost?: string; }; export async function createClerkClient({ publishableKey, scope, storageCache = BrowserStorageCache, - syncSessionWithTab = false, + syncHost, }: CreateClerkClientOptions): Promise { - if (clerk) { + if (scope === SCOPE.BACKGROUND) { + Clerk.mountComponentRenderer = undefined; + } + + // Don't cache background scripts as it can result in out-of-sync client information. + if (clerk && scope !== SCOPE.BACKGROUND) { return clerk; } + // Sync is enabled if a `syncHost` is provided + const sync = Boolean(syncHost); + // Parse publishableKey and assert it's present/valid, throw if not const key = parsePublishableKey(publishableKey); assertPublishableKey(key); @@ -44,79 +53,26 @@ export async function createClerkClient({ // Will throw if manifest is invalid validateManifest(manifest, { - sync: syncSessionWithTab, - background: scope === SCOPE.background, + background: scope === SCOPE.BACKGROUND, + sync, }); - let jwt: JWTHandler | undefined; + // Set up JWT handler and attempt to get JWT from storage on initialization + const url = syncHost ? syncHost : DEFAULT_LOCAL_HOST_PERMISSION; - if (syncSessionWithTab) { - const hostHint = isProd ? key.frontendApi : DEFAULT_LOCAL_HOST_PERMISSION; - const validHosts = getValidPossibleManifestHosts(manifest); + const jwtOptions = { + frontendApi: key.frontendApi, + name: isProd ? CLIENT_JWT_KEY : DEV_BROWSER_JWT_KEY, + sync, + url, + }; - // Will throw if manifest host_permissions doesn't contain a valid host - validateHostPermissionExistence(validHosts, hostHint); - - // Set up cookie params based on environment - const getClientCookieParams: GetClientCookieParams = isProd - ? { - urls: `https://${key.frontendApi}`, - name: CLIENT_JWT_KEY, - } - : { - urls: validHosts, - name: DEV_BROWSER_JWT_KEY, - }; - - // Set up JWT handler and attempt to get JWT from storage on initialization - jwt = JWTHandler(storageCache, { ...getClientCookieParams, frontendApi: key.frontendApi, sync: true }); - } else { - jwt = JWTHandler(storageCache, { frontendApi: key.frontendApi, sync: false }); - } - - if (!jwt) { - throw new Error('StorageCache could not be initialized.'); // TODO: Update error - } + const jwt = JWTHandler(storageCache, jwtOptions); // Create Clerk instance clerk = new Clerk(publishableKey); - - // Append appropriate query params to all Clerk requests - clerk.__unstable__onBeforeRequest(async requestInit => { - requestInit.credentials = 'omit'; - - const currentJWT = await jwt.get(); - - if (!currentJWT) { - requestInit.url?.searchParams.append('_is_native', '1'); - return; - } - - if (isProd) { - requestInit.url?.searchParams.append('_is_native', '1'); - (requestInit.headers as Headers).set('authorization', `Bearer ${currentJWT}`); - } else { - requestInit.url?.searchParams.append('__clerk_db_jwt', currentJWT); - } - }); - - // Store updated JWT in StorageCache on Clerk responses - clerk.__unstable__onAfterResponse(async (_, response) => { - const authHeaderkey = isProd ? AUTH_HEADER.production : AUTH_HEADER.development; - const authHeader = response?.headers.get(authHeaderkey); - - if (authHeader?.startsWith('Bearer')) { - const newJWT = authHeader.split(' ')[1] || undefined; - - if (newJWT) { - await jwt.set(newJWT); - } else { - await jwt.remove(); - } - } else if (authHeader) { - await jwt.set(authHeader); - } - }); + clerk.__unstable__onAfterResponse(responseHandler(jwt, { isProd })); + clerk.__unstable__onBeforeRequest(requestHandler(jwt, { isProd })); return clerk; } diff --git a/packages/chrome-extension/src/internal/constants.ts b/packages/chrome-extension/src/internal/constants.ts index 51ab30237a..43a9cafec1 100644 --- a/packages/chrome-extension/src/internal/constants.ts +++ b/packages/chrome-extension/src/internal/constants.ts @@ -1,8 +1,8 @@ -export const CLIENT_JWT_KEY = '__client'; -export const STORAGE_KEY_CLIENT_JWT = '__clerk_client_jwt'; -export const VALID_HOST_PERMISSION_REGEX = /(https?:\/\/[\w.-]+)/; -export const DEFAULT_LOCAL_HOST_PERMISSION = 'http://localhost'; export const AUTH_HEADER = { - production: 'Authorization', - development: 'Clerk-Db-Jwt', + PRODUCTION: 'Authorization', + DEVELOPMENT: 'Clerk-Db-Jwt', }; + +export const CLIENT_JWT_KEY = '__client'; +export const DEFAULT_LOCAL_HOST_PERMISSION = 'http://localhost'; +export const STORAGE_KEY_CLIENT_JWT = '__clerk_client_jwt'; diff --git a/packages/chrome-extension/src/internal/utils/__tests__/cookies.test.ts b/packages/chrome-extension/src/internal/utils/__tests__/cookies.test.ts index 3732fbd2ae..1742244ba3 100644 --- a/packages/chrome-extension/src/internal/utils/__tests__/cookies.test.ts +++ b/packages/chrome-extension/src/internal/utils/__tests__/cookies.test.ts @@ -35,71 +35,14 @@ describe('Cookies', () => { } describe('getClientCookie', () => { - describe('Single Host', () => { - test('returns cookie value from browser.cookies if is set for url', async () => { - const url = urls[0]; + test('returns cookie value from browser.cookies if is set for url', async () => { + const url = urls[0]; - getMock.mockResolvedValue(cookie); + getMock.mockResolvedValue(cookie); - expect(await getClientCookie({ urls: url, name })).toBe(cookie); + expect(await getClientCookie({ url, name })).toBe(cookie); - expectMockCalls(getMock, name, [url]); - }); - }); - - describe('Multiple Hosts', () => { - test('with valid urls', async () => { - getMock.mockResolvedValueOnce(cookie).mockResolvedValueOnce(null).mockResolvedValueOnce(null); - - expect(await getClientCookie({ urls, name })).toBe(cookie); - - expectMockCalls(getMock, name, urls); - }); - - test('with invalid urls', async () => { - const urls = ['foo']; - - getMock.mockResolvedValue(null); - expect(await getClientCookie({ urls, name })).toBe(null); - - expectMockCalls(getMock, name, urls); - }); - - test('with single result', async () => { - getMock.mockResolvedValueOnce(cookie).mockResolvedValueOnce(null); - - expect(await getClientCookie({ urls, name })).toBe(cookie); - - expectMockCalls(getMock, name, urls); - }); - - test('with multiple results - should pick first result', async () => { - const cookie2 = createCookie({ name, value: 'result2', domain }); - - getMock.mockResolvedValueOnce(cookie).mockResolvedValueOnce(cookie2); - - expect(await getClientCookie({ urls, name })).toBe(cookie); - - expectMockCalls(getMock, name, urls); - }); - - test('with rejected result', async () => { - const urls = [`https://${domain}`, 'https://foo.com']; - - getMock.mockResolvedValueOnce(cookie).mockRejectedValueOnce(null); - - expect(await getClientCookie({ urls, name })).toBe(cookie); - - expectMockCalls(getMock, name, urls); - }); - - test('with empty result', async () => { - getMock.mockResolvedValueOnce(null).mockRejectedValueOnce(null); - - expect(await getClientCookie({ urls, name })).toBe(null); - - expectMockCalls(getMock, name, urls); - }); + expectMockCalls(getMock, name, [url]); }); }); }); diff --git a/packages/chrome-extension/src/internal/utils/__tests__/manifest.test.ts b/packages/chrome-extension/src/internal/utils/__tests__/manifest.test.ts index 7523e92ff6..4e8ba7ccc5 100644 --- a/packages/chrome-extension/src/internal/utils/__tests__/manifest.test.ts +++ b/packages/chrome-extension/src/internal/utils/__tests__/manifest.test.ts @@ -1,13 +1,7 @@ import type { Manifest } from 'webextension-polyfill'; -import { missingManifestKeyError, missingValidManifestHostPermission } from '../errors'; -import type { ValidatedManifest } from '../manifest'; -import { getValidPossibleManifestHosts, validateHostPermissionExistence, validateManifest } from '../manifest'; - -const validClerkManifest = { - permissions: ['cookies', 'storage'], - host_permissions: ['http://localhost:3000'], -} as ValidatedManifest; +import { missingManifestKeyError } from '../errors'; +import { validateManifest } from '../manifest'; describe('Manifest', () => { describe('validateManifest(manifest)', () => { @@ -94,69 +88,4 @@ describe('Manifest', () => { }); }); }); - - describe('validateHostPermissionExistence(manifest.host_permissions[])', () => { - describe('valid configuration', () => { - const hostHint = 'https://clerk.clerk.com'; - - test('valid', () => { - expect(() => validateHostPermissionExistence(['http://localhost:3000'], hostHint)).not.toThrow(); - }); - - test('invalid', () => { - expect(() => validateHostPermissionExistence([], hostHint)).toThrow( - missingValidManifestHostPermission(hostHint), - ); - }); - }); - }); - - describe('getPossibleManifestHosts(manifest)', () => { - describe('valid configuration', () => { - test('should not throw error', async () => { - expect(() => getValidPossibleManifestHosts(validClerkManifest)).not.toThrow(); - }); - - test('should return localhost', async () => { - expect(() => getValidPossibleManifestHosts(validClerkManifest)).not.toThrow(); - }); - }); - - describe('configurations', () => { - it('should appropriately parse host_permissions', () => { - const host_permissions = [ - '', - 'http://localhost', - 'http://localhost/', - 'http://localhost/*', - 'http://localhost:80/*', - 'http://localhost:*/*', - 'https://*.com/*', - '*://developer.mozilla.org/*', - '*://developer.mozilla.org*', - '*://*.example.org/*', - 'https://developer.mozilla.org/*', - 'ftp://*.example.org/*', - 'https://example.org:80/', - 'https://example.org:*', - 'http://example.org:*', - 'https://example.org:*/*', - ]; - - const manifest = { - permissions: ['cookies', 'storage'], - host_permissions, - } as ValidatedManifest; - - const result = [ - 'http://localhost', - 'https://developer.mozilla.org', - 'https://example.org', - 'http://example.org', - ]; - - expect(getValidPossibleManifestHosts(manifest)).toStrictEqual(result); - }); - }); - }); }); diff --git a/packages/chrome-extension/src/internal/utils/cookies.ts b/packages/chrome-extension/src/internal/utils/cookies.ts index bdf861bf44..87799edea5 100644 --- a/packages/chrome-extension/src/internal/utils/cookies.ts +++ b/packages/chrome-extension/src/internal/utils/cookies.ts @@ -1,34 +1,15 @@ import browser from 'webextension-polyfill'; +export type FormattedUrl = `http${string}`; export type GetClientCookieParams = { - urls: string | string[]; name: string; + url: string; }; -function isSingleHost(urls: string | string[]): urls is string { - return typeof urls === 'string'; +function ensureFormattedUrl(url: string): FormattedUrl { + return url.startsWith('http') ? (url as FormattedUrl) : `https://${url}`; } -function ensureFormattedUrl(url: string): string { - return url.startsWith('http') ? url : `https://${url}`; -} - -export async function getClientCookie({ urls, name }: GetClientCookieParams) { - // Handle single host request - if (isSingleHost(urls)) { - const url = ensureFormattedUrl(urls); - return await browser.cookies.get({ url, name }); - } - - // Handle multi-host request - const cookiePromises = urls.map(url => browser.cookies.get({ url, name })); - const cookieResults = await Promise.allSettled(cookiePromises); - - for (const cookie of cookieResults) { - if (cookie.status === 'fulfilled' && cookie.value) { - return cookie.value; - } - } - - return null; +export async function getClientCookie({ url, name }: GetClientCookieParams) { + return await browser.cookies.get({ name, url: ensureFormattedUrl(url) }); } diff --git a/packages/chrome-extension/src/internal/utils/errors.ts b/packages/chrome-extension/src/internal/utils/errors.ts index 7c758db578..10fd397aaa 100644 --- a/packages/chrome-extension/src/internal/utils/errors.ts +++ b/packages/chrome-extension/src/internal/utils/errors.ts @@ -8,8 +8,6 @@ export const errorLogger = (err: Error) => console.error(err, err.stack); export const errorThrower = buildErrorThrower({ packageName: '@clerk/chrome-extension' }); export const missingManifestKeyError = (key: string) => `Missing \`${key}\` entry in manifest.json`; -export const missingValidManifestHostPermission = (hostHint: string) => - `You're missing a valid host permission. Please add ${hostHint} to \`host_permissions\` in manifest.json.`; export function assertPublishableKey(publishableKey: unknown): asserts publishableKey { if (!publishableKey) { diff --git a/packages/chrome-extension/src/internal/utils/manifest.ts b/packages/chrome-extension/src/internal/utils/manifest.ts index 004b276226..6640f56b68 100644 --- a/packages/chrome-extension/src/internal/utils/manifest.ts +++ b/packages/chrome-extension/src/internal/utils/manifest.ts @@ -2,58 +2,45 @@ import type { SetRequired } from 'type-fest'; import type { Manifest } from 'webextension-polyfill'; import type { ClerkClientExtensionFeatures } from '../../types'; -import { VALID_HOST_PERMISSION_REGEX } from '../constants'; -import { errorThrower, missingManifestKeyError, missingValidManifestHostPermission } from './errors'; +import { errorThrower, missingManifestKeyError } from './errors'; export type ValidatedManifest = SetRequired; +export type ManifestKeys = keyof Manifest.WebExtensionManifest; -export function validateManifest( - manifest: Manifest.WebExtensionManifest, - features: ClerkClientExtensionFeatures, -): asserts manifest is ValidatedManifest { - const hasFeatures = Boolean(features) && Object.keys(features).length > 0; - - if (!manifest.permissions) { - return errorThrower.throw(missingManifestKeyError('permissions')); - } - - if (!manifest.permissions.includes('storage')) { - return errorThrower.throw(missingManifestKeyError('permissions.storage')); - } - - if (!hasFeatures) { - return; - } - - if (features.background && !manifest.background) { - return errorThrower.throw(missingManifestKeyError('background')); - } - - if (features.sync && !manifest.permissions.includes('cookies')) { - return errorThrower.throw(missingManifestKeyError('permissions.cookies')); +function validateRootManifestKey(manifest: Manifest.WebExtensionManifest, key: ManifestKeys): void { + if (!manifest[key]) { + errorThrower.throw(missingManifestKeyError(key)); } +} - if (features.sync && !manifest.host_permissions) { - return errorThrower.throw(missingManifestKeyError('host_permissions')); +function validateManifestPermission(manifest: Manifest.WebExtensionManifest, key: Manifest.Permission): void { + if (!manifest.permissions?.includes(key)) { + errorThrower.throw(missingManifestKeyError(`permissions.${key}`)); } } -export function validateHostPermissionExistence(hostPermissions: string[], hostHint: string): void { - if (!hostPermissions?.length) { - errorThrower.throw(missingValidManifestHostPermission(hostHint)); - } +function hasAdditionalFeatures(features: ClerkClientExtensionFeatures): boolean { + return Boolean(features) && Object.keys(features).length > 0; } -export function getValidPossibleManifestHosts(manifest: ValidatedManifest): string[] { - const uniqueHosts = new Set(); +export function validateManifest( + manifest: Manifest.WebExtensionManifest, + features: ClerkClientExtensionFeatures, +): asserts manifest is ValidatedManifest { + validateRootManifestKey(manifest, 'permissions'); + validateManifestPermission(manifest, 'storage'); - for (const host of manifest.host_permissions) { - const res = host.match(VALID_HOST_PERMISSION_REGEX)?.[1]; + // If no additional features are provided, we can return success early + if (!hasAdditionalFeatures(features)) { + return; + } - if (res) { - uniqueHosts.add(res); - } + if (features.background) { + validateRootManifestKey(manifest, 'background'); } - return [...uniqueHosts]; + if (features.sync) { + validateManifestPermission(manifest, 'cookies'); + validateRootManifestKey(manifest, 'host_permissions'); + } } diff --git a/packages/chrome-extension/src/internal/utils/request-handler.ts b/packages/chrome-extension/src/internal/utils/request-handler.ts new file mode 100644 index 0000000000..0cad4178c4 --- /dev/null +++ b/packages/chrome-extension/src/internal/utils/request-handler.ts @@ -0,0 +1,39 @@ +import type { Clerk } from '@clerk/clerk-js'; + +import { AUTH_HEADER } from '../constants'; +import type { JWTHandler } from './jwt-handler'; + +type Handler = Parameters[0]; +type Req = Parameters[0]; + +/** Append the JWT to the FAPI request */ +export function requestHandler(jwtHandler: JWTHandler, { isProd }: { isProd: boolean }) { + const handler: Handler = async requestInit => { + requestInit.credentials = 'omit'; + + const currentJWT = await jwtHandler.get(); + + if (!currentJWT) { + return; + } + + if (isProd) { + prodHandler(requestInit, currentJWT); + } else { + devHandler(requestInit, currentJWT); + } + }; + + return handler; +} + +/** Append the JWT to the FAPI request, per development instances */ +function devHandler(requestInit: Req, jwt: string) { + requestInit.url?.searchParams.append('__clerk_db_jwt', jwt); +} + +/** Append the JWT to the FAPI request, per production instances */ +function prodHandler(requestInit: Req, jwt: string) { + requestInit.url?.searchParams.append('_is_native', '1'); + (requestInit.headers as Headers).set(AUTH_HEADER.PRODUCTION, `Bearer ${jwt}`); +} diff --git a/packages/chrome-extension/src/internal/utils/response-handler.ts b/packages/chrome-extension/src/internal/utils/response-handler.ts new file mode 100644 index 0000000000..7e872d054b --- /dev/null +++ b/packages/chrome-extension/src/internal/utils/response-handler.ts @@ -0,0 +1,47 @@ +import type { Clerk } from '@clerk/clerk-js'; + +import { AUTH_HEADER } from '../constants'; +import type { JWTHandler } from './jwt-handler'; + +type Handler = Parameters[0]; +type Res = Parameters[1]; + +/** Retrieve the JWT to the FAPI response */ +export function responseHandler(jwtHandler: JWTHandler, { isProd }: { isProd: boolean }) { + const handler: Handler = async (_, response) => { + if (isProd) { + await prodHandler(response, jwtHandler); + } else { + await devHandler(response, jwtHandler); + } + }; + return handler; +} + +/** Retrieve the JWT to the FAPI response, per development instances */ +async function devHandler(response: Res, jwtHandler: JWTHandler) { + const header = response?.headers.get(AUTH_HEADER.DEVELOPMENT); + + if (header) { + await jwtHandler.set(header); + } else { + await jwtHandler.remove(); + } +} + +/** Retrieve the JWT to the FAPI response, per production instances */ +async function prodHandler(response: Res, jwtHandler: JWTHandler) { + const header = response?.headers.get(AUTH_HEADER.PRODUCTION); + + if (header?.startsWith('Bearer')) { + const jwt = header.split(' ')[1] || undefined; + + if (jwt) { + await jwtHandler.set(jwt); + } else { + await jwtHandler.remove(); + } + } else if (header) { + await jwtHandler.set(header); + } +} diff --git a/packages/chrome-extension/src/react/ClerkProvider.tsx b/packages/chrome-extension/src/react/ClerkProvider.tsx index 68426e749a..8127a36d01 100644 --- a/packages/chrome-extension/src/react/ClerkProvider.tsx +++ b/packages/chrome-extension/src/react/ClerkProvider.tsx @@ -1,4 +1,4 @@ -import type { Clerk } from '@clerk/clerk-js'; +import type { Clerk } from '@clerk/clerk-js/no-rhc'; import type { ClerkProviderProps as ClerkReactProviderProps } from '@clerk/clerk-react'; import { ClerkProvider as ClerkReactProvider } from '@clerk/clerk-react'; import React from 'react'; @@ -8,20 +8,20 @@ import type { StorageCache } from '../internal/utils/storage'; type ChromeExtensionClerkProviderProps = ClerkReactProviderProps & { storageCache?: StorageCache; - syncSessionWithTab?: boolean; + syncHost?: string; }; export function ClerkProvider(props: ChromeExtensionClerkProviderProps): JSX.Element | null { - const { children, storageCache, syncSessionWithTab, ...rest } = props; + const { children, storageCache, syncHost, ...rest } = props; const { publishableKey = '' } = props; const [clerkInstance, setClerkInstance] = React.useState(null); React.useEffect(() => { void (async () => { - setClerkInstance(await createClerkClient({ publishableKey, storageCache, syncSessionWithTab })); + setClerkInstance(await createClerkClient({ publishableKey, storageCache, syncHost })); })(); - }, []); // eslint-disable-line react-hooks/exhaustive-deps + }, [publishableKey, storageCache, syncHost]); if (!clerkInstance) { return null; @@ -31,7 +31,7 @@ export function ClerkProvider(props: ChromeExtensionClerkProviderProps): JSX.Ele {children} diff --git a/packages/chrome-extension/src/types.ts b/packages/chrome-extension/src/types.ts index 3dcc5ed179..4dc4c46222 100644 --- a/packages/chrome-extension/src/types.ts +++ b/packages/chrome-extension/src/types.ts @@ -1,5 +1,5 @@ export const SCOPE = { - background: 'background', + BACKGROUND: 'background', } as const; export type Scope = (typeof SCOPE)[keyof typeof SCOPE]; diff --git a/packages/chrome-extension/tsup.config.ts b/packages/chrome-extension/tsup.config.ts index a7f6237ea5..317efbfa3c 100644 --- a/packages/chrome-extension/tsup.config.ts +++ b/packages/chrome-extension/tsup.config.ts @@ -2,7 +2,6 @@ import type { Options } from 'tsup'; import { defineConfig } from 'tsup'; import { runAfterLast } from '../../scripts/utils'; -// @ts-ignore import { name, version } from './package.json'; export default defineConfig(overrideOptions => { @@ -10,16 +9,20 @@ export default defineConfig(overrideOptions => { const shouldPublish = !!overrideOptions.env?.publish; const common: Options = { - entry: ['./src/index.ts', './src/background/index.ts', './src/internal/index.ts', './src/react/index.ts'], + entry: ['./src/index.ts', './src/background/index.ts', './src/react/index.ts'], bundle: true, clean: true, minify: false, sourcemap: true, legacyOutput: true, + treeshake: true, + noExternal: ['@clerk/clerk-react'], + external: ['use-sync-external-store'], define: { PACKAGE_NAME: `"${name}"`, PACKAGE_VERSION: `"${version}"`, __DEV__: `${isWatch}`, + __BUILD_DISABLE_RHC__: 'true', }, }; diff --git a/packages/clerk-js/no-rhc/index.d.ts b/packages/clerk-js/no-rhc/index.d.ts new file mode 100644 index 0000000000..e2e7107776 --- /dev/null +++ b/packages/clerk-js/no-rhc/index.d.ts @@ -0,0 +1,3 @@ +export { Clerk } from '../dist/types/index'; + +export * from '../dist/types/index'; diff --git a/packages/clerk-js/no-rhc/index.js b/packages/clerk-js/no-rhc/index.js new file mode 100644 index 0000000000..f29fe6cfcf --- /dev/null +++ b/packages/clerk-js/no-rhc/index.js @@ -0,0 +1 @@ +module.exports = require('../dist/clerk.no-rhc'); diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 3421a69101..1dbcb32ab4 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -27,7 +27,8 @@ "types": "dist/types/index.d.ts", "files": [ "dist", - "headless" + "headless", + "no-rhc" ], "scripts": { "build": "pnpm build:bundle && pnpm build:declarations", diff --git a/packages/clerk-js/rspack.config.js b/packages/clerk-js/rspack.config.js index 2f17f5cd94..91bddaa091 100644 --- a/packages/clerk-js/rspack.config.js +++ b/packages/clerk-js/rspack.config.js @@ -11,6 +11,7 @@ const isDevelopment = mode => !isProduction(mode); const variants = { clerk: 'clerk', + clerkNoRHC: 'clerk.no-rhc', // Omit Remotely Hosted Code clerkBrowser: 'clerk.browser', clerkHeadless: 'clerk.headless', clerkHeadlessBrowser: 'clerk.headless.browser', @@ -18,6 +19,7 @@ const variants = { const variantToSourceFile = { [variants.clerk]: './src/index.ts', + [variants.clerkNoRHC]: './src/index.ts', [variants.clerkBrowser]: './src/index.browser.ts', [variants.clerkHeadless]: './src/index.headless.ts', [variants.clerkHeadlessBrowser]: './src/index.headless.browser.ts', @@ -27,9 +29,10 @@ const variantToSourceFile = { * * @param {object} config * @param {'development'|'production'} config.mode + * @param {boolean} [config.disableRHC=false] * @returns { import('@rspack/cli').Configuration } */ -const common = ({ mode }) => { +const common = ({ mode, disableRHC = false }) => { return { mode, resolve: { @@ -39,6 +42,7 @@ const common = ({ mode }) => { }, plugins: [ new rspack.DefinePlugin({ + __BUILD_DISABLE_RHC__: JSON.stringify(disableRHC), __DEV__: isDevelopment(mode), __PKG_VERSION__: JSON.stringify(packageJSON.version), __PKG_NAME__: JSON.stringify(packageJSON.name), @@ -400,12 +404,63 @@ const prodConfig = ({ mode, env, analysis }) => { }, }); + const clerkEsmNoRHC = merge( + entryForVariant(variants.clerkNoRHC), + common({ mode, disableRHC: true }), + commonForProd(), + commonForProdBundled(), + { + experiments: { + outputModule: true, + }, + output: { + filename: '[name].mjs', + libraryTarget: 'module', + }, + plugins: [ + // Include the lazy chunks in the bundle as well + // so that the final bundle can be imported and bundled again + // by a different bundler, eg the webpack instance used by react-scripts + new rspack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + ], + optimization: { + splitChunks: false, + }, + }, + ); + + const clerkCjsNoRHC = merge( + entryForVariant(variants.clerkNoRHC), + common({ mode, disableRHC: true }), + commonForProd(), + commonForProdBundled(), + { + output: { + filename: '[name].js', + libraryTarget: 'commonjs', + }, + plugins: [ + // Include the lazy chunks in the bundle as well + // so that the final bundle can be imported and bundled again + // by a different bundler, eg the webpack instance used by react-scripts + new rspack.optimize.LimitChunkCountPlugin({ + maxChunks: 1, + }), + ], + optimization: { + splitChunks: false, + }, + }, + ); + // webpack-bundle-analyzer only supports a single build, use clerkBrowser as that's the default build we serve if (analysis) { return [clerkBrowser]; } - return [clerkBrowser, clerkHeadless, clerkHeadlessBrowser, clerkEsm, clerkCjs]; + return [clerkBrowser, clerkHeadless, clerkHeadlessBrowser, clerkEsm, clerkEsmNoRHC, clerkCjs, clerkCjsNoRHC]; }; /** @@ -478,6 +533,12 @@ const devConfig = ({ mode, env }) => { common({ mode }), commonForDev(), ), + // prettier-ignore + [variants.clerkBrowserNoRHC]: merge( + entryForVariant(variants.clerkBrowserNoRHC), + common({ mode, disableRHC: true }), + commonForDev(), + ), [variants.clerkHeadless]: merge( entryForVariant(variants.clerkHeadless), common({ mode }), diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 21f43e6ee6..516ce741dc 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -109,6 +109,7 @@ import { clerkMissingSignInUrlAsSatellite, clerkOAuthCallbackDidNotCompleteSignInSignUp, clerkRedirectUrlIsMissingScheme, + clerkUnsupportedEnvironmentWarning, } from './errors'; import { eventBus, events } from './events'; import type { FapiClient, FapiRequestCallback } from './fapiClient'; @@ -175,7 +176,7 @@ export class Clerk implements ClerkInterface { // converted to protected environment to support `updateEnvironment` type assertion protected environment?: EnvironmentResource | null; - #publishableKey: string = ''; + #publishableKey = ''; #domain: DomainOrProxyUrl['domain']; #proxyUrl: DomainOrProxyUrl['proxyUrl']; #authService?: AuthCookieService; @@ -263,7 +264,9 @@ export class Clerk implements ClerkInterface { const publishableKey = parsePublishableKey(this.publishableKey); if (!publishableKey) { - return errorThrower.throwInvalidPublishableKeyError({ key: this.publishableKey }); + return errorThrower.throwInvalidPublishableKeyError({ + key: this.publishableKey, + }); } return publishableKey.frontendApi; @@ -557,7 +560,7 @@ export class Clerk implements ClerkInterface { }; public mountSignIn = (node: HTMLDivElement, props?: SignInProps): void => { - if (props && props.__experimental?.newComponents && this.__experimental_ui) { + if (props?.__experimental?.newComponents && this.__experimental_ui) { this.__experimental_ui.mount('SignIn', node, props); } else { this.assertComponentsReady(this.#componentControls); @@ -583,7 +586,7 @@ export class Clerk implements ClerkInterface { }; public mountSignUp = (node: HTMLDivElement, props?: SignUpProps): void => { - if (props && props.__experimental?.newComponents && this.__experimental_ui) { + if (props?.__experimental?.newComponents && this.__experimental_ui) { this.__experimental_ui.mount('SignUp', node, props); } else { this.assertComponentsReady(this.#componentControls); @@ -1325,7 +1328,13 @@ export class Clerk implements ClerkInterface { signUp, verifyEmailPath: params.verifyEmailAddressUrl || - buildURL({ base: displayConfig.signUpUrl, hashPath: '/verify-email-address' }, { stringify: true }), + buildURL( + { + base: displayConfig.signUpUrl, + hashPath: '/verify-email-address', + }, + { stringify: true }, + ), verifyPhonePath: params.verifyPhoneNumberUrl || buildURL({ base: displayConfig.signUpUrl, hashPath: '/verify-phone-number' }, { stringify: true }), @@ -1486,6 +1495,11 @@ export class Clerk implements ClerkInterface { public authenticateWithGoogleOneTap = async ( params: AuthenticateWithGoogleOneTapParams, ): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Google One Tap'); + return this.client!.signIn; // TODO: Remove not null assertion + } + return this.client?.signIn .create({ strategy: 'google_one_tap', @@ -1504,11 +1518,27 @@ export class Clerk implements ClerkInterface { }; public authenticateWithMetamask = async (props: AuthenticateWithMetamaskParams = {}): Promise => { - await this.authenticateWithWeb3({ ...props, strategy: 'web3_metamask_signature' }); + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Metamask'); + return; + } + + await this.authenticateWithWeb3({ + ...props, + strategy: 'web3_metamask_signature', + }); }; public authenticateWithCoinbaseWallet = async (props: AuthenticateWithCoinbaseWalletParams = {}): Promise => { - await this.authenticateWithWeb3({ ...props, strategy: 'web3_coinbase_wallet_signature' }); + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Coinbase Wallet'); + return; + } + + await this.authenticateWithWeb3({ + ...props, + strategy: 'web3_coinbase_wallet_signature', + }); }; public authenticateWithWeb3 = async ({ @@ -1519,6 +1549,11 @@ export class Clerk implements ClerkInterface { strategy, legalAccepted, }: ClerkAuthenticateWithWeb3Params): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Web3'); + return; + } + if (!this.client || !this.environment) { return; } @@ -1532,7 +1567,11 @@ export class Clerk implements ClerkInterface { let signInOrSignUp: SignInResource | SignUpResource; try { - signInOrSignUp = await this.client.signIn.authenticateWithWeb3({ identifier, generateSignature, strategy }); + signInOrSignUp = await this.client.signIn.authenticateWithWeb3({ + identifier, + generateSignature, + strategy, + }); } catch (err) { if (isError(err, ERROR_CODES.FORM_IDENTIFIER_NOT_FOUND)) { signInOrSignUp = await this.client.signUp.authenticateWithWeb3({ @@ -1642,7 +1681,10 @@ export class Clerk implements ClerkInterface { // 2. clerk-js initializes propA with a default value // 3. The customer update propB independently of propA and window.Clerk.updateProps is called // 4. If we don't merge the new props with the current options, propA will be reset to undefined - const props = { ..._props, options: this.#initOptions({ ...this.#options, ..._props.options }) }; + const props = { + ..._props, + options: this.#initOptions({ ...this.#options, ..._props.options }), + }; return this.#componentControls?.ensureMounted().then(controls => controls.updateProps(props)); }; diff --git a/packages/clerk-js/src/core/errors.ts b/packages/clerk-js/src/core/errors.ts index b917db134c..304a1716dd 100644 --- a/packages/clerk-js/src/core/errors.ts +++ b/packages/clerk-js/src/core/errors.ts @@ -1,5 +1,17 @@ const errorPrefix = 'ClerkJS:'; +/** + * Used to log a warning when a Clerk feature is used in an unsupported environment. + * (Development Only) + * + * @param strategy The strategy that is not supported in the current environment. + * @returns void + * @note This is a warning and not an error because the application will still work, but the feature will not be available. + */ +export function clerkUnsupportedEnvironmentWarning(strategy: string) { + console.warn(`${errorPrefix} ${strategy} is not supported in this environment.`); +} + export function clerkNetworkError(url: string, e: Error): never { throw new Error(`${errorPrefix} Network error at "${url}" - ${e}. Please try again.`); } @@ -8,7 +20,7 @@ export function clerkErrorInitFailed(): never { throw new Error(`${errorPrefix} Something went wrong initializing Clerk.`); } -export function clerkErrorDevInitFailed(msg: string = ''): never { +export function clerkErrorDevInitFailed(msg = ''): never { throw new Error(`${errorPrefix} Something went wrong initializing Clerk in development mode.${msg && ` ${msg}`}`); } diff --git a/packages/clerk-js/src/core/resources/SignIn.ts b/packages/clerk-js/src/core/resources/SignIn.ts index 48bfb57ce2..ce9efceead 100644 --- a/packages/clerk-js/src/core/resources/SignIn.ts +++ b/packages/clerk-js/src/core/resources/SignIn.ts @@ -55,6 +55,7 @@ import { clerkInvalidStrategy, clerkMissingOptionError, clerkMissingWebAuthnPublicKeyOptions, + clerkUnsupportedEnvironmentWarning, clerkVerifyEmailAddressCalledBeforeCreate, clerkVerifyPasskeyCalledBeforeCreate, clerkVerifyWeb3WalletCalledBeforeCreate, @@ -237,6 +238,11 @@ export class SignIn extends BaseResource implements SignInResource { }; public authenticateWithWeb3 = async (params: AuthenticateWithWeb3Params): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Web3'); + return this; + } + const { identifier, generateSignature, strategy = 'web3_metamask_signature' } = params || {}; const provider = strategy.replace('web3_', '').replace('_signature', '') as Web3Provider; @@ -283,6 +289,11 @@ export class SignIn extends BaseResource implements SignInResource { }; public authenticateWithMetamask = async (): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Metamask'); + return this; + } + const identifier = await getMetamaskIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -292,6 +303,11 @@ export class SignIn extends BaseResource implements SignInResource { }; public authenticateWithCoinbaseWallet = async (): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Coinbase Wallet'); + return this; + } + const identifier = await getCoinbaseWalletIdentifier(); return this.authenticateWithWeb3({ identifier, diff --git a/packages/clerk-js/src/core/resources/SignUp.ts b/packages/clerk-js/src/core/resources/SignUp.ts index 85b123ca34..be227ce3c8 100644 --- a/packages/clerk-js/src/core/resources/SignUp.ts +++ b/packages/clerk-js/src/core/resources/SignUp.ts @@ -37,6 +37,7 @@ import { normalizeUnsafeMetadata } from '../../utils/resourceParams'; import { clerkInvalidFAPIResponse, clerkMissingOptionError, + clerkUnsupportedEnvironmentWarning, clerkVerifyEmailAddressCalledBeforeCreate, clerkVerifyWeb3WalletCalledBeforeCreate, } from '../errors'; @@ -79,31 +80,41 @@ export class SignUp extends BaseResource implements SignUpResource { create = async (params: SignUpCreateParams): Promise => { const paramsWithCaptcha: Record = params; - const { captchaSiteKey, canUseCaptcha, captchaURL, captchaWidgetType, captchaProvider, captchaPublicKeyInvisible } = - retrieveCaptchaInfo(SignUp.clerk); - if ( - !this.shouldBypassCaptchaForAttempt(params) && - canUseCaptcha && - captchaSiteKey && - captchaURL && - captchaPublicKeyInvisible - ) { - try { - const captchaParams = await getCaptchaToken({ - siteKey: captchaSiteKey, - widgetType: captchaWidgetType, - invisibleSiteKey: captchaPublicKeyInvisible, - scriptUrl: captchaURL, - captchaProvider, - }); - paramsWithCaptcha.captchaToken = captchaParams.captchaToken; - paramsWithCaptcha.captchaWidgetType = captchaParams.captchaWidgetType; - } catch (e) { - if (e.captchaError) { - paramsWithCaptcha.captchaError = e.captchaError; - } else { - throw new ClerkRuntimeError(e.message, { code: 'captcha_unavailable' }); + if (!__BUILD_DISABLE_RHC__) { + const { + captchaSiteKey, + canUseCaptcha, + captchaURL, + captchaWidgetType, + captchaProvider, + captchaPublicKeyInvisible, + } = retrieveCaptchaInfo(SignUp.clerk); + + if ( + !this.shouldBypassCaptchaForAttempt(params) && + canUseCaptcha && + captchaSiteKey && + captchaURL && + captchaPublicKeyInvisible + ) { + try { + const captchaParams = await getCaptchaToken({ + siteKey: captchaSiteKey, + widgetType: captchaWidgetType, + invisibleSiteKey: captchaPublicKeyInvisible, + scriptUrl: captchaURL, + captchaProvider, + }); + + paramsWithCaptcha.captchaToken = captchaParams.captchaToken; + paramsWithCaptcha.captchaWidgetType = captchaParams.captchaWidgetType; + } catch (e) { + if (e.captchaError) { + paramsWithCaptcha.captchaError = e.captchaError; + } else { + throw new ClerkRuntimeError(e.message, { code: 'captcha_unavailable' }); + } } } } @@ -196,6 +207,11 @@ export class SignUp extends BaseResource implements SignUpResource { legalAccepted?: boolean; }, ): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Web3'); + return this; + } + const { generateSignature, identifier, @@ -244,6 +260,11 @@ export class SignUp extends BaseResource implements SignUpResource { legalAccepted?: boolean; }, ): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Metamask'); + return this; + } + const identifier = await getMetamaskIdentifier(); return this.authenticateWithWeb3({ identifier, @@ -259,6 +280,11 @@ export class SignUp extends BaseResource implements SignUpResource { legalAccepted?: boolean; }, ): Promise => { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Coinbase Wallet'); + return this; + } + const identifier = await getCoinbaseWalletIdentifier(); return this.authenticateWithWeb3({ identifier, diff --git a/packages/clerk-js/src/globals.d.ts b/packages/clerk-js/src/globals.d.ts index 26ef5a8a3c..4cd691f52f 100644 --- a/packages/clerk-js/src/globals.d.ts +++ b/packages/clerk-js/src/globals.d.ts @@ -2,6 +2,7 @@ declare global { const __DEV__: boolean; const __PKG_NAME__: string; const __PKG_VERSION__: string; + const __BUILD_DISABLE_RHC__: string; interface Window { __unstable__onBeforeSetActive: () => Promise | void; diff --git a/packages/clerk-js/src/ui/components/GoogleOneTap/one-tap-start.tsx b/packages/clerk-js/src/ui/components/GoogleOneTap/one-tap-start.tsx index 9d612da1e7..a06db08f63 100644 --- a/packages/clerk-js/src/ui/components/GoogleOneTap/one-tap-start.tsx +++ b/packages/clerk-js/src/ui/components/GoogleOneTap/one-tap-start.tsx @@ -1,6 +1,7 @@ import { useClerk, useUser } from '@clerk/shared/react'; import { useEffect, useRef } from 'react'; +import { clerkUnsupportedEnvironmentWarning } from '../../../core/errors'; import type { GISCredentialResponse } from '../../../utils/one-tap'; import { loadGIS } from '../../../utils/one-tap'; import { useEnvironment, useGoogleOneTapContext } from '../../contexts'; @@ -33,7 +34,13 @@ function _OneTapStart(): JSX.Element | null { const shouldLoadGIS = !user?.id && !!environmentClientID; async function initializeGIS() { + if (__BUILD_DISABLE_RHC__) { + clerkUnsupportedEnvironmentWarning('Google Identity Services'); + return undefined; + } + const google = await loadGIS(); + google.accounts.id.initialize({ client_id: environmentClientID!, callback: oneTapCallback, @@ -42,6 +49,7 @@ function _OneTapStart(): JSX.Element | null { auto_select: false, use_fedcm_for_prompt: ctx.fedCmSupport, }); + return google; } diff --git a/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts b/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts index 68058d407c..1c38f5f173 100644 --- a/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts +++ b/packages/clerk-js/src/utils/captcha/getCaptchaToken.ts @@ -1,4 +1,10 @@ import { getTurnstileToken } from './turnstile'; import type { CaptchaOptions } from './types'; -export const getCaptchaToken = (opts: CaptchaOptions) => getTurnstileToken(opts); +export const getCaptchaToken = (opts: CaptchaOptions) => { + if (__BUILD_DISABLE_RHC__) { + return Promise.reject(); + } + + return getTurnstileToken(opts); +}; diff --git a/packages/clerk-js/src/utils/index.ts b/packages/clerk-js/src/utils/index.ts index cdffa71c21..892275e1cd 100644 --- a/packages/clerk-js/src/utils/index.ts +++ b/packages/clerk-js/src/utils/index.ts @@ -1,4 +1,5 @@ export * from './beforeUnloadTracker'; +export * from './completeSignUpFlow'; export * from './componentGuards'; export * from './dynamicParamParser'; export * from './email'; @@ -6,11 +7,13 @@ export * from './encoders'; export * from './errors'; export * from './errorThrower'; export * from './getClerkQueryParam'; -export * from './getClerkQueryParam'; export * from './hex'; export * from './ignoreEventValue'; +export * from './image'; export * from './instance'; export * from './jwt'; +export * from './normalizeRoutingOptions'; +export * from './organization'; export * from './pageLifecycle'; export * from './path'; export * from './props'; @@ -20,9 +23,3 @@ export * from './runtime'; export * from './url'; export * from './web3'; export * from './windowNavigate'; -export * from './componentGuards'; -export * from './queryStateParams'; -export * from './normalizeRoutingOptions'; -export * from './image'; -export * from './completeSignUpFlow'; -export * from './organization'; diff --git a/packages/react/src/globals.d.ts b/packages/react/src/globals.d.ts index 35c1762298..af26a66470 100644 --- a/packages/react/src/globals.d.ts +++ b/packages/react/src/globals.d.ts @@ -5,4 +5,5 @@ declare global { const PACKAGE_VERSION: string; const JS_PACKAGE_VERSION: string; const __DEV__: boolean; + var __BUILD_DISABLE_RHC__: boolean; // eslint-disable-line no-var } diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index 40c865118d..cabf975d4c 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -60,6 +60,10 @@ import type { } from './types'; import { isConstructor } from './utils'; +if (typeof __BUILD_DISABLE_RHC__ === 'undefined') { + globalThis.__BUILD_DISABLE_RHC__ = false; +} + const SDK_METADATA = { name: PACKAGE_NAME, version: PACKAGE_VERSION, @@ -461,7 +465,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } global.Clerk = c; - } else { + } else if (!__BUILD_DISABLE_RHC__) { // Hot-load latest ClerkJS from Clerk CDN if (!global.Clerk) { await loadClerkJsScript({ diff --git a/playground/browser-extension/.env.chrome.example b/playground/browser-extension/.env.chrome.example new file mode 100644 index 0000000000..beb66b4ed1 --- /dev/null +++ b/playground/browser-extension/.env.chrome.example @@ -0,0 +1 @@ +CRX_PUBLIC_KEY= diff --git a/playground/browser-extension/.env.development.example b/playground/browser-extension/.env.development.example new file mode 100644 index 0000000000..267a1b46ca --- /dev/null +++ b/playground/browser-extension/.env.development.example @@ -0,0 +1,2 @@ +PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_***** +CLERK_FRONTEND_API=https://*****.clerk.accounts.dev diff --git a/playground/browser-extension/.gitignore b/playground/browser-extension/.gitignore new file mode 100644 index 0000000000..3d462e4c95 --- /dev/null +++ b/playground/browser-extension/.gitignore @@ -0,0 +1,5 @@ +.plasmo +.env +.env.* +!.env.example +!.env.*.example diff --git a/playground/browser-extension/README.md b/playground/browser-extension/README.md new file mode 100644 index 0000000000..278c4a6cd5 --- /dev/null +++ b/playground/browser-extension/README.md @@ -0,0 +1,68 @@ +## Running the Playground + +Standard: +```bash +pnpm dev +``` + +On changes to upstream monorepo packages: + +```bash +pnpm update @clerk/chrome-extension && pnpm dev +``` + +## Introduction + +Clerk is a developer-first authentication and user management solution. It provides pre-built React components and hooks for sign-in, sign-up, user profile, and organization management. Clerk is designed to be easy to use and customize, and can be dropped into any Chrome Extension application. + +After following the quickstart you'll have learned how to: + +- Scaffold a new application using the Plasmo framework +- Install `@clerk/chrome-extension` +- Set your environment variables +- Add `` to your application +- Create a header with Clerk components for users to sign in and out +- Configure a consistent CRX key +- Load your Chrome Extension into your Chromium-based browser +- Test your Chrome Extension + +## Running the template + +```bash +git clone https://github.com/clerkinc/clerk-chrome-extension-quickstart +``` + +To run the example locally, you need to: + +1. Sign up for a Clerk account at [https://clerk.com](https://dashboard.clerk.com/sign-up?utm_source=readme&utm_medium=owned&utm_campaign=chrome-extension&utm_content=10-24-2023&utm_term=clerk-chrome-extension-quickstart). + +2. Go to the [Clerk dashboard](https://dashboard.clerk.com?utm_source=readme&utm_medium=owned&utm_campaign=chrome-extension&utm_content=10-24-2023&utm_term=clerk-chrome-extension-quickstart) and create an application. + +3. Set the required Clerk environment variables as shown in [the example `.env.development` file](./.env.development.example). + +4. Create a [consistent CRX ID](https://clerk.com/docs/references/chrome-extension/configure-consistent-key) for your extension. + +5. Set the public key are shown in [the example `.env.chrome` file](./.env.chrome.example). + +5. `pnpm install` the required dependencies. + +6. `pnpm dev` to launch the development server. + +## Learn more + +To learn more about Clerk and Chrome Extensions, check out the following resources: + +- [Quickstart: Get started with Chrome Extensions and Clerk](https://clerk.com/docs/quickstarts/chrome-extension?utm_source=readme&utm_medium=owned&utm_campaign=chrome-extension&utm_content=10-24-2023&utm_term=clerk-chrome-extension-quickstart) + +- [Clerk Documentation](https://clerk.com/docs?utm_source=readme&utm_medium=owned&utm_campaign=chrome-extension&utm_content=10-24-2023&utm_term=clerk-chrome-extension-quickstart) +- [Chrome Extensions](https://developer.chrome.com/docs/extensions) + +## Found an issue or want to leave feedback + +Feel free to create a support thread on our [Discord](https://clerk.com/discord). Our support team will be happy to assist you in the `#support` channel. + +## Connect with us + +You can discuss ideas, ask questions, and meet others from the community in our [Discord](https://discord.com/invite/b5rXHjAg7A). + +If you prefer, you can also find support through our [Twitter](https://twitter.com/ClerkDev), or you can [email](mailto:support@clerk.dev) us! diff --git a/playground/browser-extension/assets/icon.png b/playground/browser-extension/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..df3eaad5939e903789c09285a98dc3ced1a54e46 GIT binary patch literal 14295 zcmaKTbyyYAxAvT%yHir>lvdyzy1Tn11Ox^tX_pfjLv1YyRUbFU|*=x-+&z?Qc4fQq1h?$8203g%SR5bl2w^ve zzKYue002od)HPMRfg~g(5D0{jknqNa!{G!31UK-%H0=M%4ZIO36pDw3ccX9Qzu+9>QtE=PVD=RBgQ&Tr?H+J^J>Bskm;>^dBY$wv3CZi3)5eJ5N0`9e?3I{oL|Lh{|ZN(nzB9M2h`Hg2j(0gRxY{$tQ}#;Tqo}b-u@% zjK>&{#asM9>wgbIj$}NT3Pg+qC=4gsOk}xDKh^veV>FiPFd3>kiq`w?FF%~+J{_ty z`c&&%hRf9EF8Iu3JVN{X@hKRY1-0oo^t=SgM{%0gglP}TwSCVgsp3ARCAJv@PmLno9LU7+Wm?1aA`TvS+ z_9Jt(mp^&*OwI-MOuIhlg+5OpJ3+Q z9RBiJ!o^?92Z=;$SxlixL~EJ<4yb6x{w94aA>uRoyreyv+l#GBX)`?t6XVmm1NJG1 zxon!w|NZC47kRP2N|{%wC(vaoPjqIHpuztW?f#sqJCTs>TH95&K5CZFc|XkyQ(zpO zez0mJnrW@v6N4t0HSRT1_Y*n<&rZ$h7Vih_ie_r~tyvJJfxApyJFK^Yy!5gt>-(TjPj`b(1g-;V z93i-ilEZj$2tBqLltYQ#5Ig@NByWgDRCwd-xgj-6bR~`=$U8X2HX842ZDDH*PX3nk zD^&gn)o9YTN9hQuzijG!pDP{+m;V2MnO99Ty{b`ZD!!KfUD|E_c6@ zWPs-gpQd$r3&bd?>=0_@(}jU1MC1Is?J!;&p8kOa^0xyd5QR5+-HkT`pTH4UT?&@& z_)=6|7W^0e8ybj`DBWp5cXUHH{?q&mzKL`D@3ZI(PyZ*x{{l~EBx2^Lofs3O364b? zbGyL${7&-zgj;G^*rtV|8pj)8b;mfrV;vzvQu%0G7E+JlnkP#`ZFf}2sXU2q|47k_bx!$ zKcjRQ{59-Oqi>BYZI@uerKXC|h?VZ*6Lj*OF%ng)_hoZ4&*}yGc!c)skBr_1HR((d zodx19O_(c!l)T>a(Liq3ZTl_yDEBScjYehiP~QXB7*66se5L}vF< z5@3h(rJeGJt{qB$p3D4w^Xl0HX)e$&=?#U1wDn)h7dyA(A2`?Go2@q@_&ZF~6MsWK zeM6vAe(>fIDoN-II&|f|SS41k%CItgBOPIlKN22kVx(O!b1u2NyG zyKh^bhmswHdcNpS3zT`>;2(_S#WkeYudnX7R+5(UTZm6%dy6v*V;#Kxd_AUDGw4?C zf#hpn5X7_G2l%Ws9go%7YpBxdo%N!3NuB7;^%h&#Xxm};_TxRA$)%_u(=)9GOFu$Y zltw&BRirI>HF8wvYKP!YmOy}P4%>GCv?eMR8E%$;0>GQn4aDB*jzK=p(#_tY9unfF25&2Sffeo!pEBM*5(HDX%nw@4@$lsqt4jwa22IJ+1N^D&5hHstLw?&*Wby29_EQ&~ZlanZETUqc@)H_fVX}{r&CL zU}g8UovCo7{Z!pn!W~s)bFp_nyd>jC35uL%Q~x`<{TTIJvWfg!aT30bmet9zB;~~4 z@A&(%@4m})*ucF61}0W??jU#~@*OR=FB)}19aL{opl;PHWzX$yJsmc7LRWOh+_@qI zpVs=@&K7ANJIcWI-ioIV{o0qdUnA6~mxQNI2IWg0UGx3*MuL2D3+4Ck!K7FF7F6V4 zbg5WiUe25xHb2%f%;IH_<~6krx&F+od(qBn4-dg^8eslr+fc7fz>i&DC( zD{D3Q9RBpT>A;oy$L4?E%6|LZsmN?v`H&nh2~(+HNzEJPubQx_a;?U}z2DB~g8@$t z%BwTZg2%~U{k}Eo`N-H@^{jtZgguJoP9|^k+O6GZriq^`k>z z-23cfJ(dq1V%LSE8EiT@lgZ52_@E{)>=y^)U8hAI@Yh-ffKXbM@Al>;XpI8FR+R$1 zl+O-+5$x`SoAW|?R?PGLs_x}~J`1o|WH@mfQ6SP}3N0(89`Ga=KMM__X2UA6D_s-K zShmyEoWn3zc+(a;hA*9|W-^a8t~ zCf@rD*u9&t{m)%lN5DK0z{mpGuc7q5s%85WQqFp(yS!!w9++jGkXJmAz}XJM34sbt zyW(bzbqkH|{^+6!qM1BhbH(bex^sXMwSZC8!xWDuBFQH|h%RmT%P%uTaRl=;d3B@- z|C1{G*tSkbjquJ-@G`)h@G1aVgFYsl`vk`I{)v@_Pva~Z#QfEfxh0$E&`ZoAt30^@E>Pb;RG#ZA z^WlzB!LsfWr`pSbz7GV^7l+>$L<GEugOw$xFtyG*H3MkAF{{7Ge9{I*Vk_*VcWVQ8pQ~FV8A#usE!HHIH?J>bfJo@ zgbH%reo}w$l$*k2KCB?TH$o%f@}BOiF86B^z1P$&Z*{p#)bACQCGrUz`4%ugGEf|( z%JY`WzNl<_kupgcXeF_gaXCdNJZLIao2`}n`+$S6D&D!dcsrvlIE3*uL)N{)P-$YhxvHPRfcMr(Tj>I zLKJ{M9W5R%r&>z7_=zxApHoj`bwWn(Sx~MblqcW}`V{q6sc7$m#VWJEkX)I+MU(oU z!S`@olKOX)lp-&=iuCuRDX5b28)wVZYZXG=gh;2)&yVEiKUOFg=pX>WDF<{Vk9KW8 ztziyn4xQsDW6Fs5Xv-9rd8~=v_HCVhDh`;pflE*mRQ8kPIvweqr+-HG$69R&CJtj_ z4rBO_)kfK4ScaJ)D~Ql})Ac8MV^d#3tea`i-aqPNyz3@z{K2o6C_dh`rOEKU)hlXV zZXB)sIVI+LgaRoANR&bE3JodAqv)^?oz<9?>V_+n?++_L_I)o~swd2(MZR#5KvVJc zdS~BNxyWa6hZRh6@r7H^D&%Avkr&Yv+M*tm0tA>#Z$m%)M?HN^XeG02{!DMDi{_QhNwv19B@g|O(tJB@ zj2NZYjLsSJ!h=M|8n_aJh;XMr(afSVO%T={Bg_byf?;2z|43+(%fT+bY?N1CO??9C zBaj9(@R(S&sWSN@;JVL3;u`K*7B}dMJnA1#80d@j{`wR@1TK^Yvf^X%JvO=A%AT|# zQ;d+>FNAnxsVU;A7kjuz;GF@A6BIdXa=H})FEA4qyj%;fTSr5-g%+vBz#+)qpThgE zEur$Q!q*U3^x+gM(@UOTSCBV6>SG4R3hP{VEhGYS6D0$7iR+^|FJOYC=5Z)nNtbe} z#yT291wemT{f?tuZ=>Z^rcXQXlB<$}eAs}qPrd~=t(z;{-`4T(T7_v82XDj31aMI~GlJ_p0fx;!Yjtg&T zx6YzMXSLp3E7l25kwoAYx2&RKs`88_9g1j6WE+_O*g7@2R_2lQhgjP(Y9?DQ5%;@={`L`SPv*eG>o;#WX^SVOa zE8@3K-Am6S0ipesXih_kiu;Vp)335JtI@T-*_3?Rs)Pwfw@1?ld*4{3PN@$ytmih< zEkqgY2)p9L!6E^iud1Svz+J?vDSok&MUz>@+<>_90$Q_{0cOi*^M)=j`IA)yYfs{A zey9%??~4u?6uh%`*n<0k7Lm~Uj90v^&+jqImoEOGt{!F^IItCqjpHKhQ5*GJ95JI~ zv{bVrdg%8V=G!>1$i$g3B@+8~*sVE;9s%VMoI=66sN6BTf2}JHphQ{rM=En}t!|o~ zVt!iCRF#W+8uw&EDC`abx_>-;M`_Mv-!7(bp{2;i!!T+YQN-;S#mlkw69uiOyZUTw z=amy;N4)x*^nrDmT$P0BZlWu}`x=QyBrc!nnVetNI8O?@_HU31rZ~m~5fb%C^xpS? z3xN`21lS&TsjG!Ee`#mE$BXJTt&XRZNpI(*U0_qi`+>{CFoy0ralg!{^vi9Pkwp6B zgfJz)D>8Xfow@RU6rMK$_@x-wYxoG6P91K+w@Y0`vnmanF!&Oy4Zf0k@PNiGOzMfn zXP+0!-Ujx!c@pE|Eo7}!Q^)w<)EW2|yqgPYY@@9YDwhr9Ehz{%P@H7HIpHherR0dm|)*|wvNXQA8@#uN}ie^Ah`#uIE2D%$<}T6 zyCVN~=pE9zbh&vp$E~JQTTeRvTavOIo{*QA4vShbIdI*0p$jR1x9JKyP*CvGsGt((^un zS08i-i@cK$!k!rf zhazpwt>k@1KG)*@;jaU){FtoV0JG3h; zZzRbP(Rp%u`g$^X>SO~JNg%QU$k$!KLmZBTE+-$mEs>;dnJdTXaGHp}4H2M>Fqcm| zeEDW8$>PjX!hD%n&x~CCfms=EKsuS4@1YDK8LEU>w1}TEf zbykV=2jCBvn*B;ie2Ao77Abu4#+HdYDHC1`naA9ljn(OTZ;goSbw_G&vR=nyr~952 zqKQEKw(dX4KW&^&gv^l)({DF*)jl5dCBjKI2Bne{AT>l!w5Rb#h^&N|TKoI(_Sa73}Ds?#iBDBhy!w)b!BM zf_*|FW;Po7J!u{T30Lb^;wB+k zhV5!CGmJ_1yRbb5-(ldui?ukq+FBkP`H1_rw0pqOsn?A9QB(&3vC@ zk`qR0%wBMHWR$CUrxro-xt(~<*vc;dVmc-}_MV8eqv@RL3?UG0_f_oMmnjiB9$2A{y=kq5lHmHS~Y&ehyuyqEwdx7t=sS*=FuT+bdJH*Tq2 z@<&4bb#pILMro+)pVz^EFSQ>^8t>{KC^-H*|8`|zkAaFkJZJSQwh2EvsIzH!{T8b% zG;S(*98wNrsCJ)fF?D4MY}1}@^%0LhCj7c)hrORg7Qs4yO)mB*lrW?d?sLzX)*K;f zrc2h+ot&FW9I`Q+SQ#ghx%?J*3lV-+=WMIil!u3?%n0+P)5@{HSRljqQcSqV|MOvFQu7)YWBVQOlTQ89 z-Ja953C#%cqAMaAbTB%n5|h*~B4S13rMK|0dP|`~vqV)-Pd+6pM_jk(6S{g!q(wJ_ zN|q{v>%j5OxA(CO3V#~jWQ5_-aJV5sVdSuAFFQG!ZXo}S{*PKIofg7-Z^P@Abao7^ zjO(ggynDs^txH$`(R+v!w44@aoFEmkZ~ zsZ8%X6OP1ro%KE0oDN)4O4g+!wczg3{_W;j2$Y0EkAA_Hm>fIi?m||&9o~)JW9Q); z8? zk)w&mj+9E*?)E!y|3K<(u&Rz9boo>?CHJ~YU7=4R$w#i_Akro=D@p;O&BR4*-lszv$d1LCr^sSB}-Pz-110RhKt$>H@UW*gifurSuNao$N{ch5)!j6B{ z>VR9Vz%~sqKyNr)>4bl~Kk*3NS>P<~$ta<2r$EY|^r7+Y_)JZV9r@DT4q$yfR&5sV z*GQ4Co#rh`U0@z&k5wrBWf7HiLIgzZWkO~4pMW)=YNJZ63FOzFC&Wbad8rlT^Z!F# zkoFSyZ?x18zE>UQiYM@QVm3#Q))%0&zYvQ(Dg;i+rh~Emf^UnOhu@pCHBvR*Q6+t( zTHpea(&1X2ahI~qlstbXVgKHxY{F1Ob4|**G?l6@{$a8_q>X6pOmEEd5WbgUo@cg4 zzX?!LKV-gbHrXhYUf5}E^Tk!IKB(D8kGYq;J=c|w*+R%gQGMxg;oo-~?>m>|QzprD z(L`tNffov5yqF7?hn*ry=9sBZne_Hy^h0FXoqoAZjt{$BFT=X;m_Al#5SU=`a?0B# zn=#kwf&Fu_gp*6E>be{|>7vPS0#%zTn6TkhV0B8*l3TWiHB6ov@MK~ux^MX+g6Q^0 zxrTdw-(BlN34=xxR91Px{kT}t*M{q>~_uEHx;yM!J-n)P5_X@p3FJOGFu=75UY1EpI>*x-;4H)F>5KF*sKn=wr z1G4)!hDWE&^w2)+FhA(l8~jhYrW^K;4-N!dJYAxm(S;UU`e(GuM z%0~6!%VLar&aktioy$treO^LCQv<^R-v_K?pW=v0S22p==+(arJtn$n8Iu^cS|c@U zAtD5I%=VtP@Mll!sb_h}2uORpDS`B>f7RBpyw$-|ON(|Sq7`FALJ7S+z+3Jb!Xrbf zZn<;0lquYWGt`k`W}D#EHVrn)%9F>E$5Nu+r+=~YyK&I2ziz1!0nHY7>$jZjAe|%$@+l+1T?x8^M=@MaJK5j7>uBGhfOhBt3s6N}vJQi=Y}I6#>%J(1 z8;R6qK5tY1mhru)f9TY!PdwpPiaZ9CE^cZ-#*^sAN0eQh1BpTs^D?YGV*N^s(eXDA z<5l>~+R?MdZqh%t;9aS;R~Fvl$Nt-KA09IZlDy^|7Eh2eBCuVGD>He{G%rT`9jLE& zjh1i^gY|PdL!U#T28=>OQ(AXL5;oaYqjD?8=j?US4EObb2+Fqh_G>H8j0?MHy5)`b zgnwlME&p<~6XUg|t!i0Xq?%Z~33H#q^GXFH!iy>Y zC5#cooUB%>S@b^lCK6)m4ZuF4*R1J@GSw?gD)p>L_w7@oxqrwvJImxx_9D<07qCQ3u{6}CP}TFb~m?rlTNizkRFX|OSq zW$kle;{)2Wd`eTrp;pZ*joGzkOp5-q0|)xUB&OW$uQGsKU+2`J^|VU4LiMOggIDsZ z1C=5Z9(Dzfq1XU)a>HtF)MnH5WSI`tvA>VxO45ax8;ea$_8r~ZWzQ@dnkBtkCErC= zMUe>mMdtFmm0=4ttW;C9TlRM!(`~eS^bEflzu@A*G%vI&U8rGc1u@5yw_itE|J~s8 zD%+|MRxl9#Iw|||sUIJt!cS$HY2*O=V*8f&AUWo55yk$fF|FtA^*yofL&0)*k)r@%OVs3e1EnV;@IgG`dx2rHv!nPua-G^k$)9m2ly}mz*&v!$&&C zIgGiGW7-EYsD4@*J{D^mV65tMO)3}vaV=@hK61e3IDujs`xk&F+lJJC%C>&8{!cEI zk@jkfN`ugwyE@>Q+~2k!0Cm~%1KDxKx2M*4 zyoM@=#}!Ok@Kj80+q~g>r{BUHzq6zk91_A{M!#D;IuR0Ku7_4cF_taBM%?bF6rhLC znpG?ZCw$qut_AXM6^$u9apjdTlz${lFn3GG2FkFTu;XOS{5S<2G64B{o1);0F>Ttn z)SdqG*N2k!KcyfY*X&dmcRhxP8cXJm4))kKwdP`%^`+(d0~_}H`2LI;4b$&U-O@v+_|RZb%xzr}kK8v?Cd=ih z3ha@=4T+&&{(Q*~7G4MlH8njqW|_zkX`n`oO<;`Dr}`jLn(pXXZWYE1zfxDn&vF87 z!}q0y0U2lLns47dec%x^sO68gUWY7gD7D6wikC!>R#4ZaK%Qsb`$ycypA$-@n4+kT zUwc>sQda)u&-LAnp6Y1K?)5?uU5RKFW`{Fr`vb|lMEcC8S~#q&uxRP4|FK7g;C z{_GK)fp3UAZif9;z%GsGZS|-0QSOVd%=!Py>c^9~WeJ<;goD43ufqIP1*yyNjsNc~^_E&Zdy8i>fP zSK-x4AH8huM-r~J5glnnH5ILdBRd`puM8BYaKQZC-J#xp7H!$Av-D=%45Nr zZTzhF(A3cEf<@9mcy2+U7#fa4+^qayrspC(CqtuJ(DKSW%toVL(<2?|AEBY~-F9RP z&^_|8-2jfm21UXdE1Pg`DNn`8X3~*z)$dWP3T5MRcWvr$G<%9RrzS~0LOdAHTm*Sb zBM~1vY`RPPZJ69xh6khQgj1{>>vlKcUyt89dKawWnAxCfFLdexfsa4b*5GYe6^}^E z6n*Cb!r2v~F6NjTX-@}GTMn8okHf`&AV;DJ1dV-*Eo7Qu7+7KlW;n@; z1@GDolePNuvS-7R6ozKAwhi;0cu-F-&t7skrQ zNcpIASe{ZEe_(Ofm*qDT0GHi{jPl4(NaAZQqE_=|VI$m-7jOVYnJT@f3FKbaREZ<; z!EGKY^fJBbAilj31NJ>{)DI?(nC^ulVsr=rn&S3jKR-wmkgQeefls*D?Jt6D5CGDF zE7{Uu$hY6CztGW49I@b>8bs3#Nr|+D^pbE{5~&kaF?#hl|EDErb&WJ{|08CeqCYTR zNeNoRQeyY)E|L(1B7ty-;t@bS_>lPoefS-tbE_85Nz;2#W>kn3|Gt5083`rquaP^gl5qF$(1n zNS?j}`5xy5kg;ekA-Nzlf5a>aVW0O<31{4}F$SQM_d?2!IEWNmL`dHQXk7^g&qJL^ z(%%t`bdldW!;Hc69wQ;7lzk|v^?hC&^dTw903%*QCXXX2BMT~CN{k88d=FSc-Xk1Y zc}OFMpB!^@u>`VT@8ks$AZd`ylV6nj(MBcU1U}^+SeJ^xaY@e*GsD!U!7M_KzXcrf zL`X(7kE5a^>D5iWAms4A%|QKwls%x1=!Y21v#+EfQG^`Sj;vSfwPli2()h{IVEI>e zG9cd3MU3Oz&(RYm;DW{-mTaLr@G*o@at%aI^l%tYKVWy|1T4WZ34mp#l4k64DoK2g zO+*knNlpqFLtRIctOY~AN@5sGQ@eGj0d*KQExHlX_a7n!!Gj4Q9Pt3^RArqow9iZB zl!R|$#p65LLdOop@(HXM40k}3G*EblV*#IoqC*X2g6klWE2kPqTWSKL=JMlJLb6LtU!a1)XdN@Jd)TX28RcS*75as((v zNa;;+(f0#-*S>LQhbYS7v{)N_tg6^NVLpZ7Hi#*40-mLCFy6e*uY=sUC&2RG?`g1a zCipW#rAr_s07dl^Yc`VP;U`aml|;C4pjaG={3POMcMtaBihb`ZenOgJ2{1#-(}Xk; zf*tKS7+$$RuMlF`89cvRjY9d54O{~W8f=H4@e9>>HR)CU-9^%ZgM(M>1V~#zY|ml> zT~>q@J*f9+eZ+{b2oIDO%4-db{JkoRpyddhmwebr!ES6NYx91qeEJP-M0Y8T8e1Ce zB90r^2gw}fM32K$I3|x1nAAKzHG1xGu7akT&q0f)>0@m$|6i;-KcSodJ_FHUWdUdd z5gY!(itsMm9w;4z(GLMWI0_iX44|gQeIy--V`{Wd))A_~xtjwsSG#=xlpwDT!2W^> z!E)XZH(fb=I&;Y5ceMISq1AY8Tq^ZkScht988rrOUFUKF=WrzHnGa*5n3=54^=>g@ zqubX0s$>k-B^(X0y=LDBH(AgV_K!!Bm1t}Q-GT4mA;JDa9O@O^;}9^7spn~%E+G1G z(Om`JW<>H(nLm@MIYw(7gZ^>{yNobavo^_>rArnZVK@R%V-^LzDM4M5A}JbwFD~TQ zDwW}EPAc0kf>$*Fpi z8s-x9r-C~`$SN*L7*u}g_@^5GgMNz9vBME6(YEaBelbBEYe}iLUium+NHY#roMvPRE4=;_U+e3IUyO!m2(1E8 zb*+kYzCZ-xta9G4fn<=mL8A^fU@Kpk%s1ml_udu71`3Y?>FdTPNF40{M8z-3q$CPu z#u~fZJqy0MgNuQr8l?9DK?*aUi9uP^0+{Uy?$YDSvg`U4mJvez8&H+t&r9g!27;O% zLv;X%;#0~iV|L6oHWAWbK?vw>O!MRjh|?gHRews5Z$gJRap6$BJ_xF>;zb@v_N>u* zluhAGE*4BUeL<4v5CjHLmLeq9ypJ2hS%ibGJE(;F_qRNv>vYGAk(2ur3*f2)wIbS2 zDGl;{gb|p`WvX_V{~P>$;S_v&4fR9!0b5kgzUe^Fs=>3UmClATu4VA+wFCbM*qcb{ zK!?Ba^S;~|YmnIk-7S!^9Zcy#({=WKCZkr=UyTbnt)$8WKjU)CSGrfe0$n;IU%M1_ zGqAh=Y%NGhS8ggHb_;Zei33xP7=G=(^=rR}aj9LQ3f;Sc%va#Tk3ukYiE60+1pQ9< z?$fP}ix7F+$BJy56ZKr&^Po;B&c#QHF(|*R`@h7dDu* zwF|J)O>hkA2416HvyE+%3AiAUpw3fVz{=L%p4)m#zlGz~6$u^={O*%!t=W$a_|sg$eTX{YR-f&}3fWE~`Em{3KtFI&oc()QuzFKs*Ow zb5u2LVC^m<=;V5p9upp|FaS$D2k)<)gLfcDT9AJWC~ffcA`%FTe)SKsb6Qdbs&s=p zH0j8-g0k#W_Dk@3Rl#q8HG<-?^jasVw(oEN3Z7}u5(XPIe#WUh1)K0_1+fmumyWD& z0C4Nl;2~%aoq{^4M;%;tN3`GU)$ZgzqW%#a^B%O>e86Xdlnn)T!NltYNoGwtN@t$6 z8AL63`4k-f$-un_+4=Riq_Tc7=@_MWv5#|!!8Ux$nTC!ZO!5nnH=_Q4ECbgi`7F>Z zi+Q@0rXD`UK*A)2EihOKG+05&9K-tYJ|KDN#2nsTh#s9T{QB~Sgqnv=UPS*l#{0_! z;yw7d71-O^YhDhI@{mFVLWaqCCCIAhH@RgE0 z$H>1rq`1P>Zh?O+$elH+d% z@*~es(;(B)IRpExR}Xt^F`CHg{vu?jQQ{UN06f1=>*@xV*q19Y3 zYRd4kz88fQHdm%*!zl?x^dFWwO%lOt5+xh3>9zd<*;{s*2UZa9?|XE0>@# zjz<0nR?$KcvO;V~H2vjjtik^ZF>xmP0W}LA#Fp7Py@=6gM2cWbBC~K*V7E7p9Ulb_ zyCX1l&m(38xmsupYgK-$E#5OC{?nZdY8+lyj-ami0VCjF=|6aB)B~&5{TP%fcz)oE z-UTHg^*~+XfhtnP)yL6}E$`0hl3aI!&W7q<5vQaDn;suc~VTDeHw47<3_ey3h%gQElV^@Y3O>K$TAf9U(m^0e^z>5yt-(Nw6U&}`m?a-3@S&h_kyXbC7q zBt*!_j+Kp~y$u<{S5L>dGUY7{O*B9*ZsFL!;8^fz#fmu?Zu6#R$NIrulVT?+3m>Pj zr6sbq8bq;ovGfRt3w7JkAQ< zW)n;g8+PBc*ss0V%s0UCDjURpy&WRi!U=0!qvXS1QBh#rHt8mh+@QXeFvZXZIPx*v2@<#?xD3wUyGMvP%6|iI*emt|h@) z{$iK{G-Wge&16Ve2-lJcqB!5WDm7=ndT=Vkj^{zi0o#J1Q!sB!5A|d%rao=ep4eUK z9I{{1sK{vGqkjP*Sq%_k8DGcq7K-c8g90{Q$7=LzEI0m&PWNXL?-!z%f9 zM^CjdifE%oZs@XW>Bmp0n-8*{Hd@R$wD0R2cEk13CB_gu9J*1V`|)QxJuMUh+f8SO z*x*|)fX0KTnoN`hJqoxzj%~g76y)c#rw%Dxsib=$z!B{hWlHvz?Fsn;^JQ*@EZiGj zPW`gK?4y9}(K)812j!X=1SheNFu(?h)rAboFIS%UDwCkCCdop`get>6e(%2c1M`sF zOZo?^PP+;>R?i9ICvQu+Kp@Yb7asjCasC+p$mT2EIcF@TGU5NIMg1#+4pD0@H|=-1 R|M~e!OHE(3UfD7F{{RNg1h@bI literal 0 HcmV?d00001 diff --git a/playground/browser-extension/package.json b/playground/browser-extension/package.json new file mode 100644 index 0000000000..8c2e3619e7 --- /dev/null +++ b/playground/browser-extension/package.json @@ -0,0 +1,48 @@ +{ + "name": "chrome-extension", + "displayName": "Clerk Chrome Extension Demo", + "version": "0.0.1", + "description": "A feature rich implementation of Clerk with a Plasmo-based Chrome Extension.", + "author": "Clerk", + "scripts": { + "build": "plasmo build", + "build:firefox": "plasmo build --target=firefox-mv2", + "debug": "plasmo dev --verbose", + "debug:firefox": "plasmo dev --target=firefox-mv2 --verbose", + "dev": "plasmo dev", + "dev:firefox": "plasmo dev --target=firefox-mv2", + "start:firefox": "web-ext run --source-dir ./build/firefox-mv2-dev" + }, + "dependencies": { + "@clerk/chrome-extension": "file:../../packages/chrome-extension", + "plasmo": "0.89.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-router-dom": "^6.27.0", + "tailwindcss": "3.4.14", + "webextension-polyfill": "^0.12.0" + }, + "devDependencies": { + "@types/chrome": "0.0.280", + "@types/node": "20.16.14", + "@types/react": "18.3.12", + "@types/react-dom": "18.3.1", + "@types/webextension-polyfill": "^0.12.1", + "postcss": "8.4.49", + "prettier": "3.3.3", + "prettier-plugin-tailwindcss": "^0.6.8", + "typescript": "5.6.3" + }, + "manifest": { + "permissions": [ + "cookies", + "storage", + "sidePanel" + ], + "host_permissions": [ + "$CLERK_FRONTEND_API/*", + "http://localhost/*" + ], + "key": "$CRX_PUBLIC_KEY" + } +} diff --git a/playground/browser-extension/pnpm-lock.yaml b/playground/browser-extension/pnpm-lock.yaml new file mode 100644 index 0000000000..5a22a73612 --- /dev/null +++ b/playground/browser-extension/pnpm-lock.yaml @@ -0,0 +1,7170 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@clerk/chrome-extension': + specifier: file:../../packages/chrome-extension + version: file:../../packages/chrome-extension(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + plasmo: + specifier: 0.89.4 + version: 0.89.4(@swc/core@1.9.1(@swc/helpers@0.5.13))(@swc/helpers@0.5.13)(lodash@4.17.21)(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react-router-dom: + specifier: ^6.27.0 + version: 6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + tailwindcss: + specifier: 3.4.14 + version: 3.4.14 + webextension-polyfill: + specifier: ^0.12.0 + version: 0.12.0 + devDependencies: + '@types/chrome': + specifier: 0.0.280 + version: 0.0.280 + '@types/node': + specifier: 20.16.14 + version: 20.16.14 + '@types/react': + specifier: 18.3.12 + version: 18.3.12 + '@types/react-dom': + specifier: 18.3.1 + version: 18.3.1 + '@types/webextension-polyfill': + specifier: ^0.12.1 + version: 0.12.1 + postcss: + specifier: 8.4.49 + version: 8.4.49 + prettier: + specifier: 3.3.3 + version: 3.3.3 + prettier-plugin-tailwindcss: + specifier: ^0.6.8 + version: 0.6.8(prettier@3.3.3) + typescript: + specifier: 5.6.3 + version: 5.6.3 + +packages: + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.26.2': + resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.26.2': + resolution: {integrity: sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.26.0': + resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.26.2': + resolution: {integrity: sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.25.9': + resolution: {integrity: sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.25.9': + resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.26.0': + resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-string-parser@7.25.9': + resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.25.9': + resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.25.9': + resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.26.0': + resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.26.2': + resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.26.0': + resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.25.9': + resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.25.9': + resolution: {integrity: sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.26.0': + resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} + engines: {node: '>=6.9.0'} + + '@clerk/chrome-extension@file:../../packages/chrome-extension': + resolution: {directory: ../../packages/chrome-extension, type: directory} + engines: {node: '>=18.17.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + '@clerk/clerk-js@5.33.1': + resolution: {integrity: sha512-zwAuBtqo7b1vDHCn5tC6/W9iJ1s0FAJr5MRLsvTDraU7ntTw0UPgVMljtJqyo6ruYJbWPiFt6/vAUpLa/9rtxg==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: '>=18' + react-dom: '>=18' + + '@clerk/clerk-react@5.15.3': + resolution: {integrity: sha512-Ha7Cjiffk3GT0+lJgrtJfeTC9P1kIdmErjQc0t6+lcx12qZwnO1fsf5fp6GND6+P+VtjbgGOPrQmPoJoEcI3cA==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18 || ^19.0.0-0 + react-dom: ^18 || ^19.0.0-0 + + '@clerk/localizations@3.6.2': + resolution: {integrity: sha512-CAP0jAgWP4hjco6hm+KoDan376Co/5ZUyJjAEgh+bs0JoHLIBkK+bML62XHPQgzHUdHHoNUn5pydXvsvaPFNvA==} + engines: {node: '>=18.17.0'} + + '@clerk/shared@2.12.1': + resolution: {integrity: sha512-ezX/BXnMJ1rH7vX4H3nXpZ3WW8m1lbyri5dHOoDlREUOe/zr9lawUgVx+75aTxrVPtK7u8XwzMj/rT2cMfMmqw==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18 || ^19.0.0-0 + react-dom: ^18 || ^19.0.0-0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + + '@clerk/types@4.32.0': + resolution: {integrity: sha512-6oqRJsQE8GIThVyPBAO0kJP0pZJ1c11Hz0qabDk9lStoxjHy7fRIcIm/JX5xlA6rjilWBMEgJr4C0a36mJvVXg==} + engines: {node: '>=18.17.0'} + + '@coinbase/wallet-sdk@4.0.4': + resolution: {integrity: sha512-74c040CRnGhfRjr3ArnkAgud86erIqdkPHNt5HR1k9u97uTIZCJww9eGYT67Qf7gHPpGS/xW8Be1D4dvRm63FA==} + + '@emotion/babel-plugin@11.12.0': + resolution: {integrity: sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==} + + '@emotion/cache@11.11.0': + resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/memoize@0.8.1': + resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.11.1': + resolution: {integrity: sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.2': + resolution: {integrity: sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0': + resolution: {integrity: sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.1': + resolution: {integrity: sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==} + + '@emotion/weak-memoize@0.3.1': + resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==} + + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@expo/spawn-async@1.7.2': + resolution: {integrity: sha512-QdWi16+CHB9JYP7gma19OVVg0BFkvU8zNj9GjWorYI8Iv8FUxjOCcYRuAmX4s/h91e4e7BPsskc8cSrZYho9Ew==} + engines: {node: '>=12'} + + '@floating-ui/core@1.6.8': + resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} + + '@floating-ui/dom@1.6.12': + resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==} + + '@floating-ui/react-dom@2.1.2': + resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/react@0.25.4': + resolution: {integrity: sha512-lWRQ/UiTvSIBxohn0/2HFHEmnmOVRjl7j6XcRJuLH0ls6f/9AyHMWVzkAJFuwx0n9gaEeCmg9VccCSCJzbEJig==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.1.6': + resolution: {integrity: sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==} + + '@floating-ui/utils@0.2.8': + resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} + + '@formkit/auto-animate@0.8.2': + resolution: {integrity: sha512-SwPWfeRa5veb1hOIBMdzI+73te5puUBHmqqaF1Bu7FjvxlYSz/kJcZKSa9Cg60zL0uRNeJL2SbRxV6Jp6Q1nFQ==} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.0': + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@lezer/common@0.15.12': + resolution: {integrity: sha512-edfwCxNLnzq5pBA/yaIhwJ3U3Kz8VAUOTRg0hhxaizaI1N+qxV7EXDv/kLCkLeq2RzSFvxexlaj5Mzfn2kY0Ig==} + + '@lezer/common@1.2.3': + resolution: {integrity: sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==} + + '@lezer/lr@0.15.8': + resolution: {integrity: sha512-bM6oE6VQZ6hIFxDNKk8bKPa14hqFrV07J/vHGOeiAbJReIaQXmkVb6xQu4MR+JBTLa5arGRyAAjJe1qaQt3Uvg==} + + '@lezer/lr@1.4.2': + resolution: {integrity: sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==} + + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + + '@lmdb/lmdb-darwin-arm64@2.5.2': + resolution: {integrity: sha512-+F8ioQIUN68B4UFiIBYu0QQvgb9FmlKw2ctQMSBfW2QBrZIxz9vD9jCGqTCPqZBRbPHAS/vG1zSXnKqnS2ch/A==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-arm64@2.7.11': + resolution: {integrity: sha512-r6+vYq2vKzE+vgj/rNVRMwAevq0+ZR9IeMFIqcSga+wMtMdXQ27KqQ7uS99/yXASg29bos7yHP3yk4x6Iio0lw==} + cpu: [arm64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@2.5.2': + resolution: {integrity: sha512-KvPH56KRLLx4KSfKBx0m1r7GGGUMXm0jrKmNE7plbHlesZMuPJICtn07HYgQhj1LNsK7Yqwuvnqh1QxhJnF1EA==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-darwin-x64@2.7.11': + resolution: {integrity: sha512-jhj1aB4K8ycRL1HOQT5OtzlqOq70jxUQEWRN9Gqh3TIDN30dxXtiHi6EWF516tzw6v2+3QqhDMJh8O6DtTGG8Q==} + cpu: [x64] + os: [darwin] + + '@lmdb/lmdb-linux-arm64@2.5.2': + resolution: {integrity: sha512-aLl89VHL/wjhievEOlPocoefUyWdvzVrcQ/MHQYZm2JfV1jUsrbr/ZfkPPUFvZBf+VSE+Q0clWs9l29PCX1hTQ==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm64@2.7.11': + resolution: {integrity: sha512-7xGEfPPbmVJWcY2Nzqo11B9Nfxs+BAsiiaY/OcT4aaTDdykKeCjvKMQJA3KXCtZ1AtiC9ljyGLi+BfUwdulY5A==} + cpu: [arm64] + os: [linux] + + '@lmdb/lmdb-linux-arm@2.5.2': + resolution: {integrity: sha512-5kQAP21hAkfW5Bl+e0P57dV4dGYnkNIpR7f/GAh6QHlgXx+vp/teVj4PGRZaKAvt0GX6++N6hF8NnGElLDuIDw==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-arm@2.7.11': + resolution: {integrity: sha512-dHfLFVSrw/v5X5lkwp0Vl7+NFpEeEYKfMG2DpdFJnnG1RgHQZngZxCaBagFoaJGykRpd2DYF1AeuXBFrAUAXfw==} + cpu: [arm] + os: [linux] + + '@lmdb/lmdb-linux-x64@2.5.2': + resolution: {integrity: sha512-xUdUfwDJLGjOUPH3BuPBt0NlIrR7f/QHKgu3GZIXswMMIihAekj2i97oI0iWG5Bok/b+OBjHPfa8IU9velnP/Q==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-linux-x64@2.7.11': + resolution: {integrity: sha512-vUKI3JrREMQsXX8q0Eq5zX2FlYCKWMmLiCyyJNfZK0Uyf14RBg9VtB3ObQ41b4swYh2EWaltasWVe93Y8+KDng==} + cpu: [x64] + os: [linux] + + '@lmdb/lmdb-win32-x64@2.5.2': + resolution: {integrity: sha512-zrBczSbXKxEyK2ijtbRdICDygRqWSRPpZMN5dD1T8VMEW5RIhIbwFWw2phDRXuBQdVDpSjalCIUMWMV2h3JaZA==} + cpu: [x64] + os: [win32] + + '@lmdb/lmdb-win32-x64@2.7.11': + resolution: {integrity: sha512-BJwkHlSUgtB+Ei52Ai32M1AOMerSlzyIGA/KC4dAGL+GGwVMdwG8HGCOA2TxP3KjhbgDPMYkv7bt/NmOmRIFng==} + cpu: [x64] + os: [win32] + + '@mischnic/json-sourcemap@0.1.0': + resolution: {integrity: sha512-dQb3QnfNqmQNYA4nFSN/uLaByIic58gOXq4Y4XqLOWmOrw73KmJPt/HLyG0wvn1bnR6mBKs/Uwvkh+Hns1T0XA==} + engines: {node: '>=12.0.0'} + + '@mischnic/json-sourcemap@0.1.1': + resolution: {integrity: sha512-iA7+tyVqfrATAIsIRWQG+a7ZLLD0VaOCKV2Wd/v4mqIU3J9c4jx9p7S0nw1XH3gJCKNBOOwACOPYYSUu9pgT+w==} + engines: {node: '>=12.0.0'} + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + resolution: {integrity: sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==} + cpu: [arm64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + resolution: {integrity: sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==} + cpu: [x64] + os: [darwin] + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + resolution: {integrity: sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==} + cpu: [arm64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + resolution: {integrity: sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==} + cpu: [arm] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + resolution: {integrity: sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==} + cpu: [x64] + os: [linux] + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + resolution: {integrity: sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==} + cpu: [x64] + os: [win32] + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@parcel/bundler-default@2.9.3': + resolution: {integrity: sha512-JjJK8dq39/UO/MWI/4SCbB1t/qgpQRFnFDetAAAezQ8oN++b24u1fkMDa/xqQGjbuPmGeTds5zxGgYs7id7PYg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/cache@2.8.3': + resolution: {integrity: sha512-k7xv5vSQrJLdXuglo+Hv3yF4BCSs1tQ/8Vbd6CHTkOhf7LcGg6CPtLw053R/KdMpd/4GPn0QrAsOLdATm1ELtQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + + '@parcel/cache@2.9.3': + resolution: {integrity: sha512-Bj/H2uAJJSXtysG7E/x4EgTrE2hXmm7td/bc97K8M9N7+vQjxf7xb0ebgqe84ePVMkj4MVQSMEJkEucXVx4b0Q==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@parcel/codeframe@2.8.3': + resolution: {integrity: sha512-FE7sY53D6n/+2Pgg6M9iuEC6F5fvmyBkRE4d9VdnOoxhTXtkEqpqYgX7RJ12FAQwNlxKq4suBJQMgQHMF2Kjeg==} + engines: {node: '>= 12.0.0'} + + '@parcel/codeframe@2.9.3': + resolution: {integrity: sha512-z7yTyD6h3dvduaFoHpNqur74/2yDWL++33rjQjIjCaXREBN6dKHoMGMizzo/i4vbiI1p9dDox2FIDEHCMQxqdA==} + engines: {node: '>= 12.0.0'} + + '@parcel/compressor-raw@2.9.3': + resolution: {integrity: sha512-jz3t4/ICMsHEqgiTmv5i1DJva2k5QRpZlBELVxfY+QElJTVe8edKJ0TiKcBxh2hx7sm4aUigGmp7JiqqHRRYmA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/config-default@2.9.3': + resolution: {integrity: sha512-tqN5tF7QnVABDZAu76co5E6N8mA9n8bxiWdK4xYyINYFIEHgX172oRTqXTnhEMjlMrdmASxvnGlbaPBaVnrCTw==} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@parcel/core@2.9.3': + resolution: {integrity: sha512-4KlM1Zr/jpsqWuMXr2zmGsaOUs1zMMFh9vfCNKRZkptf+uk8I3sugHbNdo+F5B+4e2yMuOEb1zgAmvJLeuH6ww==} + engines: {node: '>= 12.0.0'} + + '@parcel/diagnostic@2.8.3': + resolution: {integrity: sha512-u7wSzuMhLGWZjVNYJZq/SOViS3uFG0xwIcqXw12w54Uozd6BH8JlhVtVyAsq9kqnn7YFkw6pXHqAo5Tzh4FqsQ==} + engines: {node: '>= 12.0.0'} + + '@parcel/diagnostic@2.9.3': + resolution: {integrity: sha512-6jxBdyB3D7gP4iE66ghUGntWt2v64E6EbD4AetZk+hNJpgudOOPsKTovcMi/i7I4V0qD7WXSF4tvkZUoac0jwA==} + engines: {node: '>= 12.0.0'} + + '@parcel/events@2.8.3': + resolution: {integrity: sha512-hoIS4tAxWp8FJk3628bsgKxEvR7bq2scCVYHSqZ4fTi/s0+VymEATrRCUqf+12e5H47uw1/ZjoqrGtBI02pz4w==} + engines: {node: '>= 12.0.0'} + + '@parcel/events@2.9.3': + resolution: {integrity: sha512-K0Scx+Bx9f9p1vuShMzNwIgiaZUkxEnexaKYHYemJrM7pMAqxIuIqhnvwurRCsZOVLUJPDDNJ626cWTc5vIq+A==} + engines: {node: '>= 12.0.0'} + + '@parcel/fs-search@2.8.3': + resolution: {integrity: sha512-DJBT2N8knfN7Na6PP2mett3spQLTqxFrvl0gv+TJRp61T8Ljc4VuUTb0hqBj+belaASIp3Q+e8+SgaFQu7wLiQ==} + engines: {node: '>= 12.0.0'} + + '@parcel/fs-search@2.9.3': + resolution: {integrity: sha512-nsNz3bsOpwS+jphcd+XjZL3F3PDq9lik0O8HPm5f6LYkqKWT+u/kgQzA8OkAHCR3q96LGiHxUywHPEBc27vI4Q==} + engines: {node: '>= 12.0.0'} + + '@parcel/fs@2.8.3': + resolution: {integrity: sha512-y+i+oXbT7lP0e0pJZi/YSm1vg0LDsbycFuHZIL80pNwdEppUAtibfJZCp606B7HOjMAlNZOBo48e3hPG3d8jgQ==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + + '@parcel/fs@2.9.3': + resolution: {integrity: sha512-/PrRKgCRw22G7rNPSpgN3Q+i2nIkZWuvIOAdMG4KWXC4XLp8C9jarNaWd5QEQ75amjhQSl3oUzABzkdCtkKrgg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@parcel/graph@2.9.3': + resolution: {integrity: sha512-3LmRJmF8+OprAr6zJT3X2s8WAhLKkrhi6RsFlMWHifGU5ED1PFcJWFbOwJvSjcAhMQJP0fErcFIK1Ludv3Vm3g==} + engines: {node: '>= 12.0.0'} + + '@parcel/hash@2.8.3': + resolution: {integrity: sha512-FVItqzjWmnyP4ZsVgX+G00+6U2IzOvqDtdwQIWisCcVoXJFCqZJDy6oa2qDDFz96xCCCynjRjPdQx2jYBCpfYw==} + engines: {node: '>= 12.0.0'} + + '@parcel/hash@2.9.3': + resolution: {integrity: sha512-qlH5B85XLzVAeijgKPjm1gQu35LoRYX/8igsjnN8vOlbc3O8BYAUIutU58fbHbtE8MJPbxQQUw7tkTjeoujcQQ==} + engines: {node: '>= 12.0.0'} + + '@parcel/logger@2.8.3': + resolution: {integrity: sha512-Kpxd3O/Vs7nYJIzkdmB6Bvp3l/85ydIxaZaPfGSGTYOfaffSOTkhcW9l6WemsxUrlts4za6CaEWcc4DOvaMOPA==} + engines: {node: '>= 12.0.0'} + + '@parcel/logger@2.9.3': + resolution: {integrity: sha512-5FNBszcV6ilGFcijEOvoNVG6IUJGsnMiaEnGQs7Fvc1dktTjEddnoQbIYhcSZL63wEmzBZOgkT5yDMajJ/41jw==} + engines: {node: '>= 12.0.0'} + + '@parcel/markdown-ansi@2.8.3': + resolution: {integrity: sha512-4v+pjyoh9f5zuU/gJlNvNFGEAb6J90sOBwpKJYJhdWXLZMNFCVzSigxrYO+vCsi8G4rl6/B2c0LcwIMjGPHmFQ==} + engines: {node: '>= 12.0.0'} + + '@parcel/markdown-ansi@2.9.3': + resolution: {integrity: sha512-/Q4X8F2aN8UNjAJrQ5NfK2OmZf6shry9DqetUSEndQ0fHonk78WKt6LT0zSKEBEW/bB/bXk6mNMsCup6L8ibjQ==} + engines: {node: '>= 12.0.0'} + + '@parcel/namer-default@2.9.3': + resolution: {integrity: sha512-1ynFEcap48/Ngzwwn318eLYpLUwijuuZoXQPCsEQ21OOIOtfhFQJaPwXTsw6kRitshKq76P2aafE0BioGSqxcA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/node-resolver-core@3.0.3': + resolution: {integrity: sha512-AjxNcZVHHJoNT/A99PKIdFtwvoze8PAiC3yz8E/dRggrDIOboUEodeQYV5Aq++aK76uz/iOP0tST2T8A5rhb1A==} + engines: {node: '>= 12.0.0'} + + '@parcel/optimizer-css@2.9.3': + resolution: {integrity: sha512-RK1QwcSdWDNUsFvuLy0hgnYKtPQebzCb0vPPzqs6LhL+vqUu9utOyRycGaQffHCkHVQP6zGlN+KFssd7YtFGhA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/optimizer-data-url@2.9.3': + resolution: {integrity: sha512-k8lOKLzgZ24JKOuyrNe5PptoH8GJ78AwnumG1xEOKZ77gZnUgdrn3XdjzE28ZqTI4LFkT3jApUiBKBmqnWDe7Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/optimizer-htmlnano@2.9.3': + resolution: {integrity: sha512-9g/KBck3c6DokmJfvJ5zpHFBiCSolaGrcsTGx8C3YPdCTVTI9P1TDCwUxvAr4LjpcIRSa82wlLCI+nF6sSgxKA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/optimizer-image@2.9.3': + resolution: {integrity: sha512-530YzthE7kmecnNhPbkAK+26yQNt69pfJrgE0Ev0BZaM1Wu2+33nki7o8qvkTkikhPrurEJLGIXt1qKmbKvCbA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@parcel/optimizer-svgo@2.9.3': + resolution: {integrity: sha512-ytQS0wY5JJhWU4mL0wfhYDUuHcfuw+Gy2+JcnTm1t1AZXHlOTbU6EzRWNqBShsgXjvdrQQXizAe3B6GFFlFJVQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/optimizer-swc@2.9.3': + resolution: {integrity: sha512-GQINNeqtdpL1ombq/Cpwi6IBk02wKJ/JJbYbyfHtk8lxlq13soenpwOlzJ5T9D2fdG+FUhai9NxpN5Ss4lNoAg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/package-manager@2.8.3': + resolution: {integrity: sha512-tIpY5pD2lH53p9hpi++GsODy6V3khSTX4pLEGuMpeSYbHthnOViobqIlFLsjni+QA1pfc8NNNIQwSNdGjYflVA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + + '@parcel/package-manager@2.9.3': + resolution: {integrity: sha512-NH6omcNTEupDmW4Lm1e4NUYBjdqkURxgZ4CNESESInHJe6tblVhNB8Rpr1ar7zDar7cly9ILr8P6N3Ei7bTEjg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@parcel/packager-css@2.9.3': + resolution: {integrity: sha512-mePiWiYZOULY6e1RdAIJyRoYqXqGci0srOaVZYaP7mnrzvJgA63kaZFFsDiEWghunQpMUuUjM2x/vQVHzxmhKQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/packager-html@2.9.3': + resolution: {integrity: sha512-0Ex+O0EaZf9APNERRNGgGto02hFJ6f5RQEvRWBK55WAV1rXeU+kpjC0c0qZvnUaUtXfpWMsEBkevJCwDkUMeMg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/packager-js@2.9.3': + resolution: {integrity: sha512-V5xwkoE3zQ3R+WqAWhA1KGQ791FvJeW6KonOlMI1q76Djjgox68hhObqcLu66AmYNhR2R/wUpkP18hP2z8dSFw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/packager-raw@2.9.3': + resolution: {integrity: sha512-oPQTNoYanQ2DdJyL61uPYK2py83rKOT8YVh2QWAx0zsSli6Kiy64U3+xOCYWgDVCrHw9+9NpQMuAdSiFg4cq8g==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/packager-svg@2.9.3': + resolution: {integrity: sha512-p/Ya6UO9DAkaCUFxfFGyeHZDp9YPAlpdnh1OChuwqSFOXFjjeXuoK4KLT+ZRalVBo2Jo8xF70oKMZw4MVvaL7Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/plugin@2.8.3': + resolution: {integrity: sha512-jZ6mnsS4D9X9GaNnvrixDQwlUQJCohDX2hGyM0U0bY2NWU8Km97SjtoCpWjq+XBCx/gpC4g58+fk9VQeZq2vlw==} + engines: {node: '>= 12.0.0'} + + '@parcel/plugin@2.9.3': + resolution: {integrity: sha512-qN85Gqr2GMuxX1dT1mnuO9hOcvlEv1lrYrCxn7CJN2nUhbwcfG+LEvcrCzCOJ6XtIHm+ZBV9h9p7FfoPLvpw+g==} + engines: {node: '>= 12.0.0'} + + '@parcel/profiler@2.9.3': + resolution: {integrity: sha512-pyHc9lw8VZDfgZoeZWZU9J0CVEv1Zw9O5+e0DJPDPHuXJYr72ZAOhbljtU3owWKAeW+++Q2AZWkbUGEOjI/e6g==} + engines: {node: '>= 12.0.0'} + + '@parcel/reporter-bundle-buddy@2.9.3': + resolution: {integrity: sha512-9ftzLZ161USdvnxueT55EWufLI48va0xJfB5MAJLG92VAS1N1FSFgYKdkGFzBKw0eK9UScQNYnntCGC17rBayQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/reporter-dev-server@2.9.3': + resolution: {integrity: sha512-s6eboxdLEtRSvG52xi9IiNbcPKC0XMVmvTckieue2EqGDbDcaHQoHmmwkk0rNq0/Z/UxelGcQXoIYC/0xq3ykQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/resolver-default@2.9.3': + resolution: {integrity: sha512-8ESJk1COKvDzkmOnppNXoDamNMlYVIvrKc2RuFPmp8nKVj47R6NwMgvwxEaatyPzvkmyTpq5RvG9I3HFc+r4Cw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/runtime-browser-hmr@2.9.3': + resolution: {integrity: sha512-EgiDIDrVAWpz7bOzWXqVinQkaFjLwT34wsonpXAbuI7f7r00d52vNAQC9AMu+pTijA3gyKoJ+Q4NWPMZf7ACDA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/runtime-js@2.8.3': + resolution: {integrity: sha512-IRja0vNKwvMtPgIqkBQh0QtRn0XcxNC8HU1jrgWGRckzu10qJWO+5ULgtOeR4pv9krffmMPqywGXw6l/gvJKYQ==} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + + '@parcel/runtime-js@2.9.3': + resolution: {integrity: sha512-EvIy+qXcKnB5qxHhe96zmJpSAViNVXHfQI5RSdZ2a7CPwORwhTI+zPNT9sb7xb/WwFw/WuTTgzT40b41DceU6Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/runtime-react-refresh@2.9.3': + resolution: {integrity: sha512-XBgryZQIyCmi6JwEfMUCmINB3l1TpTp9a2iFxmYNpzHlqj4Ve0saKaqWOVRLvC945ZovWIBzcSW2IYqWKGtbAA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/runtime-service-worker@2.9.3': + resolution: {integrity: sha512-qLJLqv1mMdWL7gyh8aKBFFAuEiJkhUUgLKpdn6eSfH/R7kTtb76WnOwqUrhvEI9bZFUM/8Pa1bzJnPpqSOM+Sw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/source-map@2.1.1': + resolution: {integrity: sha512-Ejx1P/mj+kMjQb8/y5XxDUn4reGdr+WyKYloBljpppUy8gs42T+BNoEOuRYqDVdgPc6NxduzIDoJS9pOFfV5Ew==} + engines: {node: ^12.18.3 || >=14} + + '@parcel/transformer-babel@2.9.3': + resolution: {integrity: sha512-pURtEsnsp3h6tOBDuzh9wRvVtw4PgIlqwAArIWdrG7iwqOUYv9D8ME4+ePWEu7MQWAp58hv9pTJtqWv4T+Sq8A==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-css@2.9.3': + resolution: {integrity: sha512-duWMdbEBBPjg3fQdXF16iWIdThetDZvCs2TpUD7xOlXH6kR0V5BJy8ONFT15u1RCqIV9hSNGaS3v3I9YRNY5zQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-graphql@2.9.3': + resolution: {integrity: sha512-cIohsH3WlXgn63baU35ZoWHzttmkyE2Q1pexKjszODzSUq3pdcg+9k4rB/z8GGMzXvFRYuBgl2M2Ukqz7SueMg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-html@2.9.3': + resolution: {integrity: sha512-0NU4omcHzFXA1seqftAXA2KNZaMByoKaNdXnLgBgtCGDiYvOcL+6xGHgY6pw9LvOh5um10KI5TxSIMILoI7VtA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-image@2.9.3': + resolution: {integrity: sha512-7CEe35RaPadQzLIuxzTtIxnItvOoy46hcbXtOdDt6lmVa4omuOygZYRIya2lsGIP4JHvAaALMb5nt99a1uTwJg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@parcel/transformer-inline-string@2.9.3': + resolution: {integrity: sha512-IZNd0Ksl32psX1M41KbUc4BmvVSoLVnlpaMrh9C/l+piFSkDXWMnF0PONX/RcxYMBIwB2jYllheIKH54naeNaA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-js@2.9.3': + resolution: {integrity: sha512-Z2MVVg5FYcPOfxlUwxqb5l9yjTMEqE3KI3zq2MBRUme6AV07KxLmCDF23b6glzZlHWQUE8MXzYCTAkOPCcPz+Q==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@parcel/transformer-json@2.9.3': + resolution: {integrity: sha512-yNL27dbOLhkkrjaQjiQ7Im9VOxmkfuuSNSmS0rA3gEjVcm07SLKRzWkAaPnyx44Lb6bzyOTWwVrb9aMmxgADpA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-less@2.9.3': + resolution: {integrity: sha512-qwF5NQ8rPZjS79tv9RRPxzkZcwLcI4Xg2gHm9c1PvsgoaL2tVNpfjiRA6MOrzfJp+xr7xEzeMDZksOJ1WQiiQg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-postcss@2.9.3': + resolution: {integrity: sha512-HoDvPqKzhpmvMmHqQhDnt8F1vH61m6plpGiYaYnYv2Om4HHi5ZIq9bO+9QLBnTKfaZ7ndYSefTKOxTYElg7wyw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-posthtml@2.9.3': + resolution: {integrity: sha512-2fQGgrzRmaqbWf3y2/T6xhqrNjzqMMKksqJzvc8TMfK6f2kg3Ddjv158eaSW2JdkV39aY7tvAOn5f1uzo74BMA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-raw@2.9.3': + resolution: {integrity: sha512-oqdPzMC9QzWRbY9J6TZEqltknjno+dY24QWqf8ondmdF2+W+/2mRDu59hhCzQrqUHgTq4FewowRZmSfpzHxwaQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-react-refresh-wrap@2.9.3': + resolution: {integrity: sha512-cb9NyU6oJlDblFIlzqIE8AkvRQVGl2IwJNKwD4PdE7Y6sq2okGEPG4hOw3k/Y9JVjM4/2pUORqvjSRhWwd9oVQ==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-sass@2.9.3': + resolution: {integrity: sha512-i9abj9bKg3xCHghJyTM3rUVxIEn9n1Rl+DFdpyNAD8VZ52COfOshFDQOWNuhU1hEnJOFYCjnfcO0HRTsg3dWmg==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-svg-react@2.9.3': + resolution: {integrity: sha512-RXmCn58CkCBhpsS1AaRBrSRla0U5JN3r3hb7kQvEb+d7chGnsxCCWsBxtlrxPUjoUFLdQli9rhpCTkiyOBXY2A==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-svg@2.9.3': + resolution: {integrity: sha512-ypmE+dzB09IMCdEAkOsSxq1dEIm2A3h67nAFz4qbfHbwNgXBUuy/jB3ZMwXN/cO0f7SBh/Ap8Jhq6vmGqB5tWw==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/transformer-worklet@2.9.3': + resolution: {integrity: sha512-Fgd81OTOvAxAKoBGsQow/mgxELaNG1FeZW4DuDEPo/hR3lbs90oYuVpG2thdx7hmi/W6xqhrLaEN5Ea1v0LvEA==} + engines: {node: '>= 12.0.0', parcel: ^2.9.3} + + '@parcel/types@2.8.3': + resolution: {integrity: sha512-FECA1FB7+0UpITKU0D6TgGBpGxYpVSMNEENZbSJxFSajNy3wrko+zwBKQmFOLOiPcEtnGikxNs+jkFWbPlUAtw==} + + '@parcel/types@2.9.3': + resolution: {integrity: sha512-NSNY8sYtRhvF1SqhnIGgGvJocyWt1K8Tnw5cVepm0g38ywtX6mwkBvMkmeehXkII4mSUn+frD9wGsydTunezvA==} + + '@parcel/utils@2.8.3': + resolution: {integrity: sha512-IhVrmNiJ+LOKHcCivG5dnuLGjhPYxQ/IzbnF2DKNQXWBTsYlHkJZpmz7THoeLtLliGmSOZ3ZCsbR8/tJJKmxjA==} + engines: {node: '>= 12.0.0'} + + '@parcel/utils@2.9.3': + resolution: {integrity: sha512-cesanjtj/oLehW8Waq9JFPmAImhoiHX03ihc3JTWkrvJYSbD7wYKCDgPAM3JiRAqvh1LZ6P699uITrYWNoRLUg==} + engines: {node: '>= 12.0.0'} + + '@parcel/watcher-android-arm64@2.2.0': + resolution: {integrity: sha512-nU2wh00CTQT9rr1TIKTjdQ9lAGYpmz6XuKw0nAwAN+S2A5YiD55BK1u+E5WMCT8YOIDe/n6gaj4o/Bi9294SSQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-android-arm64@2.5.0': + resolution: {integrity: sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.2.0': + resolution: {integrity: sha512-cJl0UZDcodciy3TDMomoK/Huxpjlkkim3SyMgWzjovHGOZKNce9guLz2dzuFwfObBFCjfznbFMIvAZ5syXotYw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-arm64@2.5.0': + resolution: {integrity: sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.2.0': + resolution: {integrity: sha512-QI77zxaGrCV1StKcoRYfsUfmUmvPMPfQrubkBBy5XujV2fwaLgZivQOTQMBgp5K2+E19u1ufpspKXAPqSzpbyg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.0': + resolution: {integrity: sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.0': + resolution: {integrity: sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.2.0': + resolution: {integrity: sha512-I2GPBcAXazPzabCmfsa3HRRW+MGlqxYd8g8RIueJU+a4o5nyNZDz0CR1cu0INT0QSQXEZV7w6UE8Hz9CF8u3Pg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-glibc@2.5.0': + resolution: {integrity: sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.0': + resolution: {integrity: sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.2.0': + resolution: {integrity: sha512-St5mlfp+2lS9AmgixUqfwJa/DwVmTCJxC1HcOubUTz6YFOKIlkHCeUa1Bxi4E/tR/HSez8+heXHL8HQkJ4Bd8g==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + resolution: {integrity: sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.2.0': + resolution: {integrity: sha512-jS+qfhhoOBVWwMLP65MaG8xdInMK30pPW8wqTCg2AAuVJh5xepMbzkhHJ4zURqHiyY3EiIRuYu4ONJKCxt8iqA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.0': + resolution: {integrity: sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.2.0': + resolution: {integrity: sha512-xJvJ7R2wJdi47WZBFS691RDOWvP1j/IAs3EXaWVhDI8FFITbWrWaln7KoNcR0Y3T+ZwimFY/cfb0PNht1q895g==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.0': + resolution: {integrity: sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.2.0': + resolution: {integrity: sha512-D+NMpgr23a+RI5mu8ZPKWy7AqjBOkURFDgP5iIXXEf/K3hm0jJ3ogzi0Ed2237B/CdYREimCgXyeiAlE/FtwyA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.0': + resolution: {integrity: sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.2.0': + resolution: {integrity: sha512-z225cPn3aygJsyVUOWwfyW+fY0Tvk7N3XCOl66qUPFxpbuXeZuiuuJemmtm8vxyqa3Ur7peU/qJxrpC64aeI7Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-arm64@2.5.0': + resolution: {integrity: sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.0': + resolution: {integrity: sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.2.0': + resolution: {integrity: sha512-JqGW0RJ61BkKx+yYzIURt9s53P7xMVbv0uxYPzAXLBINGaFmkIKSuUPyBVfy8TMbvp93lvF4SPBNDzVRJfvgOw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.0': + resolution: {integrity: sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.2.0': + resolution: {integrity: sha512-71S4TF+IMyAn24PK4KSkdKtqJDR3zRzb0HE3yXpacItqTM7XfF2f5q9NEGLEVl0dAaBAGfNwDCjH120y25F6Tg==} + engines: {node: '>= 10.0.0'} + + '@parcel/watcher@2.5.0': + resolution: {integrity: sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==} + engines: {node: '>= 10.0.0'} + + '@parcel/workers@2.8.3': + resolution: {integrity: sha512-+AxBnKgjqVpUHBcHLWIHcjYgKIvHIpZjN33mG5LG9XXvrZiqdWvouEzqEXlVLq5VzzVbKIQQcmsvRy138YErkg==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + + '@parcel/workers@2.9.3': + resolution: {integrity: sha512-zRrDuZJzTevrrwElYosFztgldhqW6G9q5zOeQXfVQFkkEJCNfg36ixeiofKRU8uu2x+j+T6216mhMNB6HiuY+w==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.9.3 + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@plasmohq/consolidate@0.17.0': + resolution: {integrity: sha512-Na8imBnvzYPtzkK+9Uv9hPZ/oJti/0jgiQWD222SHxHw2QCVuR4KzslxXCy/rS8gGluSiTs1BGVvc3d2O6aJCA==} + engines: {node: '>= 0.10.0'} + peerDependencies: + arc-templates: ^0.5.3 + atpl: '>=0.7.6' + babel-core: ^6.26.3 + bracket-template: ^1.1.5 + coffeescript: ^2.7.0 + dot: ^1.1.3 + eco: ^1.1.0-rc-3 + ect: ^0.5.9 + ejs: ^3.1.5 + haml-coffee: ^1.14.1 + hamlet: ^0.3.3 + hamljs: ^0.6.2 + handlebars: ^4.7.6 + hogan.js: ^3.0.2 + htmling: ^0.0.8 + jazz: ^0.0.18 + jqtpl: ~1.1.0 + just: ^0.1.8 + liquid: ^5.1.1 + liquor: ^0.0.5 + lodash: ^4.17.20 + marko: ^3.14.4 + mote: ^0.2.0 + mustache: ^4.0.1 + nunjucks: ^3.2.2 + plates: ~0.4.11 + pug: ^3.0.0 + qejs: ^3.0.5 + ractive: ^1.3.12 + razor-tmpl: ^1.3.1 + react: ^18.2.0 + react-dom: ^18.2.0 + slm: ^2.0.0 + squirrelly: ^5.1.0 + teacup: ^2.0.0 + templayed: '>=0.2.3' + then-pug: '*' + tinyliquid: ^0.2.34 + toffee: ^0.3.6 + twig: ^1.15.2 + twing: ^5.0.2 + underscore: ^1.11.0 + vash: ^0.13.0 + velocityjs: ^2.0.1 + walrus: ^0.10.1 + whiskers: ^0.4.0 + peerDependenciesMeta: + arc-templates: + optional: true + atpl: + optional: true + babel-core: + optional: true + bracket-template: + optional: true + coffeescript: + optional: true + dot: + optional: true + eco: + optional: true + ect: + optional: true + ejs: + optional: true + haml-coffee: + optional: true + hamlet: + optional: true + hamljs: + optional: true + handlebars: + optional: true + hogan.js: + optional: true + htmling: + optional: true + jazz: + optional: true + jqtpl: + optional: true + just: + optional: true + liquid: + optional: true + liquor: + optional: true + lodash: + optional: true + marko: + optional: true + mote: + optional: true + mustache: + optional: true + nunjucks: + optional: true + plates: + optional: true + pug: + optional: true + qejs: + optional: true + ractive: + optional: true + razor-tmpl: + optional: true + react: + optional: true + react-dom: + optional: true + slm: + optional: true + squirrelly: + optional: true + teacup: + optional: true + templayed: + optional: true + then-pug: + optional: true + tinyliquid: + optional: true + toffee: + optional: true + twig: + optional: true + twing: + optional: true + underscore: + optional: true + vash: + optional: true + velocityjs: + optional: true + walrus: + optional: true + whiskers: + optional: true + + '@plasmohq/init@0.7.0': + resolution: {integrity: sha512-P75g48dqOGneJ+n0AcqnLE/TYflcaPc3B7h6EopnCBBYUDnCNBMwYmKAkaf5pnhsEB0ybPS6TU1C2DTGfqaW7A==} + + '@plasmohq/parcel-bundler@0.5.6': + resolution: {integrity: sha512-kjwj5tQUhdAK00AxXOzgqJ2jryZg4X6aleYAcjbREPzVMqKEu1NrNSNy5VGAfNRG6NCT6ZYg39ZCyuUOR2lEsQ==} + engines: {node: '>= 16.0.0', parcel: '>= 2.7.0'} + + '@plasmohq/parcel-compressor-utf8@0.1.1': + resolution: {integrity: sha512-9zcF39XIBzauYLERoGNVSy7qR1MzEqjhQn16RrlCpZ1AyNMlBJ3B28SmnUpBQNgne8JOHTtcx6cUVm1IvM3J+g==} + engines: {parcel: '>= 2.8.0'} + + '@plasmohq/parcel-config@0.41.1': + resolution: {integrity: sha512-peNpm+F1tVIZmDx8Mca8b3769cxc2IWS7q0+0Y4BLT1+2kis7X4b46IAYgOXtsDRZCb9pvxQhRhrVHpwGtdVLg==} + + '@plasmohq/parcel-core@0.1.10': + resolution: {integrity: sha512-XbJrqlgPNo+uQaukWayfRDZnAvdkYrmcydCOz0wfmuksTjDisyGkL3ZbWeX86QPN65CXFyou11/9h3+U9IsHfA==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-namer-manifest@0.3.12': + resolution: {integrity: sha512-mNyIVK4nRbjlnXXUygBcmV7xLzgS1HZ3vedxUrMQah0Wp0Y20GFcomToDBC0w9NXIZVSSKY0bRIeh0B6/verfQ==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-optimizer-encapsulate@0.0.8': + resolution: {integrity: sha512-iXDXoLtYBvV4rHhFw3O6nrS3dEWYe9k2m0i/Tvzg2lz4lUHFyvK5NN9RWqkOLfI8JviaqQzaaMKteJhLsX6z1A==} + engines: {parcel: '>= 2.8.0'} + + '@plasmohq/parcel-optimizer-es@0.4.1': + resolution: {integrity: sha512-2FvBq3L5wHyD+TNHpO0IVMJKX1XQ+uBruFVcRUgo+lDkIAyop7P8wpsY4iq3dOKXJrqjwBop9nzNcq0L/zaalQ==} + engines: {parcel: '>= 2.8.0'} + + '@plasmohq/parcel-packager@0.6.15': + resolution: {integrity: sha512-c6Afk5l8EqxyZ/N7p8avWEBt5teTQPQsvZZpPHWhsAY9eonX+h8bFdmXym1oevaq5TySJOpNCSUdTvqqZtlSnQ==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-resolver-post@0.4.5': + resolution: {integrity: sha512-Y5la9wruh3fMHlUoWtVBcbSyvg2xZE1kSRp5BAjtfyZlKS2cT/vIbFTUkqk9nPvXLExBDNajIxTKk9ag/9WzpA==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-resolver@0.14.1': + resolution: {integrity: sha512-1nmmMI7N5rtpni2TpUyPkI8XU1wIk/lTDGNZXLxtkzOoFiFP2sc2xZq4OGhmnRYvWphZYrnhMjRrjNJmqOFqxw==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-runtime@0.25.1': + resolution: {integrity: sha512-asr4DMXJSKPilye0uiyZf51NUC3WZAr0Y6mzl+mtRGIcywuv42+X52qnZl9a9xYkVZeYlVJq62Kfk4+wPthakg==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-transformer-inject-env@0.2.12': + resolution: {integrity: sha512-QhM5Je0LyuAAJMAXeBEu4YvDirIPXuO2SoxHkwTMIwCMXpstPinnKiElrIoolqZjcxLmDCfsXerXZfbN6NhSlA==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-transformer-inline-css@0.3.11': + resolution: {integrity: sha512-EUSwEowFNSgC/F1q/V4H4NXJ23wwLzlmRI6lvIr6S0mIuG/FCga+lAV3IZ+yAuXqUM2VexX6JyYYpNVidrMSxw==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-transformer-manifest@0.20.1': + resolution: {integrity: sha512-fA2d+u7eAURr8Vyi1HAB8zwndBW2czi5YcLgZRVwEqHODYYIyNcmqMJHLt7TAQYTD+POG+z4WpM81AKdhcq8mg==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-transformer-svelte@0.6.0': + resolution: {integrity: sha512-5lZW6NBtzhJaCyjpKaZF1/YzY9CF+kbfNknvASJB/Cf6uJPJlrgdxoWiVJ8IWMs3DyLgAnJXTdIU+uwjwXP1wg==} + engines: {parcel: '>= 2.7.0'} + + '@plasmohq/parcel-transformer-vue@0.5.0': + resolution: {integrity: sha512-/3oVbajt+DRqtbM0RkKFtfyZR8DVjcsYpj1jHqPParGVBiXwgP0D/8Bj5p5/5Iqihs08gzasTcjKcwQKKdj0og==} + engines: {parcel: '>= 2.7.0'} + + '@pnpm/config.env-replace@1.1.0': + resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} + engines: {node: '>=12.22.0'} + + '@pnpm/network.ca-file@1.0.2': + resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} + engines: {node: '>=12.22.0'} + + '@pnpm/npm-conf@2.3.1': + resolution: {integrity: sha512-c83qWb22rNRuB0UaVCI0uRPNRr8Z0FWnEIvT47jiHAmOIUHbBOg5XvV7pM5x+rKn9HRpjxquDbXYSXr3fAKFcw==} + engines: {node: '>=12'} + + '@remix-run/router@1.21.0': + resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==} + engines: {node: '>=14.0.0'} + + '@sindresorhus/is@5.6.0': + resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} + engines: {node: '>=14.16'} + + '@svgr/babel-plugin-add-jsx-attribute@6.5.1': + resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': + resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': + resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} + engines: {node: '>=14'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1': + resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-dynamic-title@6.5.1': + resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-svg-em-dimensions@6.5.1': + resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-react-native-svg@6.5.1': + resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-plugin-transform-svg-component@6.5.1': + resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==} + engines: {node: '>=12'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/babel-preset@6.5.1': + resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==} + engines: {node: '>=10'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@svgr/core@6.5.1': + resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==} + engines: {node: '>=10'} + + '@svgr/hast-util-to-babel-ast@6.5.1': + resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==} + engines: {node: '>=10'} + + '@svgr/plugin-jsx@6.5.1': + resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': ^6.0.0 + + '@svgr/plugin-svgo@6.5.1': + resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==} + engines: {node: '>=10'} + peerDependencies: + '@svgr/core': '*' + + '@swc/core-darwin-arm64@1.3.96': + resolution: {integrity: sha512-8hzgXYVd85hfPh6mJ9yrG26rhgzCmcLO0h1TIl8U31hwmTbfZLzRitFQ/kqMJNbIBCwmNH1RU2QcJnL3d7f69A==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-arm64@1.9.1': + resolution: {integrity: sha512-2/ncHSCdAh5OHem1fMITrWEzzl97OdMK1PHc9CkxSJnphLjRubfxB5sbc5tDhcO68a5tVy+DxwaBgDec3PXnOg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [darwin] + + '@swc/core-darwin-x64@1.3.96': + resolution: {integrity: sha512-mFp9GFfuPg+43vlAdQZl0WZpZSE8sEzqL7sr/7Reul5McUHP0BaLsEzwjvD035ESfkY8GBZdLpMinblIbFNljQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-darwin-x64@1.9.1': + resolution: {integrity: sha512-4MDOFC5zmNqRJ9RGFOH95oYf27J9HniLVpB1pYm2gGeNHdl2QvDMtx2QTuMHQ6+OTn/3y1BHYuhBGp7d405oLA==} + engines: {node: '>=10'} + cpu: [x64] + os: [darwin] + + '@swc/core-linux-arm-gnueabihf@1.3.96': + resolution: {integrity: sha512-8UEKkYJP4c8YzYIY/LlbSo8z5Obj4hqcv/fUTHiEePiGsOddgGf7AWjh56u7IoN/0uEmEro59nc1ChFXqXSGyg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm-gnueabihf@1.9.1': + resolution: {integrity: sha512-eVW/BjRW8/HpLe3+1jRU7w7PdRLBgnEEYTkHJISU8805/EKT03xNZn6CfaBpKfeAloY4043hbGzE/NP9IahdpQ==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.3.96': + resolution: {integrity: sha512-c/IiJ0s1y3Ymm2BTpyC/xr6gOvoqAVETrivVXHq68xgNms95luSpbYQ28rqaZC8bQC8M5zdXpSc0T8DJu8RJGw==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-gnu@1.9.1': + resolution: {integrity: sha512-8m3u1v8R8NgI/9+cHMkzk14w87blSy3OsQPWPfhOL+XPwhyLPvat+ahQJb2nZmltjTgkB4IbzKFSfbuA34LmNA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.3.96': + resolution: {integrity: sha512-i5/UTUwmJLri7zhtF6SAo/4QDQJDH2fhYJaBIUhrICmIkRO/ltURmpejqxsM/ye9Jqv5zG7VszMC0v/GYn/7BQ==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-arm64-musl@1.9.1': + resolution: {integrity: sha512-hpT0sQAZnW8l02I289yeyFfT9llGO9PzKDxUq8pocKtioEHiElRqR53juCWoSmzuWi+6KX7zUJ0NKCBrc8pmDg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.3.96': + resolution: {integrity: sha512-USdaZu8lTIkm4Yf9cogct/j5eqtdZqTgcTib4I+NloUW0E/hySou3eSyp3V2UAA1qyuC72ld1otXuyKBna0YKQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-gnu@1.9.1': + resolution: {integrity: sha512-sGFdpdAYusk/ropHiwtXom2JrdaKPxl8MqemRv6dvxZq1Gm/GdmOowxdXIPjCgBGMgoXVcgNviH6CgiO5q+UtA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.3.96': + resolution: {integrity: sha512-QYErutd+G2SNaCinUVobfL7jWWjGTI0QEoQ6hqTp7PxCJS/dmKmj3C5ZkvxRYcq7XcZt7ovrYCTwPTHzt6lZBg==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-linux-x64-musl@1.9.1': + resolution: {integrity: sha512-YtNLNwIWs0Z2+XgBs6+LrCIGtfCDtNr4S4b6Q5HDOreEIGzSvhkef8eyBI5L+fJ2eGov4b7iEo61C4izDJS5RA==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux] + + '@swc/core-win32-arm64-msvc@1.3.96': + resolution: {integrity: sha512-hjGvvAduA3Un2cZ9iNP4xvTXOO4jL3G9iakhFsgVhpkU73SGmK7+LN8ZVBEu4oq2SUcHO6caWvnZ881cxGuSpg==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-arm64-msvc@1.9.1': + resolution: {integrity: sha512-qSxD3uZW2vSiHqUt30vUi0PB92zDh9bjqh5YKpfhhVa7h1vt/xXhlid8yMvSNToTfzhRrTEffOAPUr7WVoyQUA==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.3.96': + resolution: {integrity: sha512-Far2hVFiwr+7VPCM2GxSmbh3ikTpM3pDombE+d69hkedvYHYZxtTF+2LTKl/sXtpbUnsoq7yV/32c9R/xaaWfw==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-ia32-msvc@1.9.1': + resolution: {integrity: sha512-C3fPEwyX/WRPlX6zIToNykJuz1JkZX0sk8H1QH2vpnKuySUkt/Ur5K2FzLgSWzJdbfxstpgS151/es0VGAD+ZA==} + engines: {node: '>=10'} + cpu: [ia32] + os: [win32] + + '@swc/core-win32-x64-msvc@1.3.96': + resolution: {integrity: sha512-4VbSAniIu0ikLf5mBX81FsljnfqjoVGleEkCQv4+zRlyZtO3FHoDPkeLVoy6WRlj7tyrRcfUJ4mDdPkbfTO14g==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core-win32-x64-msvc@1.9.1': + resolution: {integrity: sha512-2XZ+U1AyVsOAXeH6WK1syDm7+gwTjA8fShs93WcbxnK7HV+NigDlvr4124CeJLTHyh3fMh1o7+CnQnaBJhlysQ==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@swc/core@1.3.96': + resolution: {integrity: sha512-zwE3TLgoZwJfQygdv2SdCK9mRLYluwDOM53I+dT6Z5ZvrgVENmY3txvWDvduzkV+/8IuvrRbVezMpxcojadRdQ==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': ^0.5.0 + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/core@1.9.1': + resolution: {integrity: sha512-OnPc+Kt5oy3xTvr/KCUOqE9ptJcWbyQgAUr1ydh9EmbBcmJTaO1kfQCxm/axzJi6sKeDTxL9rX5zvLOhoYIaQw==} + engines: {node: '>=10'} + peerDependencies: + '@swc/helpers': '*' + peerDependenciesMeta: + '@swc/helpers': + optional: true + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.13': + resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} + + '@swc/types@0.1.12': + resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} + + '@swc/types@0.1.14': + resolution: {integrity: sha512-PbSmTiYCN+GMrvfjrMo9bdY+f2COnwbdnoMw7rqU/PI5jXpKjxOGZ0qqZCImxnT81NkNsKnmEpvu+hRXLBeCJg==} + + '@szmarczak/http-timer@5.0.1': + resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} + engines: {node: '>=14.16'} + + '@trysound/sax@0.2.0': + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + + '@types/chrome@0.0.280': + resolution: {integrity: sha512-AotSmZrL9bcZDDmSI1D9dE7PGbhOur5L0cKxXd7IqbVizQWCY4gcvupPUVsQ4FfDj3V2tt/iOpomT9EY0s+w1g==} + + '@types/estree@1.0.6': + resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + + '@types/filesystem@0.0.36': + resolution: {integrity: sha512-vPDXOZuannb9FZdxgHnqSwAG/jvdGM8Wq+6N4D/d80z+D4HWH+bItqsZaVRQykAn6WEVeEkLm2oQigyHtgb0RA==} + + '@types/filewriter@0.0.33': + resolution: {integrity: sha512-xFU8ZXTw4gd358lb2jw25nxY9QAgqn2+bKKjKOYfNCzN4DKCFetK7sPtrlpg66Ywe3vWY9FNxprZawAh9wfJ3g==} + + '@types/har-format@1.2.16': + resolution: {integrity: sha512-fluxdy7ryD3MV6h8pTfTYpy/xQzCFC7m89nOH9y94cNqJ1mDIDPut7MnRHI3F6qRmh/cT2fUjG1MLdCNb4hE9A==} + + '@types/http-cache-semantics@4.0.4': + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/node@20.16.14': + resolution: {integrity: sha512-vtgGzjxLF7QT88qRHtXMzCWpAAmwonE7fwgVjFtXosUva2oSpnIEc3gNO9P7uIfOxKnii2f79/xtOnfreYtDaA==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.13': + resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} + + '@types/react-dom@18.3.1': + resolution: {integrity: sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==} + + '@types/react@18.3.12': + resolution: {integrity: sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==} + + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + + '@types/webextension-polyfill@0.12.1': + resolution: {integrity: sha512-xPTFWwQ8BxPevPF2IKsf4hpZNss4LxaOLZXypQH4E63BDLmcwX/RMGdI4tB4VO4Nb6xDBH3F/p4gz4wvof1o9w==} + + '@vue/compiler-core@3.3.4': + resolution: {integrity: sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==} + + '@vue/compiler-dom@3.3.4': + resolution: {integrity: sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==} + + '@vue/compiler-sfc@3.3.4': + resolution: {integrity: sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==} + + '@vue/compiler-ssr@3.3.4': + resolution: {integrity: sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==} + + '@vue/reactivity-transform@3.3.4': + resolution: {integrity: sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==} + + '@vue/reactivity@3.3.4': + resolution: {integrity: sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==} + + '@vue/runtime-core@3.3.4': + resolution: {integrity: sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==} + + '@vue/runtime-dom@3.3.4': + resolution: {integrity: sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==} + + '@vue/server-renderer@3.3.4': + resolution: {integrity: sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==} + peerDependencies: + vue: 3.3.4 + + '@vue/shared@3.3.4': + resolution: {integrity: sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==} + + '@zxcvbn-ts/core@3.0.4': + resolution: {integrity: sha512-aQeiT0F09FuJaAqNrxynlAwZ2mW/1MdXakKWNmGM1Qp/VaY6CnB/GfnMS2T8gB2231Esp1/maCWd8vTG4OuShw==} + + '@zxcvbn-ts/language-common@3.0.4': + resolution: {integrity: sha512-viSNNnRYtc7ULXzxrQIVUNwHAPSXRtoIwy/Tq4XQQdIknBzw4vz36lQLF6mvhMlTIlpjoN/Z1GFu/fwiAlUSsw==} + + abortcontroller-polyfill@1.7.5: + resolution: {integrity: sha512-JMJ5soJWP18htbbxJjG7bG6yuI6pRhgJ0scHHTfkUjf6wjP912xZWvM+A4sJK3gqd9E8fcPbDnOefbA9Th/FIQ==} + + abortcontroller-polyfill@1.7.6: + resolution: {integrity: sha512-Zypm+LjYdWAzvuypZvDN0smUJrhOurcuBWhhMRBExqVLRvdjp3Z9mASxKyq19K+meZMshwjjy5S0lkm388zE4Q==} + + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} + engines: {node: '>=0.4.0'} + hasBin: true + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.2: + resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} + engines: {node: '>= 0.4'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + axobject-query@3.2.4: + resolution: {integrity: sha512-aPTElBrbifBU1krmZxGZOlBkslORe7Ll7+BDnI50Wy4LgOt69luMgevkDfTq1O/ZgprooPCtWpjCwKSZw/iZ4A==} + engines: {node: '>= 0.4'} + + b4a@1.6.7: + resolution: {integrity: sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==} + + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + bare-events@2.5.0: + resolution: {integrity: sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==} + + bare-fs@2.3.5: + resolution: {integrity: sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==} + + bare-os@2.4.4: + resolution: {integrity: sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==} + + bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + + bare-stream@2.3.2: + resolution: {integrity: sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==} + + base-x@3.0.10: + resolution: {integrity: sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + bluebird@3.7.2: + resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} + + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + + browser-tabs-lock@1.2.15: + resolution: {integrity: sha512-J8K9vdivK0Di+b8SBdE7EZxDr88TnATing7XoLw6+nFkXMQ6sVBh92K3NQvZlZU91AIkFRi0w3sztk5Z+vsswA==} + + browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + browserslist@4.24.2: + resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + + bundle-require@4.2.1: + resolution: {integrity: sha512-7Q/6vkyYAwOmQNRw75x+4yRtZCZJXUDmHHlFdkiV0wgv/reNjtJwpu1jPJ0w2kbEpIM0uoKI3S4/f39dU7AjSA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacheable-lookup@7.0.0: + resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} + engines: {node: '>=14.16'} + + cacheable-request@10.2.14: + resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} + engines: {node: '>=14.16'} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + caniuse-lite@1.0.30001678: + resolution: {integrity: sha512-RR+4U/05gNtps58PEBDZcPWTgEO2MBeoPZ96aQcjmfkBWRIDfN451fW2qyDA9/+HohLLIL5GqiMwA+IB1pWarw==} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@5.1.2: + resolution: {integrity: sha512-CAtbGEDulyjzs05RXy3uKcwqeztz/dMEuAc1Xu9NQBsbrhuGMneL0u9Dj5SoutLKBFYun8txxYIwhjtLNfUmCA==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + engines: {node: '>= 14.16.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + + clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + + code-red@1.0.4: + resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + + color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + + config-chain@1.1.13: + resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} + + content-security-policy-parser@0.4.1: + resolution: {integrity: sha512-NNJS8XPnx3OKr/CUOSwDSJw+lWTrZMYnclLKj0Y9CYOfJNJTWLFGPg3u2hYgbXMXKVRkZR2fbyReNQ1mUff/Qg==} + engines: {node: '>=8.0.0'} + + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + copy-anything@2.0.6: + resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==} + + copy-to-clipboard@3.3.3: + resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + + core-js@3.26.1: + resolution: {integrity: sha512-21491RRQVzUn0GGM9Z1Jrpr6PNPxPi+Za8OM9q4tksTSnlbXXGKK1nXNg/QvwFYettXvSX6zWKCtHHfjN4puyA==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + + cosmiconfig@9.0.0: + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + cross-spawn@7.0.5: + resolution: {integrity: sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==} + engines: {node: '>= 8'} + + crypto-js@4.2.0: + resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} + + crypto-random-string@4.0.0: + resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} + engines: {node: '>=12'} + + css-select@4.3.0: + resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} + + css-tree@1.1.3: + resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==} + engines: {node: '>=8.0.0'} + + css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + csso@4.2.0: + resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==} + engines: {node: '>=8.0.0'} + + csstype@3.1.1: + resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + + deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + + detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + + didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + + dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + + domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + + dotenv-expand@10.0.0: + resolution: {integrity: sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==} + engines: {node: '>=12'} + + dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + + dotenv@7.0.0: + resolution: {integrity: sha512-M3NhsLbV1i6HuGzBUH8vXrtxOk+tWmzWKDMbAVSUp3Zsjm7ywFeuwrUXhmhQyRK1q5B5GGy7hcXPbj3bnfZg2g==} + engines: {node: '>=6'} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + electron-to-chromium@1.5.53: + resolution: {integrity: sha512-7F6qFMWzBArEFK4PLE+c+nWzhS1kIoNkQvGnNDogofxQAym+roQ0GUIdw6C/4YdJ6JKGp19c2a/DLcfKTi4wRQ==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + + entities@3.0.1: + resolution: {integrity: sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==} + engines: {node: '>=0.12'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + + errno@0.1.8: + resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==} + hasBin: true + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + + events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fastest-levenshtein@1.0.16: + resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} + engines: {node: '>= 4.9.1'} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fflate@0.8.1: + resolution: {integrity: sha512-/exOvEuc+/iaUm105QIiOt4LpBdMTWsXxqR0HDF35vx3fmaKzw7354gTilCh5rkzEt8WYyG//ku3h3nRmd7CHQ==} + + figures@5.0.0: + resolution: {integrity: sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==} + engines: {node: '>=14'} + + fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + + form-data-encoder@2.1.4: + resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} + engines: {node: '>= 14.17'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-port@7.0.0: + resolution: {integrity: sha512-mDHFgApoQd+azgMdwylJrv2DX47ywGq1i5VFJE7fZ0dttNq3iQMfsU4IvEgBHojA3KqEudyu7Vq+oN8kNaNkWw==} + engines: {node: '>=16'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + got@12.6.1: + resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} + engines: {node: '>=14.16'} + + got@13.0.0: + resolution: {integrity: sha512-XfBk1CxOOScDcMr9O1yKkNaQyy865NbYs+F7dr4H0LZMVgCj2Le59k6PqbNHoL5ToeaEQUYh6c6yMfVcc6SJxA==} + engines: {node: '>=16'} + + graceful-fs@4.2.10: + resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + graphql-import-macro@1.0.0: + resolution: {integrity: sha512-YK4g6iP60H++MpP93tb0VwOg7aM5iIC0hdSQKTrEDANeLWf0KFAT9dwlBeMDrhY+jcW7qsAEDtaw58cgVnQXAw==} + + graphql@15.9.0: + resolution: {integrity: sha512-GCOQdvm7XxV1S4U4CGrsdlEN37245eC8P9zaYCMr6K1BG0IPGy5lUwmJsEOGyl1GD6HXjOtl2keCP9asRBwNvA==} + engines: {node: '>= 10.x'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + + htmlnano@2.1.1: + resolution: {integrity: sha512-kAERyg/LuNZYmdqgCdYvugyLWNFAm8MWXpQMz1pLpetmCbFwoMxvkSoaAMlFrOC4OKTWI4KlZGT/RsNxg4ghOw==} + peerDependencies: + cssnano: ^7.0.0 + postcss: ^8.3.11 + purgecss: ^6.0.0 + relateurl: ^0.2.7 + srcset: 5.0.1 + svgo: ^3.0.2 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + + htmlparser2@7.2.0: + resolution: {integrity: sha512-H7MImA4MS6cw7nbyURtLPO1Tms7C5H602LRETv95z1MxO/7CP7rDVROehUYeYBUYEON94NXXDEPmZuq+hX4sog==} + + http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + + http2-wrapper@2.2.1: + resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} + engines: {node: '>=10.19.0'} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + + image-size@0.5.5: + resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==} + engines: {node: '>=0.10.0'} + hasBin: true + + immutable@4.3.7: + resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + inquirer@9.2.12: + resolution: {integrity: sha512-mg3Fh9g2zfuVWJn6lhST0O7x4n03k7G8Tx5nvikJkbq8/CK47WDVm+UznF0G6s5Zi0KcyUisr6DU8T67N5U+1Q==} + engines: {node: '>=14.18.0'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-core-module@2.15.1: + resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} + engines: {node: '>= 0.4'} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-json@2.0.1: + resolution: {integrity: sha512-6BEnpVn1rcf3ngfmViLM6vjUjGErbdrL4rwlv+u1NO1XO8kqT4YGL8+19Q+Z/bas8tY90BTWMk2+fW1g6hQjbA==} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-what@3.14.1: + resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==} + + isbinaryfile@4.0.10: + resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==} + engines: {node: '>= 8.0.0'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + + jiti@1.21.6: + resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} + hasBin: true + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-cookie@3.0.5: + resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} + engines: {node: '>=14'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-schema-to-ts@2.9.2: + resolution: {integrity: sha512-h9WqLkTVpBbiaPb5OmeUpz/FBLS/kvIJw4oRCPiEisIu2WjMh+aai0QIY2LoOhRFx5r92taGLcerIrzxKBAP6g==} + engines: {node: '>=16'} + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + keccak@3.0.4: + resolution: {integrity: sha512-3vKuW0jV8J3XNTzvfyicFR5qvxrSAGl7KIhvgOu5cmWwM7tZRj3fMbj/pfIf4be7aznbc+prBWGjywox/g2Y6Q==} + engines: {node: '>=10.0.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + less@4.2.0: + resolution: {integrity: sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==} + engines: {node: '>=6'} + hasBin: true + + lightningcss-darwin-arm64@1.21.8: + resolution: {integrity: sha512-BOMoGfcgkk2f4ltzsJqmkjiqRtlZUK+UdwhR+P6VgIsnpQBV3G01mlL6GzYxYqxq+6/3/n/D+4oy2NeknmADZw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-arm64@1.28.1: + resolution: {integrity: sha512-VG3vvzM0m/rguCdm76DdobNeNJnHK+jWcdkNLFWHLh9YCotRvbRIt45JxwcHlIF8TDqWStVLTdghq5NaigVCBQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.21.8: + resolution: {integrity: sha512-YhF64mcVDPKKufL4aNFBnVH7uvzE0bW3YUsPXdP4yUcT/8IXChypOZ/PE1pmt2RlbmsyVuuIIeZU4zTyZe5Amw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-darwin-x64@1.28.1: + resolution: {integrity: sha512-O7ORdislvKfMohFl4Iq7fxKqdJOuuxArcglVI3amuFO5DJ0wfV3Gxgi1JRo49slfr7OVzJQEHLG4muTWYM5cTQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.21.8: + resolution: {integrity: sha512-CV6A/vTG2Ryd3YpChEgfWWv4TXCAETo9TcHSNx0IP0dnKcnDEiAko4PIKhCqZL11IGdN1ZLBCVPw+vw5ZYwzfA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-freebsd-x64@1.28.1: + resolution: {integrity: sha512-b7sF89B31kYYijxVcFO7l5u6UNA862YstNu+3YbLl/IQKzveL4a5cwR5cdpG+OOhErg/c2u9WCmzZoX2I5GBvw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.21.8: + resolution: {integrity: sha512-9PMbqh8n/Xq0F4/j2NR/hHM2HRDiFXFSF0iOvV67pNWKJkHIO6mR8jBw/88Aro5Ye/ILsX5OuWsxIVJDFv0NXA==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm-gnueabihf@1.28.1: + resolution: {integrity: sha512-p61kXwvhUDLLzkWHjzSFfUBW/F0iy3jr3CWi3k8SKULtJEsJXTI9DqRm9EixxMSe2AMBQBt4auTYiQL4B1N51A==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.21.8: + resolution: {integrity: sha512-JTM/TuMMllkzaXV7/eDjG4IJKLlCl+RfYZwtsVmC82gc0QX0O37csGAcY2OGleiuA4DnEo/Qea5WoFfZUNC6zg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-gnu@1.28.1: + resolution: {integrity: sha512-iO+fN9hOMmzfwqcG2/BgUtMKD48H2JO/SXU44fyIwpY2veb65QF5xiRrQ9l1FwIxbGK3231KBYCtAqv+xf+NsQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.21.8: + resolution: {integrity: sha512-01gWShXrgoIb8urzShpn1RWtZuaSyKSzF2hfO+flzlTPoACqcO3rgcu/3af4Cw54e8vKzL5hPRo4kROmgaOMLg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.28.1: + resolution: {integrity: sha512-dnMHeXEmCUzHHZjaDpQBYuBKcN9nPC3nPFKl70bcj5Bkn5EmkcgEqm5p035LKOgvAwk1XwLpQCML6pXmCwz0NQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.21.8: + resolution: {integrity: sha512-yVB5vYJjJb/Aku0V9QaGYIntvK/1TJOlNB9GmkNpXX5bSSP2pYW4lWW97jxFMHO908M0zjEt1qyOLMyqojHL+Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-gnu@1.28.1: + resolution: {integrity: sha512-7vWDISaMUn+oo2TwRdf2hl/BLdPxvywv9JKEqNZB/0K7bXwV4XE9wN/C2sAp1gGuh6QBA8lpjF4JIPt3HNlCHA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.21.8: + resolution: {integrity: sha512-TYi+KNtBVK0+FZvxTX/d5XJb+tw3Jq+2Rr9hW359wp1afsi1Vkg+uVGgbn+m2dipa5XwpCseQq81ylMlXuyfPw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.28.1: + resolution: {integrity: sha512-IHCu9tVGP+x5BCpA2rF3D04DBokcBza/a8AuHQU+1AiMKubuMegPwcL7RatBgK4ztFHeYnnD5NdhwhRfYMAtNA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.28.1: + resolution: {integrity: sha512-Erm72kHmMg/3h350PTseskz+eEGBM17Fuu79WW2Qqt0BfWSF1jHHc12lkJCWMYl5jcBHPs5yZdgNHtJ7IJS3Uw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.21.8: + resolution: {integrity: sha512-mww+kqbPx0/C44l2LEloECtRUuOFDjq9ftp+EHTPiCp2t+avy0sh8MaFwGsrKkj2XfZhaRhi4CPVKBoqF1Qlwg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss-win32-x64-msvc@1.28.1: + resolution: {integrity: sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.21.8: + resolution: {integrity: sha512-jEqaL7m/ZckZJjlMAfycr1Kpz7f93k6n7KGF5SJjuPSm6DWI6h3ayLZmgRHgy1OfrwoCed6h4C/gHYPOd1OFMA==} + engines: {node: '>= 12.0.0'} + + lightningcss@1.28.1: + resolution: {integrity: sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ==} + engines: {node: '>= 12.0.0'} + + lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + + lilconfig@3.1.2: + resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lmdb@2.5.2: + resolution: {integrity: sha512-V5V5Xa2Hp9i2XsbDALkBTeHXnBXh/lEmk9p22zdr7jtuOIY9TGhjK6vAvTpOOx9IKU4hJkRWZxn/HsvR1ELLtA==} + + lmdb@2.7.11: + resolution: {integrity: sha512-x9bD4hVp7PFLUoELL8RglbNXhAMt5CYhkmss+CEau9KlNoilsTzNi9QDsPZb3KMpOGZXG6jmXhW3bBxE2XVztw==} + hasBin: true + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + locate-character@3.0.0: + resolution: {integrity: sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + lowercase-keys@3.0.0: + resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + + make-dir@2.1.0: + resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} + engines: {node: '>=6'} + + mdn-data@2.0.14: + resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} + + mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + micromatch@4.0.8: + resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} + engines: {node: '>=8.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + + mimic-response@4.0.0: + resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mnemonic-id@3.2.7: + resolution: {integrity: sha512-kysx9gAGbvrzuFYxKkcRjnsg/NK61ovJOV4F1cHTRl9T5leg+bo6WI0pWIvOFh1Z/yDL0cjA5R3EEGPPLDv/XA==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + msgpackr-extract@3.0.3: + resolution: {integrity: sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==} + hasBin: true + + msgpackr@1.11.2: + resolution: {integrity: sha512-F9UngXRlPyWCDEASDpTf6c9uNhGPTqnTeLVt7bN+bU1eajoR/8V9ys2BRaV5C/e5ihE6sJ9uPIKaYt6bFuO32g==} + + msgpackr@1.8.5: + resolution: {integrity: sha512-mpPs3qqTug6ahbblkThoUY2DQdNXcm4IapwOS3Vm/87vmpzLVelvp9h3It1y9l1VPpiFLV11vfOXnmeEwiIXwg==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + + needle@3.3.1: + resolution: {integrity: sha512-6k0YULvhpw+RoLNiQCRKOl09Rv1dPLr8hHnVjHqdolKwDrdNyk+Hmrthi4lIGPPz3r39dLx0hsF5s40sZ3Us4Q==} + engines: {node: '>= 4.4.x'} + hasBin: true + + node-abi@3.71.0: + resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} + engines: {node: '>=10'} + + node-addon-api@2.0.2: + resolution: {integrity: sha512-Ntyt4AIXyaLIuMHF6IOoTakB3K+RWxwtsHNRxllEoA6vPwP9o4866g6YWDLUdnucilZhmkxiHwHr11gAENw+QA==} + + node-addon-api@4.3.0: + resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} + + node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-gyp-build-optional-packages@5.0.3: + resolution: {integrity: sha512-k75jcVzk5wnnc/FMxsf4udAoTEUv2jY3ycfdSd3yWu6Cnd1oee6/CfZJApyscA4FJOmdoixWwiwOyf16RzD5JA==} + hasBin: true + + node-gyp-build-optional-packages@5.0.6: + resolution: {integrity: sha512-2ZJErHG4du9G3/8IWl/l9Bp5BBFy63rno5GVmjQijvTuUZKsl6g8RB4KH/x3NLcV5ZBb4GsXmAuTYr6dRml3Gw==} + hasBin: true + + node-gyp-build-optional-packages@5.2.2: + resolution: {integrity: sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==} + hasBin: true + + node-gyp-build@4.8.2: + resolution: {integrity: sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==} + hasBin: true + + node-object-hash@3.0.0: + resolution: {integrity: sha512-jLF6tlyletktvSAawuPmH1SReP0YfZQ+tBrDiTCK+Ai7eXPMS9odi5xW/iKC7ZhrWJJ0Z5xYcW/x+1fVMn1Qvw==} + engines: {node: '>=16', pnpm: '>=8'} + + node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-url@8.0.1: + resolution: {integrity: sha512-IO9QvjUMWxPQQhs60oOu10CRkWCiZzSUkzbXGGV9pviYl1fXYcvkzQ5jV9z8Y6un8ARoVRl4EtC6v6jNqbaJ/w==} + engines: {node: '>=14.16'} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + + nullthrows@1.1.1: + resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ordered-binary@1.5.3: + resolution: {integrity: sha512-oGFr3T+pYdTGJ+YFEILMpS3es+GiIbs9h/XQrclBXUtd44ey7XwfsMzM31f64I1SQOawDoDr/D823kNCADI8TA==} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + p-cancelable@3.0.0: + resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} + engines: {node: '>=12.20'} + + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + + package-json@8.1.1: + resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} + engines: {node: '>=14.16'} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-node-version@1.0.1: + resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} + engines: {node: '>= 0.10'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + plasmo@0.89.4: + resolution: {integrity: sha512-vsoMe8ts0tyW27fZxwQLqWR/58NKqRepLFrZMVBH4ceSIyPDryfPpXzVxmBDH43odbiUVFdh8BGAt2ri2vQuGw==} + hasBin: true + + postcss-import@15.1.0: + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + + postcss-js@4.0.1: + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-nested@6.2.0: + resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + + postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + engines: {node: ^10 || ^12 || >=14} + + posthtml-parser@0.10.2: + resolution: {integrity: sha512-PId6zZ/2lyJi9LiKfe+i2xv57oEjJgWbsHGGANwos5AvdQp98i6AtamAl8gzSVFGfQ43Glb5D614cvZf012VKg==} + engines: {node: '>=12'} + + posthtml-parser@0.11.0: + resolution: {integrity: sha512-QecJtfLekJbWVo/dMAA+OSwY79wpRmbqS5TeXvXSX+f0c6pW4/SE6inzZ2qkU7oAMCPqIDkZDvd/bQsSFUnKyw==} + engines: {node: '>=12'} + + posthtml-render@3.0.0: + resolution: {integrity: sha512-z+16RoxK3fUPgwaIgH9NGnK1HKY9XIDpydky5eQGgAFVXTCSezalv9U2jQuNV+Z9qV1fDWNzldcw4eK0SSbqKA==} + engines: {node: '>=12'} + + posthtml@0.16.6: + resolution: {integrity: sha512-JcEmHlyLK/o0uGAlj65vgg+7LIms0xKXe60lcDOTU7oVX/3LuEuLwrQpW3VJ7de5TaFKiW4kWkaIpJL42FEgxQ==} + engines: {node: '>=12.0.0'} + + preact@10.24.3: + resolution: {integrity: sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==} + + prebuild-install@7.1.2: + resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} + engines: {node: '>=10'} + hasBin: true + + prettier-plugin-tailwindcss@0.6.8: + resolution: {integrity: sha512-dGu3kdm7SXPkiW4nzeWKCl3uoImdd5CTZEJGxyypEPL37Wj0HT2pLqjrvSei1nTeuQfO4PUfjeW5cTUNRLZ4sA==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-multiline-arrays: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-multiline-arrays: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + + process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + proto-list@1.2.4: + resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} + + prr@1.0.1: + resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==} + + pump@3.0.2: + resolution: {integrity: sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + qrcode.react@3.1.0: + resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + + rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-error-overlay@6.0.9: + resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==} + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-refresh@0.14.0: + resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} + engines: {node: '>=0.10.0'} + + react-refresh@0.9.0: + resolution: {integrity: sha512-Gvzk7OZpiqKSkxsQvO/mbTN1poglhmAV7gR/DdIrRrSMXraRQQlfikRJOr3Nb9GTMPC5kof948Zy6jJZIFtDvQ==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.28.0: + resolution: {integrity: sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.28.0: + resolution: {integrity: sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + engines: {node: '>= 14.16.0'} + + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + registry-auth-token@5.0.2: + resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} + engines: {node: '>=14'} + + registry-url@6.0.1: + resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} + engines: {node: '>=12'} + + resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + responselike@3.0.0: + resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} + engines: {node: '>=14.16'} + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rollup@3.29.5: + resolution: {integrity: sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==} + engines: {node: '>=14.18.0', npm: '>=8.0.0'} + hasBin: true + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.80.6: + resolution: {integrity: sha512-ccZgdHNiBF1NHBsWvacvT5rju3y1d/Eu+8Ex6c21nHp2lZGLBEtuwc415QfiI1PJa1TpCo3iXwwSRjRpn2Ckjg==} + engines: {node: '>=14.0.0'} + hasBin: true + + sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + sha.js@2.4.11: + resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==} + hasBin: true + + sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + + simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + srcset@4.0.0: + resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} + engines: {node: '>=12'} + + stable@0.1.8: + resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==} + deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility' + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + streamx@2.20.1: + resolution: {integrity: sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + svelte@4.2.2: + resolution: {integrity: sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==} + engines: {node: '>=16'} + + svg-parser@2.0.4: + resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} + + svgo@2.8.0: + resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==} + engines: {node: '>=10.13.0'} + hasBin: true + + swr@2.2.5: + resolution: {integrity: sha512-QtxqyclFeAsxEUeZIYmsaQ0UjimSq1RZ9Un7I68/0ClKK/U3LoyQunwkQfJZr2fc22DfIXLNDc2wFyTEikCUpg==} + peerDependencies: + react: ^16.11.0 || ^17.0.0 || ^18.0.0 + + tabbable@6.2.0: + resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + + tailwindcss@3.4.14: + resolution: {integrity: sha512-IcSvOcTRcUtQQ7ILQL5quRDg7Xs93PdJEk1ZLbhhvJc7uj/OAhYOnruEiwnGgBvUtaUAJ8/mhSw1o8L2jCiENA==} + engines: {node: '>=14.0.0'} + hasBin: true + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-fs@3.0.6: + resolution: {integrity: sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + + temp-dir@3.0.0: + resolution: {integrity: sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==} + engines: {node: '>=14.16'} + + tempy@3.1.0: + resolution: {integrity: sha512-7jDLIdD2Zp0bDe5r3D2qtkd1QOCacylBuL7oa4udvN6v2pqr4+LcCr67C8DR1zkpaZ8XosF5m1yQSabKAW6f2g==} + engines: {node: '>=14.16'} + + text-decoder@1.2.1: + resolution: {integrity: sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + timsort@0.3.0: + resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toggle-selection@1.0.6: + resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + ts-algebra@1.2.2: + resolution: {integrity: sha512-kloPhf1hq3JbCPOTYoOWDKxebWjNb2o/LKnNfkWhxVVisFFmMJPPdJeGoGmM+iRLyoXAR61e08Pb+vUXINg8aA==} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + tslib@2.4.1: + resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + tsup@7.2.0: + resolution: {integrity: sha512-vDHlczXbgUvY3rWvqFEbSqmC1L7woozbzngMqTtL2PGBODTtWlRwGDDawhvWzr5c1QjKe4OAKqJGfE1xeXUvtQ==} + engines: {node: '>=16.14'} + hasBin: true + peerDependencies: + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.1.0' + peerDependenciesMeta: + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@1.4.0: + resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} + engines: {node: '>=10'} + + type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + + typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + + unique-string@3.0.0: + resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} + engines: {node: '>=12'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + update-browserslist-db@1.1.1: + resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + use-sync-external-store@1.2.2: + resolution: {integrity: sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + utility-types@3.11.0: + resolution: {integrity: sha512-6Z7Ma2aVEWisaL6TvBCy7P8rm2LQoPv6dJ7ecIaIixHcwfbJ0x7mWdbcwlIM5IGQxPZSFYeqRCqlOOeKoJYMkw==} + engines: {node: '>= 4'} + + vue@3.3.4: + resolution: {integrity: sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + weak-lru-cache@1.2.2: + resolution: {integrity: sha512-DEAoo25RfSYMuTGc9vPJzZcZullwIqRDSI9LOy+fkCJPi6hykCnfKaXTuPBDuXAUcqHXyOgFtHNp/kB2FjYHbw==} + + webextension-polyfill@0.10.0: + resolution: {integrity: sha512-c5s35LgVa5tFaHhrZDnr3FpQpjj1BB+RXhLTYUxGqBVN460HkbM8TBtEqdXWbpTKfzwCcjAZVF7zXCYSKtcp9g==} + + webextension-polyfill@0.12.0: + resolution: {integrity: sha512-97TBmpoWJEE+3nFBQ4VocyCdLKfw54rFaJ6EVQYLBCXqCIpLSZkwGgASpv4oPt9gdKCJ80RJlcmNzNn008Ag6Q==} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + xxhash-wasm@0.4.2: + resolution: {integrity: sha512-/eyHVRJQCirEkSZ1agRSCwriMhwlyUcFkXD5TPVSLP+IPzjsqMVzZwdoczLp1SoQU0R3dxz1RpIK+4YNQbCVOA==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yaml@2.6.0: + resolution: {integrity: sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==} + engines: {node: '>= 14'} + hasBin: true + +snapshots: + + '@alloc/quick-lru@5.2.0': {} + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.26.2': + dependencies: + '@babel/helper-validator-identifier': 7.25.9 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/compat-data@7.26.2': {} + + '@babel/core@7.26.0': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/helper-compilation-targets': 7.25.9 + '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) + '@babel/helpers': 7.26.0 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + convert-source-map: 2.0.0 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/generator@7.26.2': + dependencies: + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + + '@babel/helper-compilation-targets@7.25.9': + dependencies: + '@babel/compat-data': 7.26.2 + '@babel/helper-validator-option': 7.25.9 + browserslist: 4.24.2 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-module-imports@7.25.9': + dependencies: + '@babel/traverse': 7.25.9 + '@babel/types': 7.26.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@babel/helper-module-imports': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + '@babel/traverse': 7.25.9 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.25.9': {} + + '@babel/helper-validator-identifier@7.25.9': {} + + '@babel/helper-validator-option@7.25.9': {} + + '@babel/helpers@7.26.0': + dependencies: + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + + '@babel/parser@7.26.2': + dependencies: + '@babel/types': 7.26.0 + + '@babel/runtime@7.26.0': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/types': 7.26.0 + + '@babel/traverse@7.25.9': + dependencies: + '@babel/code-frame': 7.26.2 + '@babel/generator': 7.26.2 + '@babel/parser': 7.26.2 + '@babel/template': 7.25.9 + '@babel/types': 7.26.0 + debug: 4.3.7 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.26.0': + dependencies: + '@babel/helper-string-parser': 7.25.9 + '@babel/helper-validator-identifier': 7.25.9 + + '@clerk/chrome-extension@file:../../packages/chrome-extension(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/clerk-js': 5.33.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/clerk-react': 5.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/shared': 2.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + webextension-polyfill: 0.10.0 + transitivePeerDependencies: + - '@types/react' + - supports-color + + '@clerk/clerk-js@5.33.1(@types/react@18.3.12)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/localizations': 3.6.2 + '@clerk/shared': 2.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.32.0 + '@coinbase/wallet-sdk': 4.0.4 + '@emotion/cache': 11.11.0 + '@emotion/react': 11.11.1(@types/react@18.3.12)(react@18.3.1) + '@floating-ui/react': 0.25.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@formkit/auto-animate': 0.8.2 + '@swc/helpers': 0.5.13 + '@zxcvbn-ts/core': 3.0.4 + '@zxcvbn-ts/language-common': 3.0.4 + browser-tabs-lock: 1.2.15 + copy-to-clipboard: 3.3.3 + core-js: 3.26.1 + crypto-js: 4.2.0 + dequal: 2.0.3 + qrcode.react: 3.1.0(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + regenerator-runtime: 0.13.11 + transitivePeerDependencies: + - '@types/react' + - supports-color + + '@clerk/clerk-react@5.15.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/shared': 2.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@clerk/types': 4.32.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.4.1 + + '@clerk/localizations@3.6.2': + dependencies: + '@clerk/types': 4.32.0 + + '@clerk/shared@2.12.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@clerk/types': 4.32.0 + dequal: 2.0.3 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.5 + std-env: 3.7.0 + swr: 2.2.5(react@18.3.1) + optionalDependencies: + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@clerk/types@4.32.0': + dependencies: + csstype: 3.1.1 + + '@coinbase/wallet-sdk@4.0.4': + dependencies: + buffer: 6.0.3 + clsx: 1.2.1 + eventemitter3: 5.0.1 + keccak: 3.0.4 + preact: 10.24.3 + sha.js: 2.4.11 + + '@emotion/babel-plugin@11.12.0': + dependencies: + '@babel/helper-module-imports': 7.25.9 + '@babel/runtime': 7.26.0 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.2 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.11.0': + dependencies: + '@emotion/memoize': 0.8.1 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.3.1 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/memoize@0.8.1': {} + + '@emotion/memoize@0.9.0': {} + + '@emotion/react@11.11.1(@types/react@18.3.12)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.26.0 + '@emotion/babel-plugin': 11.12.0 + '@emotion/cache': 11.11.0 + '@emotion/serialize': 1.3.2 + '@emotion/use-insertion-effect-with-fallbacks': 1.1.0(react@18.3.1) + '@emotion/utils': 1.4.1 + '@emotion/weak-memoize': 0.3.1 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.12 + transitivePeerDependencies: + - supports-color + + '@emotion/serialize@1.3.2': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.1 + csstype: 3.1.3 + + '@emotion/sheet@1.4.0': {} + + '@emotion/unitless@0.10.0': {} + + '@emotion/use-insertion-effect-with-fallbacks@1.1.0(react@18.3.1)': + dependencies: + react: 18.3.1 + + '@emotion/utils@1.4.1': {} + + '@emotion/weak-memoize@0.3.1': {} + + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-x64@0.18.20': + optional: true + + '@expo/spawn-async@1.7.2': + dependencies: + cross-spawn: 7.0.5 + + '@floating-ui/core@1.6.8': + dependencies: + '@floating-ui/utils': 0.2.8 + + '@floating-ui/dom@1.6.12': + dependencies: + '@floating-ui/core': 1.6.8 + '@floating-ui/utils': 0.2.8 + + '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.6.12 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/react@0.25.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@floating-ui/utils': 0.1.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tabbable: 6.2.0 + + '@floating-ui/utils@0.1.6': {} + + '@floating-ui/utils@0.2.8': {} + + '@formkit/auto-animate@0.8.2': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.5.0': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + + '@lezer/common@0.15.12': {} + + '@lezer/common@1.2.3': {} + + '@lezer/lr@0.15.8': + dependencies: + '@lezer/common': 0.15.12 + + '@lezer/lr@1.4.2': + dependencies: + '@lezer/common': 1.2.3 + + '@ljharb/through@2.3.13': + dependencies: + call-bind: 1.0.7 + + '@lmdb/lmdb-darwin-arm64@2.5.2': + optional: true + + '@lmdb/lmdb-darwin-arm64@2.7.11': + optional: true + + '@lmdb/lmdb-darwin-x64@2.5.2': + optional: true + + '@lmdb/lmdb-darwin-x64@2.7.11': + optional: true + + '@lmdb/lmdb-linux-arm64@2.5.2': + optional: true + + '@lmdb/lmdb-linux-arm64@2.7.11': + optional: true + + '@lmdb/lmdb-linux-arm@2.5.2': + optional: true + + '@lmdb/lmdb-linux-arm@2.7.11': + optional: true + + '@lmdb/lmdb-linux-x64@2.5.2': + optional: true + + '@lmdb/lmdb-linux-x64@2.7.11': + optional: true + + '@lmdb/lmdb-win32-x64@2.5.2': + optional: true + + '@lmdb/lmdb-win32-x64@2.7.11': + optional: true + + '@mischnic/json-sourcemap@0.1.0': + dependencies: + '@lezer/common': 0.15.12 + '@lezer/lr': 0.15.8 + json5: 2.2.3 + + '@mischnic/json-sourcemap@0.1.1': + dependencies: + '@lezer/common': 1.2.3 + '@lezer/lr': 1.4.2 + json5: 2.2.3 + + '@msgpackr-extract/msgpackr-extract-darwin-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-darwin-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-arm@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-linux-x64@3.0.3': + optional: true + + '@msgpackr-extract/msgpackr-extract-win32-x64@3.0.3': + optional: true + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@parcel/bundler-default@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/cache@2.8.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/logger': 2.8.3 + '@parcel/utils': 2.8.3 + lmdb: 2.5.2 + + '@parcel/cache@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/logger': 2.9.3 + '@parcel/utils': 2.9.3 + lmdb: 2.7.11 + + '@parcel/codeframe@2.8.3': + dependencies: + chalk: 4.1.2 + + '@parcel/codeframe@2.9.3': + dependencies: + chalk: 4.1.2 + + '@parcel/compressor-raw@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/config-default@2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.13)(postcss@8.4.49)(typescript@5.2.2)': + dependencies: + '@parcel/bundler-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/core': 2.9.3 + '@parcel/namer-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-htmlnano': 2.9.3(@parcel/core@2.9.3)(postcss@8.4.49)(typescript@5.2.2) + '@parcel/optimizer-image': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-svgo': 2.9.3(@parcel/core@2.9.3) + '@parcel/optimizer-swc': 2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.13) + '@parcel/packager-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-html': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/packager-svg': 2.9.3(@parcel/core@2.9.3) + '@parcel/reporter-dev-server': 2.9.3(@parcel/core@2.9.3) + '@parcel/resolver-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-browser-hmr': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-react-refresh': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-service-worker': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-babel': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-html': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-image': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-json': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-postcss': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-posthtml': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-react-refresh-wrap': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-svg': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@swc/helpers' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + + '@parcel/core@2.9.3': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/profiler': 2.9.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + abortcontroller-polyfill: 1.7.6 + base-x: 3.0.10 + browserslist: 4.24.2 + clone: 2.1.2 + dotenv: 7.0.0 + dotenv-expand: 5.1.0 + json5: 2.2.3 + msgpackr: 1.11.2 + nullthrows: 1.1.1 + semver: 7.5.4 + + '@parcel/diagnostic@2.8.3': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + + '@parcel/diagnostic@2.9.3': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + nullthrows: 1.1.1 + + '@parcel/events@2.8.3': {} + + '@parcel/events@2.9.3': {} + + '@parcel/fs-search@2.8.3': + dependencies: + detect-libc: 1.0.3 + + '@parcel/fs-search@2.9.3': {} + + '@parcel/fs@2.8.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs-search': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + '@parcel/watcher': 2.5.0 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + + '@parcel/fs@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/fs-search': 2.9.3 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/watcher': 2.5.0 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + + '@parcel/graph@2.9.3': + dependencies: + nullthrows: 1.1.1 + + '@parcel/hash@2.8.3': + dependencies: + detect-libc: 1.0.3 + xxhash-wasm: 0.4.2 + + '@parcel/hash@2.9.3': + dependencies: + xxhash-wasm: 0.4.2 + + '@parcel/logger@2.8.3': + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/events': 2.8.3 + + '@parcel/logger@2.9.3': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + + '@parcel/markdown-ansi@2.8.3': + dependencies: + chalk: 4.1.2 + + '@parcel/markdown-ansi@2.9.3': + dependencies: + chalk: 4.1.2 + + '@parcel/namer-default@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/node-resolver-core@3.0.3(@parcel/core@2.9.3)': + dependencies: + '@mischnic/json-sourcemap': 0.1.1 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-css@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.24.2 + lightningcss: 1.28.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-data-url@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + isbinaryfile: 4.0.10 + mime: 2.6.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-htmlnano@2.9.3(@parcel/core@2.9.3)(postcss@8.4.49)(typescript@5.2.2)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + htmlnano: 2.1.1(postcss@8.4.49)(svgo@2.8.0)(typescript@5.2.2) + nullthrows: 1.1.1 + posthtml: 0.16.6 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - typescript + - uncss + + '@parcel/optimizer-image@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + + '@parcel/optimizer-svgo@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/optimizer-swc@2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.13)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@swc/core': 1.9.1(@swc/helpers@0.5.13) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + - '@swc/helpers' + + '@parcel/package-manager@2.8.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + semver: 5.7.2 + + '@parcel/package-manager@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/logger': 2.9.3 + '@parcel/node-resolver-core': 3.0.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + semver: 7.5.4 + + '@parcel/packager-css@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-html@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-js@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + globals: 13.24.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-raw@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/packager-svg@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/plugin@2.8.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/plugin@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/profiler@2.9.3': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + chrome-trace-event: 1.0.4 + + '@parcel/reporter-bundle-buddy@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/reporter-dev-server@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/resolver-default@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/node-resolver-core': 3.0.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-browser-hmr@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-js@2.8.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-js@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-react-refresh@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + react-error-overlay: 6.0.9 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/runtime-service-worker@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/source-map@2.1.1': + dependencies: + detect-libc: 1.0.3 + + '@parcel/transformer-babel@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.24.2 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-css@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + browserslist: 4.24.2 + lightningcss: 1.28.1 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-graphql@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + graphql: 15.9.0 + graphql-import-macro: 1.0.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-html@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-image@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + + '@parcel/transformer-inline-string@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-js@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + '@swc/helpers': 0.5.13 + browserslist: 4.24.2 + nullthrows: 1.1.1 + regenerator-runtime: 0.13.11 + semver: 7.5.4 + + '@parcel/transformer-json@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-less@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + less: 4.2.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-postcss@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-posthtml@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-raw@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-react-refresh-wrap@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-sass@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + sass: 1.80.6 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-svg-react@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@svgr/core': 6.5.1 + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1) + transitivePeerDependencies: + - '@parcel/core' + - supports-color + + '@parcel/transformer-svg@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 7.5.4 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/transformer-worklet@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/types@2.8.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/cache': 2.8.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.8.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.8.3(@parcel/core@2.9.3) + utility-types: 3.11.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/types@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + utility-types: 3.11.0 + transitivePeerDependencies: + - '@parcel/core' + + '@parcel/utils@2.8.3': + dependencies: + '@parcel/codeframe': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/markdown-ansi': 2.8.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + + '@parcel/utils@2.9.3': + dependencies: + '@parcel/codeframe': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/markdown-ansi': 2.9.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + nullthrows: 1.1.1 + + '@parcel/watcher-android-arm64@2.2.0': + optional: true + + '@parcel/watcher-android-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.2.0': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.0': + optional: true + + '@parcel/watcher-darwin-x64@2.2.0': + optional: true + + '@parcel/watcher-darwin-x64@2.5.0': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.2.0': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.2.0': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.2.0': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.2.0': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.2.0': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.0': + optional: true + + '@parcel/watcher-win32-arm64@2.2.0': + optional: true + + '@parcel/watcher-win32-arm64@2.5.0': + optional: true + + '@parcel/watcher-win32-ia32@2.5.0': + optional: true + + '@parcel/watcher-win32-x64@2.2.0': + optional: true + + '@parcel/watcher-win32-x64@2.5.0': + optional: true + + '@parcel/watcher@2.2.0': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.2.0 + '@parcel/watcher-darwin-arm64': 2.2.0 + '@parcel/watcher-darwin-x64': 2.2.0 + '@parcel/watcher-linux-arm-glibc': 2.2.0 + '@parcel/watcher-linux-arm64-glibc': 2.2.0 + '@parcel/watcher-linux-arm64-musl': 2.2.0 + '@parcel/watcher-linux-x64-glibc': 2.2.0 + '@parcel/watcher-linux-x64-musl': 2.2.0 + '@parcel/watcher-win32-arm64': 2.2.0 + '@parcel/watcher-win32-x64': 2.2.0 + + '@parcel/watcher@2.5.0': + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.8 + node-addon-api: 7.1.1 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.0 + '@parcel/watcher-darwin-arm64': 2.5.0 + '@parcel/watcher-darwin-x64': 2.5.0 + '@parcel/watcher-freebsd-x64': 2.5.0 + '@parcel/watcher-linux-arm-glibc': 2.5.0 + '@parcel/watcher-linux-arm-musl': 2.5.0 + '@parcel/watcher-linux-arm64-glibc': 2.5.0 + '@parcel/watcher-linux-arm64-musl': 2.5.0 + '@parcel/watcher-linux-x64-glibc': 2.5.0 + '@parcel/watcher-linux-x64-musl': 2.5.0 + '@parcel/watcher-win32-arm64': 2.5.0 + '@parcel/watcher-win32-ia32': 2.5.0 + '@parcel/watcher-win32-x64': 2.5.0 + + '@parcel/workers@2.8.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3(@parcel/core@2.9.3) + '@parcel/utils': 2.8.3 + chrome-trace-event: 1.0.4 + nullthrows: 1.1.1 + + '@parcel/workers@2.9.3(@parcel/core@2.9.3)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/profiler': 2.9.3 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@plasmohq/consolidate@0.17.0(lodash@4.17.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + bluebird: 3.7.2 + optionalDependencies: + lodash: 4.17.21 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@plasmohq/init@0.7.0': {} + + '@plasmohq/parcel-bundler@0.5.6': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + + '@plasmohq/parcel-compressor-utf8@0.1.1(@parcel/core@2.9.3)': + dependencies: + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + transitivePeerDependencies: + - '@parcel/core' + + '@plasmohq/parcel-config@0.41.1(@swc/core@1.9.1(@swc/helpers@0.5.13))(@swc/helpers@0.5.13)(lodash@4.17.21)(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2)': + dependencies: + '@parcel/compressor-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/config-default': 2.9.3(@parcel/core@2.9.3)(@swc/helpers@0.5.13)(postcss@8.4.49)(typescript@5.2.2) + '@parcel/core': 2.9.3 + '@parcel/optimizer-data-url': 2.9.3(@parcel/core@2.9.3) + '@parcel/reporter-bundle-buddy': 2.9.3(@parcel/core@2.9.3) + '@parcel/resolver-default': 2.9.3(@parcel/core@2.9.3) + '@parcel/runtime-js': 2.8.3(@parcel/core@2.9.3) + '@parcel/runtime-service-worker': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/transformer-babel': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-css': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-graphql': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-inline-string': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-js': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-less': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-postcss': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-raw': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-react-refresh-wrap': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-sass': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-svg-react': 2.9.3(@parcel/core@2.9.3) + '@parcel/transformer-worklet': 2.9.3(@parcel/core@2.9.3) + '@plasmohq/parcel-bundler': 0.5.6 + '@plasmohq/parcel-compressor-utf8': 0.1.1(@parcel/core@2.9.3) + '@plasmohq/parcel-namer-manifest': 0.3.12 + '@plasmohq/parcel-optimizer-encapsulate': 0.0.8 + '@plasmohq/parcel-optimizer-es': 0.4.1(@swc/helpers@0.5.13) + '@plasmohq/parcel-packager': 0.6.15 + '@plasmohq/parcel-resolver': 0.14.1 + '@plasmohq/parcel-resolver-post': 0.4.5(@swc/core@1.9.1(@swc/helpers@0.5.13))(postcss@8.4.49) + '@plasmohq/parcel-runtime': 0.25.1 + '@plasmohq/parcel-transformer-inject-env': 0.2.12 + '@plasmohq/parcel-transformer-inline-css': 0.3.11 + '@plasmohq/parcel-transformer-manifest': 0.20.1 + '@plasmohq/parcel-transformer-svelte': 0.6.0 + '@plasmohq/parcel-transformer-vue': 0.5.0(lodash@4.17.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - cssnano + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - postcss + - pug + - purgecss + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - relateurl + - slm + - squirrelly + - srcset + - supports-color + - teacup + - templayed + - terser + - then-pug + - tinyliquid + - toffee + - ts-node + - twig + - twing + - typescript + - uncss + - underscore + - vash + - velocityjs + - walrus + - whiskers + + '@plasmohq/parcel-core@0.1.10': + dependencies: + '@parcel/cache': 2.9.3(@parcel/core@2.9.3) + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/events': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/graph': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/logger': 2.9.3 + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@parcel/watcher': 2.2.0 + '@parcel/workers': 2.9.3(@parcel/core@2.9.3) + abortcontroller-polyfill: 1.7.5 + nullthrows: 1.1.1 + + '@plasmohq/parcel-namer-manifest@0.3.12': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + + '@plasmohq/parcel-optimizer-encapsulate@0.0.8': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + + '@plasmohq/parcel-optimizer-es@0.4.1(@swc/helpers@0.5.13)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + '@swc/core': 1.3.96(@swc/helpers@0.5.13) + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@swc/helpers' + + '@plasmohq/parcel-packager@0.6.15': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + nullthrows: 1.1.1 + + '@plasmohq/parcel-resolver-post@0.4.5(@swc/core@1.9.1(@swc/helpers@0.5.13))(postcss@8.4.49)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + tsup: 7.2.0(@swc/core@1.9.1(@swc/helpers@0.5.13))(postcss@8.4.49)(typescript@5.2.2) + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - postcss + - supports-color + - ts-node + + '@plasmohq/parcel-resolver@0.14.1': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/hash': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + fast-glob: 3.3.2 + fs-extra: 11.1.1 + got: 13.0.0 + + '@plasmohq/parcel-runtime@0.25.1': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@types/trusted-types': 2.0.7 + react-refresh: 0.14.0 + + '@plasmohq/parcel-transformer-inject-env@0.2.12': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + + '@plasmohq/parcel-transformer-inline-css@0.3.11': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + browserslist: 4.22.1 + lightningcss: 1.21.8 + + '@plasmohq/parcel-transformer-manifest@0.20.1': + dependencies: + '@mischnic/json-sourcemap': 0.1.0 + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + content-security-policy-parser: 0.4.1 + json-schema-to-ts: 2.9.2 + nullthrows: 1.1.1 + + '@plasmohq/parcel-transformer-svelte@0.6.0': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.9.3 + svelte: 4.2.2 + + '@plasmohq/parcel-transformer-vue@0.5.0(lodash@4.17.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@parcel/core': 2.9.3 + '@parcel/diagnostic': 2.9.3 + '@parcel/plugin': 2.9.3(@parcel/core@2.9.3) + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.9.3(@parcel/core@2.9.3) + '@parcel/utils': 2.9.3 + '@plasmohq/consolidate': 0.17.0(lodash@4.17.21)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@vue/compiler-sfc': 3.3.4 + nullthrows: 1.1.1 + semver: 7.5.4 + vue: 3.3.4 + transitivePeerDependencies: + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - pug + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - slm + - squirrelly + - teacup + - templayed + - then-pug + - tinyliquid + - toffee + - twig + - twing + - underscore + - vash + - velocityjs + - walrus + - whiskers + + '@pnpm/config.env-replace@1.1.0': {} + + '@pnpm/network.ca-file@1.0.2': + dependencies: + graceful-fs: 4.2.10 + + '@pnpm/npm-conf@2.3.1': + dependencies: + '@pnpm/config.env-replace': 1.1.0 + '@pnpm/network.ca-file': 1.0.2 + config-chain: 1.1.13 + + '@remix-run/router@1.21.0': {} + + '@sindresorhus/is@5.6.0': {} + + '@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + + '@svgr/babel-preset@6.5.1(@babel/core@7.26.0)': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0) + '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.26.0) + '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.26.0) + '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.26.0) + + '@svgr/core@6.5.1': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-preset': 6.5.1(@babel/core@7.26.0) + '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1) + camelcase: 6.3.0 + cosmiconfig: 7.1.0 + transitivePeerDependencies: + - supports-color + + '@svgr/hast-util-to-babel-ast@6.5.1': + dependencies: + '@babel/types': 7.26.0 + entities: 4.5.0 + + '@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1)': + dependencies: + '@babel/core': 7.26.0 + '@svgr/babel-preset': 6.5.1(@babel/core@7.26.0) + '@svgr/core': 6.5.1 + '@svgr/hast-util-to-babel-ast': 6.5.1 + svg-parser: 2.0.4 + transitivePeerDependencies: + - supports-color + + '@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1)': + dependencies: + '@svgr/core': 6.5.1 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + svgo: 2.8.0 + + '@swc/core-darwin-arm64@1.3.96': + optional: true + + '@swc/core-darwin-arm64@1.9.1': + optional: true + + '@swc/core-darwin-x64@1.3.96': + optional: true + + '@swc/core-darwin-x64@1.9.1': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.3.96': + optional: true + + '@swc/core-linux-arm-gnueabihf@1.9.1': + optional: true + + '@swc/core-linux-arm64-gnu@1.3.96': + optional: true + + '@swc/core-linux-arm64-gnu@1.9.1': + optional: true + + '@swc/core-linux-arm64-musl@1.3.96': + optional: true + + '@swc/core-linux-arm64-musl@1.9.1': + optional: true + + '@swc/core-linux-x64-gnu@1.3.96': + optional: true + + '@swc/core-linux-x64-gnu@1.9.1': + optional: true + + '@swc/core-linux-x64-musl@1.3.96': + optional: true + + '@swc/core-linux-x64-musl@1.9.1': + optional: true + + '@swc/core-win32-arm64-msvc@1.3.96': + optional: true + + '@swc/core-win32-arm64-msvc@1.9.1': + optional: true + + '@swc/core-win32-ia32-msvc@1.3.96': + optional: true + + '@swc/core-win32-ia32-msvc@1.9.1': + optional: true + + '@swc/core-win32-x64-msvc@1.3.96': + optional: true + + '@swc/core-win32-x64-msvc@1.9.1': + optional: true + + '@swc/core@1.3.96(@swc/helpers@0.5.13)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.12 + optionalDependencies: + '@swc/core-darwin-arm64': 1.3.96 + '@swc/core-darwin-x64': 1.3.96 + '@swc/core-linux-arm-gnueabihf': 1.3.96 + '@swc/core-linux-arm64-gnu': 1.3.96 + '@swc/core-linux-arm64-musl': 1.3.96 + '@swc/core-linux-x64-gnu': 1.3.96 + '@swc/core-linux-x64-musl': 1.3.96 + '@swc/core-win32-arm64-msvc': 1.3.96 + '@swc/core-win32-ia32-msvc': 1.3.96 + '@swc/core-win32-x64-msvc': 1.3.96 + '@swc/helpers': 0.5.13 + + '@swc/core@1.9.1(@swc/helpers@0.5.13)': + dependencies: + '@swc/counter': 0.1.3 + '@swc/types': 0.1.14 + optionalDependencies: + '@swc/core-darwin-arm64': 1.9.1 + '@swc/core-darwin-x64': 1.9.1 + '@swc/core-linux-arm-gnueabihf': 1.9.1 + '@swc/core-linux-arm64-gnu': 1.9.1 + '@swc/core-linux-arm64-musl': 1.9.1 + '@swc/core-linux-x64-gnu': 1.9.1 + '@swc/core-linux-x64-musl': 1.9.1 + '@swc/core-win32-arm64-msvc': 1.9.1 + '@swc/core-win32-ia32-msvc': 1.9.1 + '@swc/core-win32-x64-msvc': 1.9.1 + '@swc/helpers': 0.5.13 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.13': + dependencies: + tslib: 2.8.1 + + '@swc/types@0.1.12': + dependencies: + '@swc/counter': 0.1.3 + + '@swc/types@0.1.14': + dependencies: + '@swc/counter': 0.1.3 + + '@szmarczak/http-timer@5.0.1': + dependencies: + defer-to-connect: 2.0.1 + + '@trysound/sax@0.2.0': {} + + '@types/chrome@0.0.280': + dependencies: + '@types/filesystem': 0.0.36 + '@types/har-format': 1.2.16 + + '@types/estree@1.0.6': {} + + '@types/filesystem@0.0.36': + dependencies: + '@types/filewriter': 0.0.33 + + '@types/filewriter@0.0.33': {} + + '@types/har-format@1.2.16': {} + + '@types/http-cache-semantics@4.0.4': {} + + '@types/json-schema@7.0.15': {} + + '@types/node@20.16.14': + dependencies: + undici-types: 6.19.8 + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.13': {} + + '@types/react-dom@18.3.1': + dependencies: + '@types/react': 18.3.12 + + '@types/react@18.3.12': + dependencies: + '@types/prop-types': 15.7.13 + csstype: 3.1.3 + + '@types/trusted-types@2.0.7': {} + + '@types/webextension-polyfill@0.12.1': {} + + '@vue/compiler-core@3.3.4': + dependencies: + '@babel/parser': 7.26.2 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.3.4': + dependencies: + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/compiler-sfc@3.3.4': + dependencies: + '@babel/parser': 7.26.2 + '@vue/compiler-core': 3.3.4 + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-ssr': 3.3.4 + '@vue/reactivity-transform': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.12 + postcss: 8.4.49 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.3.4': + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/reactivity-transform@3.3.4': + dependencies: + '@babel/parser': 7.26.2 + '@vue/compiler-core': 3.3.4 + '@vue/shared': 3.3.4 + estree-walker: 2.0.2 + magic-string: 0.30.12 + + '@vue/reactivity@3.3.4': + dependencies: + '@vue/shared': 3.3.4 + + '@vue/runtime-core@3.3.4': + dependencies: + '@vue/reactivity': 3.3.4 + '@vue/shared': 3.3.4 + + '@vue/runtime-dom@3.3.4': + dependencies: + '@vue/runtime-core': 3.3.4 + '@vue/shared': 3.3.4 + csstype: 3.1.3 + + '@vue/server-renderer@3.3.4(vue@3.3.4)': + dependencies: + '@vue/compiler-ssr': 3.3.4 + '@vue/shared': 3.3.4 + vue: 3.3.4 + + '@vue/shared@3.3.4': {} + + '@zxcvbn-ts/core@3.0.4': + dependencies: + fastest-levenshtein: 1.0.16 + + '@zxcvbn-ts/language-common@3.0.4': {} + + abortcontroller-polyfill@1.7.5: {} + + abortcontroller-polyfill@1.7.6: {} + + acorn@8.14.0: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.1.0: {} + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@5.0.2: {} + + argparse@2.0.1: {} + + aria-query@5.3.2: {} + + array-union@2.1.0: {} + + axobject-query@3.2.4: {} + + b4a@1.6.7: {} + + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.26.0 + cosmiconfig: 7.1.0 + resolve: 1.22.8 + + balanced-match@1.0.2: {} + + bare-events@2.5.0: + optional: true + + bare-fs@2.3.5: + dependencies: + bare-events: 2.5.0 + bare-path: 2.1.3 + bare-stream: 2.3.2 + optional: true + + bare-os@2.4.4: + optional: true + + bare-path@2.1.3: + dependencies: + bare-os: 2.4.4 + optional: true + + bare-stream@2.3.2: + dependencies: + streamx: 2.20.1 + optional: true + + base-x@3.0.10: + dependencies: + safe-buffer: 5.2.1 + + base64-js@1.5.1: {} + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + bluebird@3.7.2: {} + + boolbase@1.0.0: {} + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.3: + dependencies: + fill-range: 7.1.1 + + browser-tabs-lock@1.2.15: + dependencies: + lodash: 4.17.21 + + browserslist@4.22.1: + dependencies: + caniuse-lite: 1.0.30001678 + electron-to-chromium: 1.5.53 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.22.1) + + browserslist@4.24.2: + dependencies: + caniuse-lite: 1.0.30001678 + electron-to-chromium: 1.5.53 + node-releases: 2.0.18 + update-browserslist-db: 1.1.1(browserslist@4.24.2) + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + bundle-require@4.2.1(esbuild@0.18.20): + dependencies: + esbuild: 0.18.20 + load-tsconfig: 0.2.5 + + cac@6.7.14: {} + + cacheable-lookup@7.0.0: {} + + cacheable-request@10.2.14: + dependencies: + '@types/http-cache-semantics': 4.0.4 + get-stream: 6.0.1 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + mimic-response: 4.0.0 + normalize-url: 8.0.1 + responselike: 3.0.0 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camelcase-css@2.0.1: {} + + camelcase@6.3.0: {} + + caniuse-lite@1.0.30001678: {} + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + change-case@5.1.2: {} + + chardet@0.7.0: {} + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chokidar@4.0.1: + dependencies: + readdirp: 4.0.2 + + chownr@1.1.4: {} + + chrome-trace-event@1.0.4: {} + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + client-only@0.0.1: {} + + clone@1.0.4: {} + + clone@2.1.2: {} + + clsx@1.2.1: {} + + code-red@1.0.4: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.14.0 + estree-walker: 3.0.3 + periscopic: 3.1.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + color-string@1.9.1: + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + + color@4.2.3: + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + + commander@4.1.1: {} + + commander@7.2.0: {} + + config-chain@1.1.13: + dependencies: + ini: 1.3.8 + proto-list: 1.2.4 + + content-security-policy-parser@0.4.1: {} + + convert-source-map@1.9.0: {} + + convert-source-map@2.0.0: {} + + copy-anything@2.0.6: + dependencies: + is-what: 3.14.1 + + copy-to-clipboard@3.3.3: + dependencies: + toggle-selection: 1.0.6 + + core-js@3.26.1: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + cosmiconfig@9.0.0(typescript@5.2.2): + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + optionalDependencies: + typescript: 5.2.2 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + cross-spawn@7.0.5: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + crypto-js@4.2.0: {} + + crypto-random-string@4.0.0: + dependencies: + type-fest: 1.4.0 + + css-select@4.3.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + + css-tree@1.1.3: + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + + css-tree@2.3.1: + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.1 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + csso@4.2.0: + dependencies: + css-tree: 1.1.3 + + csstype@3.1.1: {} + + csstype@3.1.3: {} + + debug@4.3.7: + dependencies: + ms: 2.1.3 + + decompress-response@6.0.0: + dependencies: + mimic-response: 3.1.0 + + deep-extend@0.6.0: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + defer-to-connect@2.0.1: {} + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + dequal@2.0.3: {} + + detect-libc@1.0.3: {} + + detect-libc@2.0.3: {} + + didyoumean@1.2.2: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + dlv@1.1.3: {} + + dom-serializer@1.4.1: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + + domelementtype@2.3.0: {} + + domhandler@4.3.1: + dependencies: + domelementtype: 2.3.0 + + domutils@2.8.0: + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + + dotenv-expand@10.0.0: {} + + dotenv-expand@5.1.0: {} + + dotenv@16.3.1: {} + + dotenv@7.0.0: {} + + eastasianwidth@0.2.0: {} + + electron-to-chromium@1.5.53: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + entities@2.2.0: {} + + entities@3.0.1: {} + + entities@4.5.0: {} + + env-paths@2.2.1: {} + + errno@0.1.8: + dependencies: + prr: 1.0.1 + optional: true + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + escalade@3.2.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + estree-walker@2.0.2: {} + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.6 + + eventemitter3@5.0.1: {} + + events@3.3.0: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.5 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + expand-template@2.0.3: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-fifo@1.3.2: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.8 + + fastest-levenshtein@1.0.16: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fflate@0.8.1: {} + + figures@5.0.0: + dependencies: + escape-string-regexp: 5.0.0 + is-unicode-supported: 1.3.0 + + fill-range@7.1.1: + dependencies: + to-regex-range: 5.0.1 + + find-root@1.1.0: {} + + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data-encoder@2.1.4: {} + + fs-constants@1.0.0: {} + + fs-extra@11.1.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + gensync@1.0.0-beta.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-port@7.0.0: {} + + get-stream@6.0.1: {} + + github-from-package@0.0.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob-to-regexp@0.4.1: {} + + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + got@12.6.1: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + got@13.0.0: + dependencies: + '@sindresorhus/is': 5.6.0 + '@szmarczak/http-timer': 5.0.1 + cacheable-lookup: 7.0.0 + cacheable-request: 10.2.14 + decompress-response: 6.0.0 + form-data-encoder: 2.1.4 + get-stream: 6.0.1 + http2-wrapper: 2.2.1 + lowercase-keys: 3.0.0 + p-cancelable: 3.0.0 + responselike: 3.0.0 + + graceful-fs@4.2.10: {} + + graceful-fs@4.2.11: {} + + graphql-import-macro@1.0.0: + dependencies: + graphql: 15.9.0 + + graphql@15.9.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + + htmlnano@2.1.1(postcss@8.4.49)(svgo@2.8.0)(typescript@5.2.2): + dependencies: + cosmiconfig: 9.0.0(typescript@5.2.2) + posthtml: 0.16.6 + timsort: 0.3.0 + optionalDependencies: + postcss: 8.4.49 + svgo: 2.8.0 + transitivePeerDependencies: + - typescript + + htmlparser2@7.2.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + + http-cache-semantics@4.1.1: {} + + http2-wrapper@2.2.1: + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + + human-signals@2.1.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + optional: true + + ieee754@1.2.1: {} + + ignore@5.2.4: {} + + image-size@0.5.5: + optional: true + + immutable@4.3.7: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + inquirer@9.2.12: + dependencies: + '@ljharb/through': 2.3.13 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + figures: 5.0.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + is-arrayish@0.2.1: {} + + is-arrayish@0.3.2: {} + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-core-module@2.15.1: + dependencies: + hasown: 2.0.2 + + is-extglob@2.1.1: {} + + is-fullwidth-code-point@3.0.0: {} + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-interactive@1.0.0: {} + + is-json@2.0.1: {} + + is-number@7.0.0: {} + + is-path-inside@4.0.0: {} + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.6 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@1.3.0: {} + + is-what@3.14.1: {} + + isbinaryfile@4.0.10: {} + + isexe@2.0.0: {} + + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + jiti@1.21.6: {} + + joycon@3.1.1: {} + + js-cookie@3.0.5: {} + + js-tokens@4.0.0: {} + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsesc@3.0.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-schema-to-ts@2.9.2: + dependencies: + '@babel/runtime': 7.26.0 + '@types/json-schema': 7.0.15 + ts-algebra: 1.2.2 + + json5@2.2.3: {} + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + keccak@3.0.4: + dependencies: + node-addon-api: 2.0.2 + node-gyp-build: 4.8.2 + readable-stream: 3.6.2 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + less@4.2.0: + dependencies: + copy-anything: 2.0.6 + parse-node-version: 1.0.1 + tslib: 2.8.1 + optionalDependencies: + errno: 0.1.8 + graceful-fs: 4.2.11 + image-size: 0.5.5 + make-dir: 2.1.0 + mime: 1.6.0 + needle: 3.3.1 + source-map: 0.6.1 + + lightningcss-darwin-arm64@1.21.8: + optional: true + + lightningcss-darwin-arm64@1.28.1: + optional: true + + lightningcss-darwin-x64@1.21.8: + optional: true + + lightningcss-darwin-x64@1.28.1: + optional: true + + lightningcss-freebsd-x64@1.21.8: + optional: true + + lightningcss-freebsd-x64@1.28.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.21.8: + optional: true + + lightningcss-linux-arm-gnueabihf@1.28.1: + optional: true + + lightningcss-linux-arm64-gnu@1.21.8: + optional: true + + lightningcss-linux-arm64-gnu@1.28.1: + optional: true + + lightningcss-linux-arm64-musl@1.21.8: + optional: true + + lightningcss-linux-arm64-musl@1.28.1: + optional: true + + lightningcss-linux-x64-gnu@1.21.8: + optional: true + + lightningcss-linux-x64-gnu@1.28.1: + optional: true + + lightningcss-linux-x64-musl@1.21.8: + optional: true + + lightningcss-linux-x64-musl@1.28.1: + optional: true + + lightningcss-win32-arm64-msvc@1.28.1: + optional: true + + lightningcss-win32-x64-msvc@1.21.8: + optional: true + + lightningcss-win32-x64-msvc@1.28.1: + optional: true + + lightningcss@1.21.8: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.21.8 + lightningcss-darwin-x64: 1.21.8 + lightningcss-freebsd-x64: 1.21.8 + lightningcss-linux-arm-gnueabihf: 1.21.8 + lightningcss-linux-arm64-gnu: 1.21.8 + lightningcss-linux-arm64-musl: 1.21.8 + lightningcss-linux-x64-gnu: 1.21.8 + lightningcss-linux-x64-musl: 1.21.8 + lightningcss-win32-x64-msvc: 1.21.8 + + lightningcss@1.28.1: + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.28.1 + lightningcss-darwin-x64: 1.28.1 + lightningcss-freebsd-x64: 1.28.1 + lightningcss-linux-arm-gnueabihf: 1.28.1 + lightningcss-linux-arm64-gnu: 1.28.1 + lightningcss-linux-arm64-musl: 1.28.1 + lightningcss-linux-x64-gnu: 1.28.1 + lightningcss-linux-x64-musl: 1.28.1 + lightningcss-win32-arm64-msvc: 1.28.1 + lightningcss-win32-x64-msvc: 1.28.1 + + lilconfig@2.1.0: {} + + lilconfig@3.1.2: {} + + lines-and-columns@1.2.4: {} + + lmdb@2.5.2: + dependencies: + msgpackr: 1.11.2 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.3 + ordered-binary: 1.5.3 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.5.2 + '@lmdb/lmdb-darwin-x64': 2.5.2 + '@lmdb/lmdb-linux-arm': 2.5.2 + '@lmdb/lmdb-linux-arm64': 2.5.2 + '@lmdb/lmdb-linux-x64': 2.5.2 + '@lmdb/lmdb-win32-x64': 2.5.2 + + lmdb@2.7.11: + dependencies: + msgpackr: 1.8.5 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.6 + ordered-binary: 1.5.3 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.7.11 + '@lmdb/lmdb-darwin-x64': 2.7.11 + '@lmdb/lmdb-linux-arm': 2.7.11 + '@lmdb/lmdb-linux-arm64': 2.7.11 + '@lmdb/lmdb-linux-x64': 2.7.11 + '@lmdb/lmdb-win32-x64': 2.7.11 + + load-tsconfig@0.2.5: {} + + locate-character@3.0.0: {} + + lodash.sortby@4.7.0: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + lowercase-keys@3.0.0: {} + + lru-cache@10.4.3: {} + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@6.0.0: + dependencies: + yallist: 4.0.0 + + magic-string@0.30.12: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + + make-dir@2.1.0: + dependencies: + pify: 4.0.1 + semver: 5.7.2 + optional: true + + mdn-data@2.0.14: {} + + mdn-data@2.0.30: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + micromatch@4.0.8: + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + mime@1.6.0: + optional: true + + mime@2.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-response@3.1.0: {} + + mimic-response@4.0.0: {} + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.1 + + minimist@1.2.8: {} + + minipass@7.1.2: {} + + mkdirp-classic@0.5.3: {} + + mnemonic-id@3.2.7: {} + + ms@2.1.3: {} + + msgpackr-extract@3.0.3: + dependencies: + node-gyp-build-optional-packages: 5.2.2 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.3 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.3 + optional: true + + msgpackr@1.11.2: + optionalDependencies: + msgpackr-extract: 3.0.3 + + msgpackr@1.8.5: + optionalDependencies: + msgpackr-extract: 3.0.3 + + mute-stream@1.0.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + napi-build-utils@1.0.2: {} + + needle@3.3.1: + dependencies: + iconv-lite: 0.6.3 + sax: 1.4.1 + optional: true + + node-abi@3.71.0: + dependencies: + semver: 7.5.4 + + node-addon-api@2.0.2: {} + + node-addon-api@4.3.0: {} + + node-addon-api@6.1.0: {} + + node-addon-api@7.1.1: {} + + node-gyp-build-optional-packages@5.0.3: {} + + node-gyp-build-optional-packages@5.0.6: {} + + node-gyp-build-optional-packages@5.2.2: + dependencies: + detect-libc: 2.0.3 + optional: true + + node-gyp-build@4.8.2: {} + + node-object-hash@3.0.0: {} + + node-releases@2.0.18: {} + + normalize-path@3.0.0: {} + + normalize-url@8.0.1: {} + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nullthrows@1.1.1: {} + + object-assign@4.1.1: {} + + object-hash@3.0.0: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + ordered-binary@1.5.3: {} + + os-tmpdir@1.0.2: {} + + p-cancelable@3.0.0: {} + + package-json-from-dist@1.0.1: {} + + package-json@8.1.1: + dependencies: + got: 12.6.1 + registry-auth-token: 5.0.2 + registry-url: 6.0.1 + semver: 7.5.4 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.26.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-node-version@1.0.1: {} + + path-key@3.1.1: {} + + path-parse@1.0.7: {} + + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + + path-type@4.0.0: {} + + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.6 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.1.1: {} + + picomatch@2.3.1: {} + + pify@2.3.0: {} + + pify@4.0.1: + optional: true + + pirates@4.0.6: {} + + plasmo@0.89.4(@swc/core@1.9.1(@swc/helpers@0.5.13))(@swc/helpers@0.5.13)(lodash@4.17.21)(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@expo/spawn-async': 1.7.2 + '@parcel/core': 2.9.3 + '@parcel/fs': 2.9.3(@parcel/core@2.9.3) + '@parcel/package-manager': 2.9.3(@parcel/core@2.9.3) + '@parcel/watcher': 2.2.0 + '@plasmohq/init': 0.7.0 + '@plasmohq/parcel-config': 0.41.1(@swc/core@1.9.1(@swc/helpers@0.5.13))(@swc/helpers@0.5.13)(lodash@4.17.21)(postcss@8.4.49)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.2.2) + '@plasmohq/parcel-core': 0.1.10 + buffer: 6.0.3 + chalk: 5.3.0 + change-case: 5.1.2 + dotenv: 16.3.1 + dotenv-expand: 10.0.0 + events: 3.3.0 + fast-glob: 3.3.2 + fflate: 0.8.1 + get-port: 7.0.0 + got: 13.0.0 + ignore: 5.2.4 + inquirer: 9.2.12 + is-path-inside: 4.0.0 + json5: 2.2.3 + mnemonic-id: 3.2.7 + node-object-hash: 3.0.0 + package-json: 8.1.1 + process: 0.11.10 + semver: 7.5.4 + sharp: 0.32.6 + tempy: 3.1.0 + typescript: 5.2.2 + transitivePeerDependencies: + - '@swc/core' + - '@swc/helpers' + - arc-templates + - atpl + - babel-core + - bracket-template + - coffeescript + - cssnano + - dot + - eco + - ect + - ejs + - haml-coffee + - hamlet + - hamljs + - handlebars + - hogan.js + - htmling + - jazz + - jqtpl + - just + - liquid + - liquor + - lodash + - marko + - mote + - mustache + - nunjucks + - plates + - postcss + - pug + - purgecss + - qejs + - ractive + - razor-tmpl + - react + - react-dom + - relateurl + - slm + - squirrelly + - srcset + - supports-color + - teacup + - templayed + - terser + - then-pug + - tinyliquid + - toffee + - ts-node + - twig + - twing + - uncss + - underscore + - vash + - velocityjs + - walrus + - whiskers + + postcss-import@15.1.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + + postcss-js@4.0.1(postcss@8.4.49): + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.49 + + postcss-load-config@4.0.2(postcss@8.4.49): + dependencies: + lilconfig: 3.1.2 + yaml: 2.6.0 + optionalDependencies: + postcss: 8.4.49 + + postcss-nested@6.2.0(postcss@8.4.49): + dependencies: + postcss: 8.4.49 + postcss-selector-parser: 6.1.2 + + postcss-selector-parser@6.1.2: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.49: + dependencies: + nanoid: 3.3.7 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + posthtml-parser@0.10.2: + dependencies: + htmlparser2: 7.2.0 + + posthtml-parser@0.11.0: + dependencies: + htmlparser2: 7.2.0 + + posthtml-render@3.0.0: + dependencies: + is-json: 2.0.1 + + posthtml@0.16.6: + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + + preact@10.24.3: {} + + prebuild-install@7.1.2: + dependencies: + detect-libc: 2.0.3 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.71.0 + pump: 3.0.2 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + + prettier-plugin-tailwindcss@0.6.8(prettier@3.3.3): + dependencies: + prettier: 3.3.3 + + prettier@3.3.3: {} + + process@0.11.10: {} + + proto-list@1.2.4: {} + + prr@1.0.1: + optional: true + + pump@3.0.2: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + punycode@2.3.1: {} + + qrcode.react@3.1.0(react@18.3.1): + dependencies: + react: 18.3.1 + + queue-microtask@1.2.3: {} + + queue-tick@1.0.1: {} + + quick-lru@5.1.1: {} + + rc@1.2.8: + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-error-overlay@6.0.9: {} + + react-is@16.13.1: {} + + react-refresh@0.14.0: {} + + react-refresh@0.9.0: {} + + react-router-dom@6.28.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.21.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.28.0(react@18.3.1) + + react-router@6.28.0(react@18.3.1): + dependencies: + '@remix-run/router': 1.21.0 + react: 18.3.1 + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-cache@1.0.0: + dependencies: + pify: 2.3.0 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + readdirp@4.0.2: {} + + regenerator-runtime@0.13.11: {} + + regenerator-runtime@0.14.1: {} + + registry-auth-token@5.0.2: + dependencies: + '@pnpm/npm-conf': 2.3.1 + + registry-url@6.0.1: + dependencies: + rc: 1.2.8 + + resolve-alpn@1.2.1: {} + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve@1.22.8: + dependencies: + is-core-module: 2.15.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + responselike@3.0.0: + dependencies: + lowercase-keys: 3.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + reusify@1.0.4: {} + + rollup@3.29.5: + optionalDependencies: + fsevents: 2.3.3 + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.8.1 + + safe-buffer@5.2.1: {} + + safer-buffer@2.1.2: {} + + sass@1.80.6: + dependencies: + chokidar: 4.0.1 + immutable: 4.3.7 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.0 + + sax@1.4.1: + optional: true + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.5.4: + dependencies: + lru-cache: 6.0.0 + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + sha.js@2.4.11: + dependencies: + inherits: 2.0.4 + safe-buffer: 5.2.1 + + sharp@0.32.6: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + node-addon-api: 6.1.0 + prebuild-install: 7.1.2 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.6 + tunnel-agent: 0.6.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@3.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + simple-concat@1.0.1: {} + + simple-get@4.0.1: + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + + simple-swizzle@0.2.2: + dependencies: + is-arrayish: 0.3.2 + + slash@3.0.0: {} + + source-map-js@1.2.1: {} + + source-map@0.5.7: {} + + source-map@0.6.1: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + srcset@4.0.0: {} + + stable@0.1.8: {} + + std-env@3.7.0: {} + + streamx@2.20.1: + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.2.1 + optionalDependencies: + bare-events: 2.5.0 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + + strip-final-newline@2.0.0: {} + + strip-json-comments@2.0.1: {} + + stylis@4.2.0: {} + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.4.5 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-preserve-symlinks-flag@1.0.0: {} + + svelte@4.2.2: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + acorn: 8.14.0 + aria-query: 5.3.2 + axobject-query: 3.2.4 + code-red: 1.0.4 + css-tree: 2.3.1 + estree-walker: 3.0.3 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.12 + periscopic: 3.1.0 + + svg-parser@2.0.4: {} + + svgo@2.8.0: + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.1.1 + stable: 0.1.8 + + swr@2.2.5(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + use-sync-external-store: 1.2.2(react@18.3.1) + + tabbable@6.2.0: {} + + tailwindcss@3.4.14: + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.6 + lilconfig: 2.1.0 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.4.49 + postcss-import: 15.1.0(postcss@8.4.49) + postcss-js: 4.0.1(postcss@8.4.49) + postcss-load-config: 4.0.2(postcss@8.4.49) + postcss-nested: 6.2.0(postcss@8.4.49) + postcss-selector-parser: 6.1.2 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.2 + tar-stream: 2.2.0 + + tar-fs@3.0.6: + dependencies: + pump: 3.0.2 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.5 + bare-path: 2.1.3 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar-stream@3.1.7: + dependencies: + b4a: 1.6.7 + fast-fifo: 1.3.2 + streamx: 2.20.1 + + temp-dir@3.0.0: {} + + tempy@3.1.0: + dependencies: + is-stream: 3.0.0 + temp-dir: 3.0.0 + type-fest: 2.19.0 + unique-string: 3.0.0 + + text-decoder@1.2.1: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + timsort@0.3.0: {} + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toggle-selection@1.0.6: {} + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + ts-algebra@1.2.2: {} + + ts-interface-checker@0.1.13: {} + + tslib@2.4.1: {} + + tslib@2.8.1: {} + + tsup@7.2.0(@swc/core@1.9.1(@swc/helpers@0.5.13))(postcss@8.4.49)(typescript@5.2.2): + dependencies: + bundle-require: 4.2.1(esbuild@0.18.20) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.3.7 + esbuild: 0.18.20 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2(postcss@8.4.49) + resolve-from: 5.0.0 + rollup: 3.29.5 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + optionalDependencies: + '@swc/core': 1.9.1(@swc/helpers@0.5.13) + postcss: 8.4.49 + typescript: 5.2.2 + transitivePeerDependencies: + - supports-color + - ts-node + + tunnel-agent@0.6.0: + dependencies: + safe-buffer: 5.2.1 + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@1.4.0: {} + + type-fest@2.19.0: {} + + typescript@5.2.2: {} + + typescript@5.6.3: {} + + undici-types@6.19.8: {} + + unique-string@3.0.0: + dependencies: + crypto-random-string: 4.0.0 + + universalify@2.0.1: {} + + update-browserslist-db@1.1.1(browserslist@4.22.1): + dependencies: + browserslist: 4.22.1 + escalade: 3.2.0 + picocolors: 1.1.1 + + update-browserslist-db@1.1.1(browserslist@4.24.2): + dependencies: + browserslist: 4.24.2 + escalade: 3.2.0 + picocolors: 1.1.1 + + use-sync-external-store@1.2.2(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + utility-types@3.11.0: {} + + vue@3.3.4: + dependencies: + '@vue/compiler-dom': 3.3.4 + '@vue/compiler-sfc': 3.3.4 + '@vue/runtime-dom': 3.3.4 + '@vue/server-renderer': 3.3.4(vue@3.3.4) + '@vue/shared': 3.3.4 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + weak-lru-cache@1.2.2: {} + + webextension-polyfill@0.10.0: {} + + webextension-polyfill@0.12.0: {} + + webidl-conversions@4.0.2: {} + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + xxhash-wasm@0.4.2: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@1.10.2: {} + + yaml@2.6.0: {} diff --git a/playground/browser-extension/postcss.config.js b/playground/browser-extension/postcss.config.js new file mode 100644 index 0000000000..2484180d45 --- /dev/null +++ b/playground/browser-extension/postcss.config.js @@ -0,0 +1,8 @@ +/** + * @type {import('postcss').ProcessOptions} + */ +module.exports = { + plugins: { + tailwindcss: {} + } +} diff --git a/playground/browser-extension/src/background/index.ts b/playground/browser-extension/src/background/index.ts new file mode 100644 index 0000000000..229e330bdc --- /dev/null +++ b/playground/browser-extension/src/background/index.ts @@ -0,0 +1,34 @@ +import { createClerkClient } from '@clerk/chrome-extension/background'; + +console.log('Background Script w/ Clerk createClerkClient() demo loaded'); + +const publishableKey = process.env.PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY; +if (!publishableKey) { + throw new Error('Please add the PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY to the .env.development file'); +} + +async function getToken() { + const clerk = await createClerkClient({ + publishableKey, + syncHost: process.env.PLASMO_PUBLIC_CLERK_SYNC_HOST, + }); + + if (!clerk.session) { + return null; + } + + return await clerk.session?.getToken(); +} + +// create a listener to listen for messages from content scripts +// NOTE: A runtime listener cannot be async. +// It must return true, in order to keep the connection open and send a response later. +chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + if (request.greeting === 'get-token') { + console.log("Handling request for the user's current token"); + getToken() + .then(token => sendResponse({ token })) + .catch(error => console.error(JSON.stringify(error))); + } + return true; +}); diff --git a/playground/browser-extension/src/content.tsx b/playground/browser-extension/src/content.tsx new file mode 100644 index 0000000000..7713a6a136 --- /dev/null +++ b/playground/browser-extension/src/content.tsx @@ -0,0 +1,24 @@ +import cssText from "data-text:~style.css" +import type { PlasmoCSConfig } from "plasmo" + +import { CountButton } from "~features/count-button" + +export const config: PlasmoCSConfig = { + matches: ["https://www.plasmo.com/*"] +} + +export const getStyle = () => { + const style = document.createElement("style") + style.textContent = cssText + return style +} + +const PlasmoOverlay = () => { + return ( +
    + +
    + ) +} + +export default PlasmoOverlay diff --git a/playground/browser-extension/src/features/count-button.tsx b/playground/browser-extension/src/features/count-button.tsx new file mode 100644 index 0000000000..9f7e987826 --- /dev/null +++ b/playground/browser-extension/src/features/count-button.tsx @@ -0,0 +1,19 @@ +import { useReducer } from "react" + +export const CountButton = () => { + const [count, increase] = useReducer((c) => c + 1, 0) + + return ( + + ) +} diff --git a/playground/browser-extension/src/popup/index.tsx b/playground/browser-extension/src/popup/index.tsx new file mode 100644 index 0000000000..cb3eef6c4a --- /dev/null +++ b/playground/browser-extension/src/popup/index.tsx @@ -0,0 +1,31 @@ +import '../style.css'; +import { RouterProvider, createMemoryRouter } from 'react-router-dom'; + +// Import the layouts +import { RootLayout } from './layouts/root-layout'; + +// Import the components +import { SignInPage } from './routes/sign-in'; +import { SignUpPage } from './routes/sign-up'; +import { Index } from './routes'; +import { Settings } from './routes/settings'; +import { SDKFeatures } from './routes/sdk-features'; + +// Create the router +// This removes the need for an App.tsx file +const router = createMemoryRouter([ + { + element: , + children: [ + { path: '/', element: }, + { path: '/sign-in', element: }, + { path: '/sign-up', element: }, + { path: '/settings', element: }, + { path: '/sdk-features', element: }, + ], + }, +]); + +export default function PopupIndex() { + return ; +} diff --git a/playground/browser-extension/src/popup/layouts/root-layout.tsx b/playground/browser-extension/src/popup/layouts/root-layout.tsx new file mode 100644 index 0000000000..95b7fd64c7 --- /dev/null +++ b/playground/browser-extension/src/popup/layouts/root-layout.tsx @@ -0,0 +1,47 @@ +import { ClerkProvider, SignedIn, SignedOut, UserButton } from '@clerk/chrome-extension'; +import { Link, Outlet, useLocation, useNavigate } from 'react-router-dom'; + +const PUBLISHABLE_KEY = process.env.PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY; +const SYNC_HOST = process.env.PLASMO_PUBLIC_CLERK_SYNC_HOST; + +if (!PUBLISHABLE_KEY) { + throw new Error('Please add the PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY to the .env.development file'); +} + +if (!SYNC_HOST) { + console.warn('Initialized without PLASMO_PUBLIC_CLERK_SYNC_HOST'); +} + +export const RootLayout = () => { + const navigate = useNavigate(); + const location = useLocation(); + + console.log('location', location); + return ( + navigate(to)} + routerReplace={to => navigate(to, { replace: true })} + publishableKey={PUBLISHABLE_KEY} + afterSignOutUrl='/' + syncHost={SYNC_HOST} + > +
    +
    + +
    +
    + + SDK Features + Settings + + + + Home + Sign In + Sign Up + +
    +
    +
    + ); +}; diff --git a/playground/browser-extension/src/popup/routes/index.tsx b/playground/browser-extension/src/popup/routes/index.tsx new file mode 100644 index 0000000000..627008e641 --- /dev/null +++ b/playground/browser-extension/src/popup/routes/index.tsx @@ -0,0 +1,7 @@ +export const Index = () => { + return ( + <> +

    Clerk + Chrome Extension + React Router

    + + ); +}; diff --git a/playground/browser-extension/src/popup/routes/sdk-features.tsx b/playground/browser-extension/src/popup/routes/sdk-features.tsx new file mode 100644 index 0000000000..55c888d1bb --- /dev/null +++ b/playground/browser-extension/src/popup/routes/sdk-features.tsx @@ -0,0 +1,16 @@ +export const SDKFeatures = () => { + return ( + <> +

    Background Worker

    + + + + ) +} diff --git a/playground/browser-extension/src/popup/routes/settings.tsx b/playground/browser-extension/src/popup/routes/settings.tsx new file mode 100644 index 0000000000..ff82f2f752 --- /dev/null +++ b/playground/browser-extension/src/popup/routes/settings.tsx @@ -0,0 +1,10 @@ +import { UserProfile } from "@clerk/chrome-extension"; + +export const Settings = () => { + return ( + <> +

    Settings

    + + + ); +}; diff --git a/playground/browser-extension/src/popup/routes/sign-in.tsx b/playground/browser-extension/src/popup/routes/sign-in.tsx new file mode 100644 index 0000000000..3d80e58da1 --- /dev/null +++ b/playground/browser-extension/src/popup/routes/sign-in.tsx @@ -0,0 +1,10 @@ +import { SignIn } from "@clerk/chrome-extension"; + +export const SignInPage = () => { + return ( + <> +

    Sign In

    + + + ); +}; diff --git a/playground/browser-extension/src/popup/routes/sign-up.tsx b/playground/browser-extension/src/popup/routes/sign-up.tsx new file mode 100644 index 0000000000..ceb3e3b9f6 --- /dev/null +++ b/playground/browser-extension/src/popup/routes/sign-up.tsx @@ -0,0 +1,10 @@ +import { SignUp } from "@clerk/chrome-extension"; + +export const SignUpPage = () => { + return ( + <> +

    Sign Up

    + + + ); +}; diff --git a/playground/browser-extension/src/style.css b/playground/browser-extension/src/style.css new file mode 100644 index 0000000000..6e0335c910 --- /dev/null +++ b/playground/browser-extension/src/style.css @@ -0,0 +1,5 @@ +@import url("https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&display=swap"); + +@tailwind base; +@tailwind components; +@tailwind utilities; diff --git a/playground/browser-extension/src/tabs/background-worker-demo.html b/playground/browser-extension/src/tabs/background-worker-demo.html new file mode 100644 index 0000000000..dde599a982 --- /dev/null +++ b/playground/browser-extension/src/tabs/background-worker-demo.html @@ -0,0 +1,12 @@ + + + + + Clerk Background Worker demo + + + + + + + diff --git a/playground/browser-extension/src/tabs/background-worker-demo.tsx b/playground/browser-extension/src/tabs/background-worker-demo.tsx new file mode 100644 index 0000000000..66c65a5f79 --- /dev/null +++ b/playground/browser-extension/src/tabs/background-worker-demo.tsx @@ -0,0 +1,37 @@ +import * as React from 'react'; + +export default function NewTab() { + const [token, setToken] = React.useState(null); + + const getToken = async (e: React.MouseEvent) => { + e.preventDefault(); + + // send a message to the background service worker + chrome.runtime.sendMessage({ greeting: 'get-token' }, response => { + console.log('MESSAGE RESPONSE', JSON.stringify(response)); + setToken(response.token); + }); + }; + + return ( +
    +

    Clerk Background Worker demo

    +
    +

    This new tab simluates a content page where you might want to access user information, or make a request to your backend server and include a user token in the request.

    +

    Make sure that you are signed into the extension. You can have the popup closed.

    + + {token &&

    Token: {token}

    } +
    + +
    + ) +} + + + diff --git a/playground/browser-extension/tailwind.config.js b/playground/browser-extension/tailwind.config.js new file mode 100644 index 0000000000..564630220b --- /dev/null +++ b/playground/browser-extension/tailwind.config.js @@ -0,0 +1,6 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/**/*.{tsx,html}"], + darkMode: "media", + prefix: "plasmo-" +} diff --git a/playground/browser-extension/tsconfig.json b/playground/browser-extension/tsconfig.json new file mode 100644 index 0000000000..6603b5b31d --- /dev/null +++ b/playground/browser-extension/tsconfig.json @@ -0,0 +1,20 @@ +{ + "extends": "plasmo/templates/tsconfig.base", + "exclude": [ + "node_modules" + ], + "include": [ + ".plasmo/index.d.ts", + "./**/*.ts", + "./**/*.tsx" + ], + "compilerOptions": { + "jsx": "react-jsx", + "paths": { + "~*": [ + "./src/*" + ] + }, + "baseUrl": "." + } +} diff --git a/playground/chrome-extension/.env.example b/playground/chrome-extension/.env.example deleted file mode 100644 index 4f4796f3fc..0000000000 --- a/playground/chrome-extension/.env.example +++ /dev/null @@ -1 +0,0 @@ -VITE_CLERK_PUBLISHABLE_KEY=YOUR_CLERK_PUBLISHABLE_KEY_GOES_HERE diff --git a/playground/chrome-extension/.gitignore b/playground/chrome-extension/.gitignore deleted file mode 100644 index b780dd861d..0000000000 --- a/playground/chrome-extension/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -# dependencies -/node_modules - -# manifests -manifest.* -!manifest.*.example - -# production -/build -/dist - -# misc -.DS_Store -.env diff --git a/playground/chrome-extension/README.md b/playground/chrome-extension/README.md deleted file mode 100644 index d3f9dfd7ad..0000000000 --- a/playground/chrome-extension/README.md +++ /dev/null @@ -1,66 +0,0 @@ -

    - - - - - - -
    -

    - -# Clerk Chrome Extension Starter - -This starter project shows how to use [Clerk](https://www.clerk.dev/?utm_source=github&utm_medium=starter_repos&utm_campaign=chrome_extension_start) authentication in a React based [Chrome Extension](https://developer.chrome.com/docs/extensions/). - -[![chat on Discord](https://img.shields.io/discord/856971667393609759.svg?logo=discord)](https://discord.com/invite/b5rXHjAg7A) -[![documentation](https://img.shields.io/badge/documentation-clerk-green.svg)](https://docs.clerk.dev) -[![twitter](https://img.shields.io/twitter/follow/ClerkDev?style=social)](https://twitter.com/intent/follow?screen_name=ClerkDev) - -If you run into issues, be sure to check our [main npm page](https://www.npmjs.com/package/@clerk/chrome-extension) for any updated settings/steps you may need to be aware of. - ---- - -**Clerk is Hiring!** - -Would you like to work on Open Source software and help maintain this repository? [Apply today!](https://apply.workable.com/clerk-dev/) - ---- - -## Introduction - -This project was bootstrapped with [Vite](https://vitejs.dev/) with [CRXJ](https://crxjs.dev/vite-plugin/). - -It's a kitchen-sink starter of how to use ClerkJS in a Chrome Extension either as a Standalone App or alongside a Web Application via WebSSO. - - - -It demonstrates a basic password or OTP flow using ClerkJS Components in the following extension contexts: - -- [x] Popup `action.*` -- [x] Chrome Pages - - [x] New Tab `chrome_url_overrides.newtab` - - [x] History `chrome_url_overrides.history` - - [x] Bookmark Manager `chrome_url_overrides.bookmarks` -- [x] Dev Tools `devtools_page` -- [x] Extension Options `options_ui` - -You may safely remove any of the above contexts from the `manifest.json` if you do not need them. - -This repo will be enhanced with examples of authentication redirection flows such as OAuth or Magic Links and advanced extension patterns. - -## Getting Started - -1. Sign up for a Clerk account at [https://clerk.com](https://dashboard.clerk.com/sign-up?utm_source=github&utm_medium=template_repos&utm_campaign=chrome_extension_template). -2. Go to the [Clerk dashboard](https://dashboard.clerk.com?utm_source=github&utm_medium=template_repos&utm_campaign=chrome_extension_template) and create an application. -3. Clone the repository `git clone https://github.com/clerkinc/clerk-chrome-extension-starter.git clerk-chrome-extension-starter` -4. Go to the project directory: cd clerk-chrome-extension-starter -5. Install dependencies: `npm install` -6. Copy example files and sent the required variables in each file: - - `cp .env.example .env` - - `cp manifest.json.example manifest.json` - - `cp manifest.dev.json.example manifest.dev.json` (The attributes in this file overwrite the attributes in `manifest.json` when running in development mode.) -7. Launch the development server: `pnpm dev` - -The files generated in the `dist` directory can be loaded as an unpacked extension in Chrome. - -PLEASE NOTE: Any changes to the manifest require a reload of the extension in [chrome://extensions/](chrome://extensions/). diff --git a/playground/chrome-extension/demo.png b/playground/chrome-extension/demo.png deleted file mode 100644 index 4f7f1975a5e279a4ec8f5e1bc3ad910d5eed7ebf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 180543 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 zÐ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�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 FngBXNOBnzF diff --git a/playground/chrome-extension/manifest.dev.json.example b/playground/chrome-extension/manifest.dev.json.example deleted file mode 100644 index 4e80c18a70..0000000000 --- a/playground/chrome-extension/manifest.dev.json.example +++ /dev/null @@ -1,10 +0,0 @@ -{ - "host_permissions": [ - "*://localhost/*", - "https:///*" - ], - "icons": { - "32": "dev-icon-32.png", - "128": "dev-icon-128.png" - } -} diff --git a/playground/chrome-extension/manifest.json.example b/playground/chrome-extension/manifest.json.example deleted file mode 100644 index adf133812b..0000000000 --- a/playground/chrome-extension/manifest.json.example +++ /dev/null @@ -1,26 +0,0 @@ -{ - "manifest_version": 3, - "name": "Clerk Chrome Extension Playground", - "description": "Playground App for the Clerk Chrome Extension", - "action": { - "default_popup": "src/pages/popup/index.html" - }, - "chrome_url_overrides": { - "newtab": "src/pages/new-tab/index.html" - }, - "devtools_page": "src/pages/devtools/index.html", - "host_permissions": [ - "https:///*" - ], - "icons": { - "32": "icon-32.png", - "128": "icon-128.png" - }, - "options_ui": { - "page": "src/pages/options/index.html" - }, - "permissions": [ - "cookies", - "storage" - ] -} diff --git a/playground/chrome-extension/nodemon.json b/playground/chrome-extension/nodemon.json deleted file mode 100644 index 72faa88892..0000000000 --- a/playground/chrome-extension/nodemon.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "env": { - "__DEV__": "true" - }, - "watch": [ - ".yalc/**/*", "src", "utils", "vite.config.ts", "manifest.json", "manifest.dev.json", "node_modules/@clerk/**/*" - ], - "ext": "tsx,css,html,ts,json", - "ignore": [ - "src/**/*.spec.ts" - ], - "exec": "vite build", - "delay": "1000" -} diff --git a/playground/chrome-extension/package.json b/playground/chrome-extension/package.json deleted file mode 100644 index e2d3c219e1..0000000000 --- a/playground/chrome-extension/package.json +++ /dev/null @@ -1,39 +0,0 @@ -{ - "name": "clerk-chrome-extension-starter", - "version": "0.1.0", - "private": true, - "type": "module", - "dependencies": { - "@clerk/chrome-extension": "file:.yalc/@clerk/chrome-extension", - "@clerk/clerk-js": "file:.yalc/@clerk/clerk-js", - "@clerk/clerk-react": "file:.yalc/@clerk/clerk-react", - "@clerk/localizations": "file:.yalc/@clerk/localizations", - "@clerk/shared": "file:.yalc/@clerk/shared", - "@clerk/themes": "file:.yalc/@clerk/themes", - "@clerk/types": "file:.yalc/@clerk/types", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "react-router-dom": "^6.23.1", - "webextension-polyfill": "^0.12.0" - }, - "devDependencies": { - "@crxjs/vite-plugin": "^1.0.14", - "@types/chrome": "^0.0.268", - "@types/node": "^18.17.1", - "@types/react": "^18.2.39", - "@types/react-dom": "^18.2.17", - "@types/webextension-polyfill": "^0.10.0", - "@vitejs/plugin-react-swc": "^3.0.1", - "autoprefixer": "^10.4.19", - "nodemon": "^2.0.20", - "postcss": "^8.4.38", - "ts-node": "^10.9.2", - "typescript": "^4.9.4", - "vite": "^4.5.0" - }, - "scripts": { - "build": "vite build", - "dev": "pnpm yalc:add && nodemon", - "yalc:add": "pnpm yalc add -- @clerk/chrome-extension @clerk/clerk-react @clerk/clerk-js @clerk/localizations @clerk/themes @clerk/types @clerk/shared" - } -} diff --git a/playground/chrome-extension/public/dev-icon-128.png b/playground/chrome-extension/public/dev-icon-128.png deleted file mode 100644 index 2272f3c2883630770b174305587971dc83712f0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16876 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 diff --git a/playground/chrome-extension/public/dev-icon-32.png b/playground/chrome-extension/public/dev-icon-32.png deleted file mode 100644 index 2b72ebdb2ced5484f58647dc0f46ffb9b2e9b1d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2529 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 { - console.log('TESTING onInstalled'); -}); - -async function getToken() { - const clerk = await __unstable__createClerkClient({ publishableKey, syncSessionWithTab: true }); - return await clerk.session?.getToken(); -} - -chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { - console.log(sender.tab ? `from a content script: ${sender.tab.url}` : 'from the extension'); - - if (request.greeting === 'hello') { - getToken().then(token => { - console.log('Background Token:', token); - sendResponse({ token }); - }); - } - - return true; -}); diff --git a/playground/chrome-extension/src/components/CurrentUser.tsx b/playground/chrome-extension/src/components/CurrentUser.tsx deleted file mode 100644 index 5b8d5ddb79..0000000000 --- a/playground/chrome-extension/src/components/CurrentUser.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import { useEffect, useState } from 'react'; -import { useAuth, useUser } from "@clerk/chrome-extension"; - -export function CurrentUser() { - const [sessionToken, setSessionToken] = useState(""); - const { isSignedIn, user } = useUser(); - const { getToken, signOut } = useAuth(); - - useEffect(() => { - const scheduler = setInterval(async () => { - const token = await getToken(); - setSessionToken(token as string); - }, 1000); - - return () => clearInterval(scheduler); - }, []); - - if (!isSignedIn) { - return null; - } - - const email = user.primaryEmailAddress?.emailAddress; - - return ( -
    -

    Hi, {email ? `${email}!` : ''}

    - -
    -

    Clerk Session Token:

    -
    {sessionToken}
    -
    - - -
    - ); -} diff --git a/playground/chrome-extension/src/components/SharedApp.tsx b/playground/chrome-extension/src/components/SharedApp.tsx deleted file mode 100644 index 76350ce7ff..0000000000 --- a/playground/chrome-extension/src/components/SharedApp.tsx +++ /dev/null @@ -1,130 +0,0 @@ -import { ClerkProvider, type ChromeExtensionClerkProviderProps } from '@clerk/chrome-extension'; -import { Routes, Route, useNavigate } from 'react-router-dom'; -import { SignedIn, SignedOut, SignIn, SignUp } from '@clerk/chrome-extension'; - -import '@/assets/styles/index.css'; - -import { CurrentUser } from '@/components/CurrentUser'; - -const publishableKey = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY || ''; - -export type SharedAppProps = Pick & { - className?: string; -}; - -export function SharedApp({ className, ...rest }: SharedAppProps) { - const navigate = useNavigate(); - - const onClick = e => { - e.preventDefault(); - - chrome.runtime.sendMessage({ greeting: 'hello' }, response => { - console.log('MESSAGE RESPONSE', response); - }); - }; - - return ( - navigate(to)} - routerReplace={to => navigate(to, { replace: true })} - extensionFeatures={{ - sync: true, - }} - {...rest} - > -
    -
    - ); -} diff --git a/playground/chrome-extension/src/global.d.ts b/playground/chrome-extension/src/global.d.ts deleted file mode 100644 index 7ad3edd14d..0000000000 --- a/playground/chrome-extension/src/global.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -declare module '*.svg' { - import React = require('react'); - export const ReactComponent: React.SFC>; - const src: string; - export default src; -} - -declare module '*.json' { - const content: string; - export default content; -} diff --git a/playground/chrome-extension/src/pages/background/index.ts b/playground/chrome-extension/src/pages/background/index.ts deleted file mode 100644 index def0db5c2c..0000000000 --- a/playground/chrome-extension/src/pages/background/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log('background script loaded'); diff --git a/playground/chrome-extension/src/pages/content/index.tsx b/playground/chrome-extension/src/pages/content/index.tsx deleted file mode 100644 index de0869e401..0000000000 --- a/playground/chrome-extension/src/pages/content/index.tsx +++ /dev/null @@ -1 +0,0 @@ -console.log('content script loaded') diff --git a/playground/chrome-extension/src/pages/devtools/index.html b/playground/chrome-extension/src/pages/devtools/index.html deleted file mode 100644 index 666bb682e3..0000000000 --- a/playground/chrome-extension/src/pages/devtools/index.html +++ /dev/null @@ -1,10 +0,0 @@ - - - - - Devtools - - - - - diff --git a/playground/chrome-extension/src/pages/devtools/index.ts b/playground/chrome-extension/src/pages/devtools/index.ts deleted file mode 100644 index cf2258c594..0000000000 --- a/playground/chrome-extension/src/pages/devtools/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import browser from 'webextension-polyfill'; - -browser - .devtools - .panels - .create('Clerk Starter', 'icon-32.png', 'src/pages/panel/index.html'); diff --git a/playground/chrome-extension/src/pages/new-tab/index.html b/playground/chrome-extension/src/pages/new-tab/index.html deleted file mode 100644 index e794ed94ac..0000000000 --- a/playground/chrome-extension/src/pages/new-tab/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - New tab - - - -
    - - - diff --git a/playground/chrome-extension/src/pages/new-tab/index.tsx b/playground/chrome-extension/src/pages/new-tab/index.tsx deleted file mode 100644 index 48b5565878..0000000000 --- a/playground/chrome-extension/src/pages/new-tab/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createRoot } from 'react-dom/client'; -import NewTab from './new-tab'; - -function init() { - const rootContainer = document.querySelector("#__root"); - if (!rootContainer) throw new Error("Can't find NewTab root element"); - const root = createRoot(rootContainer); - root.render(); -} - -init(); diff --git a/playground/chrome-extension/src/pages/new-tab/new-tab.tsx b/playground/chrome-extension/src/pages/new-tab/new-tab.tsx deleted file mode 100644 index aeb1cd4b2d..0000000000 --- a/playground/chrome-extension/src/pages/new-tab/new-tab.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { MemoryRouter } from "react-router-dom"; -import { SharedApp } from '@/components/SharedApp'; - -function NewTab() { - return ( - - - - ) -} - -export default NewTab; diff --git a/playground/chrome-extension/src/pages/options/Options.tsx b/playground/chrome-extension/src/pages/options/Options.tsx deleted file mode 100644 index f2b20d9fed..0000000000 --- a/playground/chrome-extension/src/pages/options/Options.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { MemoryRouter } from "react-router-dom"; -import { SharedApp } from '@/components/SharedApp'; - -function Options() { - return ( - - - - ) -} - -export default Options; diff --git a/playground/chrome-extension/src/pages/options/index.html b/playground/chrome-extension/src/pages/options/index.html deleted file mode 100644 index db5fa745af..0000000000 --- a/playground/chrome-extension/src/pages/options/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Options - - - -
    - - - diff --git a/playground/chrome-extension/src/pages/options/index.tsx b/playground/chrome-extension/src/pages/options/index.tsx deleted file mode 100644 index 48630999fb..0000000000 --- a/playground/chrome-extension/src/pages/options/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createRoot } from 'react-dom/client'; -import Options from './options'; - -function init() { - const rootContainer = document.querySelector("#__root"); - if (!rootContainer) throw new Error("Can't find Options root element"); - const root = createRoot(rootContainer); - root.render(); -} - -init(); diff --git a/playground/chrome-extension/src/pages/panel/Panel.tsx b/playground/chrome-extension/src/pages/panel/Panel.tsx deleted file mode 100644 index a2ae4f3cb0..0000000000 --- a/playground/chrome-extension/src/pages/panel/Panel.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { MemoryRouter } from "react-router-dom"; -import { SharedApp } from '@/components/SharedApp'; - -function Panel() { - return ( - - - - ) -} - -export default Panel; diff --git a/playground/chrome-extension/src/pages/panel/index.html b/playground/chrome-extension/src/pages/panel/index.html deleted file mode 100644 index 7aa306d0ca..0000000000 --- a/playground/chrome-extension/src/pages/panel/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Devtools Panel - - - -
    - - - diff --git a/playground/chrome-extension/src/pages/panel/index.tsx b/playground/chrome-extension/src/pages/panel/index.tsx deleted file mode 100644 index 88ce49ce79..0000000000 --- a/playground/chrome-extension/src/pages/panel/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createRoot } from 'react-dom/client'; -import Panel from './panel'; - -function init() { - const rootContainer = document.querySelector("#__root"); - if (!rootContainer) throw new Error("Can't find Panel root element"); - const root = createRoot(rootContainer); - root.render(); -} - -init(); diff --git a/playground/chrome-extension/src/pages/popup/Popup.tsx b/playground/chrome-extension/src/pages/popup/Popup.tsx deleted file mode 100644 index f3fa747061..0000000000 --- a/playground/chrome-extension/src/pages/popup/Popup.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { MemoryRouter } from "react-router-dom"; -import { SharedApp } from '@/components/SharedApp'; - -function Popup() { - return ( - - - - ) -} - -export default Popup; diff --git a/playground/chrome-extension/src/pages/popup/index.html b/playground/chrome-extension/src/pages/popup/index.html deleted file mode 100644 index b60f054fce..0000000000 --- a/playground/chrome-extension/src/pages/popup/index.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - Popup - - - -
    - - - diff --git a/playground/chrome-extension/src/pages/popup/index.tsx b/playground/chrome-extension/src/pages/popup/index.tsx deleted file mode 100644 index 695a35a37d..0000000000 --- a/playground/chrome-extension/src/pages/popup/index.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { createRoot } from 'react-dom/client'; -import Popup from './popup'; - -function init() { - const rootContainer = document.querySelector("#__root"); - if (!rootContainer) throw new Error("Can't find Popup root element"); - const root = createRoot(rootContainer); - root.render(); -} - -init(); diff --git a/playground/chrome-extension/src/vite-env.d.ts b/playground/chrome-extension/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2a0..0000000000 --- a/playground/chrome-extension/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/playground/chrome-extension/tsconfig.json b/playground/chrome-extension/tsconfig.json deleted file mode 100644 index 5dd3152768..0000000000 --- a/playground/chrome-extension/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "esnext", - "types": ["vite/client", "node", "chrome"], - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": false, - "skipLibCheck": true, - "esModuleInterop": true, - "allowSyntheticDefaultImports": true, - "strict": true, - "forceConsistentCasingInFileNames": true, - "noFallthroughCasesInSwitch": true, - "module": "esnext", - "moduleResolution": "node", - "resolveJsonModule": true, - "noEmit": true, - "jsx": "react-jsx", - "baseUrl": ".", - "paths": { - "@/*": ["src/*"] - } - }, - "include": ["src", "vite.config.ts"], -} diff --git a/playground/chrome-extension/vite.config.ts b/playground/chrome-extension/vite.config.ts deleted file mode 100644 index 0e40558bb7..0000000000 --- a/playground/chrome-extension/vite.config.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { fileURLToPath, URL } from 'url'; -import { resolve } from 'path'; - -import react from '@vitejs/plugin-react-swc'; -import { crx, ManifestV3Export } from '@crxjs/vite-plugin'; -import { defineConfig } from 'vite'; - -import manifest from './manifest.json'; -import devManifest from './manifest.dev.json'; -import pkg from './package.json'; - -const isDev = process.env.__DEV__ === 'true'; - -const extensionManifest = { - ...manifest, - ...(isDev ? devManifest : {} as ManifestV3Export), - name: isDev ? `[DEV] ${manifest.name}` : manifest.name, - version: pkg.version, -}; - -const crxPlugin = crx({ - manifest: extensionManifest as ManifestV3Export, - contentScripts: { - injectCss: true, - } -}) - -export default defineConfig({ - resolve: { - alias: [ - { find: '@/', replacement: fileURLToPath(new URL('./src/', import.meta.url)) }, - ], - }, - plugins: [ - react(), - crxPlugin, - ], - publicDir: resolve(__dirname, 'public'), - build: { - emptyOutDir: !isDev, - outDir: resolve(__dirname, 'dist'), - minify: !isDev, - sourcemap: isDev, - rollupOptions: { - input: { - panel: 'src/pages/panel/index.html', - }, - }, - }, -}); diff --git a/turbo.json b/turbo.json index d6503add92..ea27da6e51 100644 --- a/turbo.json +++ b/turbo.json @@ -18,6 +18,7 @@ "globalEnv": [ "CLERK_*", "NEXT_PUBLIC_CLERK_*", + "PLASMO_PUBLIC_CLERK_*", "PUBLIC_CLERK_*", "NODE_ENV", "NODE_VERSION", From fe9e147e366153d664af7fc325655ecb299a1f9d Mon Sep 17 00:00:00 2001 From: panteliselef Date: Fri, 22 Nov 2024 12:04:30 -0500 Subject: [PATCH 13/19] feat(repo): Transition Session Reverification to stable (#4536) --- .changeset/afraid-cheetahs-smash.md | 9 ++ .changeset/curly-terms-confess.md | 6 + .changeset/forty-countries-retire.md | 10 ++ .changeset/friendly-chairs-tie.md | 33 ++++++ .changeset/happy-balloons-jog.md | 6 + .changeset/hungry-beds-prove.md | 19 +++ .changeset/small-suits-knock.md | 5 + .changeset/smart-cooks-drop.md | 8 ++ .../action-with-use-reverification/page.tsx | 2 +- .../src/app/(reverification)/actions.ts | 10 +- .../backend/src/__tests__/exports.test.ts | 4 +- packages/backend/src/internal.ts | 5 +- packages/backend/src/tokens/authObjects.ts | 14 +-- .../__snapshots__/exports.test.ts.snap | 2 +- packages/clerk-js/src/core/clerk.ts | 14 +-- .../clerk-js/src/core/resources/Session.ts | 58 +++++---- .../src/core/resources/SessionVerification.ts | 30 ++--- .../core/resources/__tests__/Session.test.ts | 60 +++++----- packages/clerk-js/src/ui/Components.tsx | 6 +- .../src/ui/common/RemoveResourceForm.tsx | 2 +- .../UserProfile/ActiveDevicesSection.tsx | 2 +- .../UserProfile/AddAuthenticatorApp.tsx | 2 +- .../UserProfile/ConnectedAccountsMenu.tsx | 2 +- .../UserProfile/ConnectedAccountsSection.tsx | 2 +- .../components/UserProfile/DeleteUserForm.tsx | 2 +- .../ui/components/UserProfile/EmailForm.tsx | 2 +- .../UserProfile/MfaBackupCodeCreateForm.tsx | 2 +- .../UserProfile/MfaPhoneCodeScreen.tsx | 2 +- .../components/UserProfile/PasskeySection.tsx | 2 +- .../components/UserProfile/PasswordForm.tsx | 2 +- .../ui/components/UserProfile/PhoneForm.tsx | 2 +- .../components/UserProfile/UsernameForm.tsx | 2 +- .../UserVerification/AlternativeMethods.tsx | 36 +++--- .../UserVerification/HavingTrouble.tsx | 4 +- .../UserVerification/UVFactorOneCodeForm.tsx | 4 +- .../UVFactorOneEmailCodeCard.tsx | 8 +- .../UVFactorOnePhoneCodeCard.tsx | 8 +- .../UVFactorTwoAlternativeMethods.tsx | 28 ++--- .../UVFactorTwoBackupCodeCard.tsx | 8 +- .../UserVerification/UVFactorTwoCodeForm.tsx | 6 +- .../UVFactorTwoPhoneCodeCard.tsx | 10 +- .../UserVerificationFactorOne.tsx | 6 +- .../UserVerificationFactorOnePassword.tsx | 10 +- .../UserVerificationFactorTwo.tsx | 10 +- .../UserVerificationFactorTwoTOTP.tsx | 6 +- .../__tests__/UVFactorOne.test.tsx | 28 ++--- .../__tests__/UVFactorTwo.test.tsx | 20 ++-- .../ui/components/UserVerification/index.tsx | 6 +- .../use-after-verification.ts | 4 +- .../useUserVerificationSession.tsx | 6 +- packages/clerk-js/src/ui/types.ts | 8 +- .../src/utils/memoizeStateListenerCallback.ts | 4 +- packages/localizations/src/ar-SA.ts | 110 ++++++++--------- packages/localizations/src/be-BY.ts | 110 ++++++++--------- packages/localizations/src/bg-BG.ts | 110 ++++++++--------- packages/localizations/src/cs-CZ.ts | 110 ++++++++--------- packages/localizations/src/da-DK.ts | 110 ++++++++--------- packages/localizations/src/de-DE.ts | 110 ++++++++--------- packages/localizations/src/el-GR.ts | 110 ++++++++--------- packages/localizations/src/en-US.ts | 112 +++++++++--------- packages/localizations/src/es-ES.ts | 110 ++++++++--------- packages/localizations/src/es-MX.ts | 110 ++++++++--------- packages/localizations/src/fi-FI.ts | 110 ++++++++--------- packages/localizations/src/fr-FR.ts | 110 ++++++++--------- packages/localizations/src/he-IL.ts | 110 ++++++++--------- packages/localizations/src/hr-HR.ts | 2 +- packages/localizations/src/hu-HU.ts | 110 ++++++++--------- packages/localizations/src/is-IS.ts | 110 ++++++++--------- packages/localizations/src/it-IT.ts | 110 ++++++++--------- packages/localizations/src/ja-JP.ts | 110 ++++++++--------- packages/localizations/src/ko-KR.ts | 110 ++++++++--------- packages/localizations/src/mn-MN.ts | 110 ++++++++--------- packages/localizations/src/nb-NO.ts | 110 ++++++++--------- packages/localizations/src/nl-NL.ts | 112 +++++++++--------- packages/localizations/src/pl-PL.ts | 112 +++++++++--------- packages/localizations/src/pt-BR.ts | 110 ++++++++--------- packages/localizations/src/pt-PT.ts | 110 ++++++++--------- packages/localizations/src/ro-RO.ts | 110 ++++++++--------- packages/localizations/src/ru-RU.ts | 112 +++++++++--------- packages/localizations/src/sk-SK.ts | 110 ++++++++--------- packages/localizations/src/sr-RS.ts | 110 ++++++++--------- packages/localizations/src/sv-SE.ts | 112 +++++++++--------- packages/localizations/src/th-TH.ts | 110 ++++++++--------- packages/localizations/src/tr-TR.ts | 110 ++++++++--------- packages/localizations/src/uk-UA.ts | 110 ++++++++--------- packages/localizations/src/vi-VN.ts | 110 ++++++++--------- packages/localizations/src/zh-CN.ts | 110 ++++++++--------- packages/localizations/src/zh-TW.ts | 110 ++++++++--------- packages/nextjs/src/client-boundary/hooks.ts | 2 +- packages/nextjs/src/index.ts | 2 +- .../__snapshots__/exports.test.ts.snap | 4 +- packages/nextjs/src/server/index.ts | 5 +- packages/react/src/contexts/AuthContext.ts | 2 +- .../src/contexts/ClerkContextProvider.tsx | 6 +- .../react/src/hooks/__tests__/useAuth.test.ts | 24 ++-- packages/react/src/hooks/index.ts | 2 +- packages/react/src/hooks/useAuth.ts | 11 +- packages/react/src/isomorphicClerk.ts | 16 +-- packages/shared/src/authorization-errors.ts | 18 +-- packages/shared/src/authorization.ts | 37 +++--- packages/shared/src/deriveState.ts | 10 +- .../react/__tests__/useReverification.test.ts | 6 +- packages/shared/src/react/hooks/index.ts | 2 +- .../src/react/hooks/useReverification.ts | 22 ++-- packages/types/src/clerk.ts | 17 +-- packages/types/src/json.ts | 11 +- packages/types/src/localization.ts | 2 +- packages/types/src/session.ts | 68 +++++------ packages/types/src/sessionVerification.ts | 30 ++--- packages/types/src/ssr.ts | 2 +- 110 files changed, 2373 insertions(+), 2335 deletions(-) create mode 100644 .changeset/afraid-cheetahs-smash.md create mode 100644 .changeset/curly-terms-confess.md create mode 100644 .changeset/forty-countries-retire.md create mode 100644 .changeset/friendly-chairs-tie.md create mode 100644 .changeset/happy-balloons-jog.md create mode 100644 .changeset/hungry-beds-prove.md create mode 100644 .changeset/small-suits-knock.md create mode 100644 .changeset/smart-cooks-drop.md diff --git a/.changeset/afraid-cheetahs-smash.md b/.changeset/afraid-cheetahs-smash.md new file mode 100644 index 0000000000..83f014903d --- /dev/null +++ b/.changeset/afraid-cheetahs-smash.md @@ -0,0 +1,9 @@ +--- +'@clerk/nextjs': minor +--- + +Introduce the `useReverification()` hook that handles the session reverification flow: +- Replaces `__experimental_useReverification` with `useReverification` +Also replaces the following APIs: +- `____experimental_reverificationError` -> `__reverificationError` +- `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` diff --git a/.changeset/curly-terms-confess.md b/.changeset/curly-terms-confess.md new file mode 100644 index 0000000000..7e6441c892 --- /dev/null +++ b/.changeset/curly-terms-confess.md @@ -0,0 +1,6 @@ +--- +'@clerk/chrome-extension': patch +--- + +Introduce the `useReverification()` hook that handles the session reverification flow: +- Replaces `__experimental_useReverification` with `useReverification` diff --git a/.changeset/forty-countries-retire.md b/.changeset/forty-countries-retire.md new file mode 100644 index 0000000000..1e22df7165 --- /dev/null +++ b/.changeset/forty-countries-retire.md @@ -0,0 +1,10 @@ +--- +'@clerk/shared': minor +--- + +Introduce the `useReverification()` hook that handles the session reverification flow: +- `__experimental_useReverification` -> `useReverification` +Also replaces the following APIs: +- `__experimental_reverificationError` -> `reverificationError` +- `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` +- `__experimental_isReverificationHint` -> `isReverificationHint` diff --git a/.changeset/friendly-chairs-tie.md b/.changeset/friendly-chairs-tie.md new file mode 100644 index 0000000000..8fd318da6b --- /dev/null +++ b/.changeset/friendly-chairs-tie.md @@ -0,0 +1,33 @@ +--- +'@clerk/types': minor +--- + +Drop experimental tag related to reverification. + +Properties of Clerk class: +- `__experimental_openUserVerification` -> `__internal_openUserVerification` +- `__experimental_closeUserVerification` -> `__internal_closeUserVerification` +- `__experimental_UserVerificationProps` -> `__internal_UserVerificationProps` +- `__experimental_UserVerificationModalProps` -> `__internal_UserVerificationModalProps` + +Properties of `Session`: +- `__experimental_factorVerificationAge` -> `factorVerificationAge` +- `__experimental_startVerification` -> `startVerification` +- `__experimental_prepareFirstFactorVerification` -> `prepareFirstFactorVerification` +- `__experimental_attemptFirstFactorVerification` -> `attemptFirstFactorVerification` +- `__experimental_prepareSecondFactorVerification` -> `prepareSecondFactorVerification` +- `__experimental_attemptSecondFactorVerification` -> `attemptSecondFactorVerification` + +Renaming +- `__experimental_SessionVerificationResource` -> `SessionVerificationResource` +- `__experimental_SessionVerificationStatus` -> `SessionVerificationStatus` +- `__experimental_SessionVerificationLevel` -> `SessionVerificationLevel` +- `__experimental_ReverificationConfig` -> `ReverificationConfig` + +`CheckAuthorizationParamsWithCustomPermissions` and `CheckAuthorizationParams` now include `reverification?: ReverificationConfig;` + +Properties of `IntialState`: +- `__experimental_factorVerificationAge` -> `factorVerificationAge` + +Localization types: +All properties of `__experimental_userVerification` are moved to `userVerification` diff --git a/.changeset/happy-balloons-jog.md b/.changeset/happy-balloons-jog.md new file mode 100644 index 0000000000..9384bcdd39 --- /dev/null +++ b/.changeset/happy-balloons-jog.md @@ -0,0 +1,6 @@ +--- +'@clerk/clerk-react': minor +--- + +Introduce the `useReverification()` hook that handles the session reverification flow: +- Replaces `__experimental_useReverification` with `useReverification` diff --git a/.changeset/hungry-beds-prove.md b/.changeset/hungry-beds-prove.md new file mode 100644 index 0000000000..1fdf4ad7c6 --- /dev/null +++ b/.changeset/hungry-beds-prove.md @@ -0,0 +1,19 @@ +--- +'@clerk/clerk-js': minor +--- + +Drop experimental tag related to reverification. + +Properties of Clerk class: +- `__experimental_openUserVerification` -> `__internal_openUserVerification` +- `__experimental_closeUserVerification` -> `__internal_closeUserVerification` +- `__experimental_UserVerificationProps` -> `__internal_UserVerificationProps` +- `__experimental_UserVerificationModalProps` -> `__internal_UserVerificationModalProps` + +Properties of `Session`: +- `__experimental_factorVerificationAge` -> `factorVerificationAge` +- `__experimental_startVerification` -> `startVerification` +- `__experimental_prepareFirstFactorVerification` -> `prepareFirstFactorVerification` +- `__experimental_attemptFirstFactorVerification` -> `attemptFirstFactorVerification` +- `__experimental_prepareSecondFactorVerification` -> `prepareSecondFactorVerification` +- `__experimental_attemptSecondFactorVerification` -> `attemptSecondFactorVerification` diff --git a/.changeset/small-suits-knock.md b/.changeset/small-suits-knock.md new file mode 100644 index 0000000000..53c5597333 --- /dev/null +++ b/.changeset/small-suits-knock.md @@ -0,0 +1,5 @@ +--- +'@clerk/localizations': minor +--- + +Moves all properties under `__experimental_userVerification` to `userVerification`. This affects all languages. diff --git a/.changeset/smart-cooks-drop.md b/.changeset/smart-cooks-drop.md new file mode 100644 index 0000000000..f8de748b94 --- /dev/null +++ b/.changeset/smart-cooks-drop.md @@ -0,0 +1,8 @@ +--- +'@clerk/backend': minor +--- + +Update AuthObject property from `__experimental_factorVerificationAge` to `factorVerificationAge`. +Also replaces the following APIs: +- `__experimental_reverificationError` -> `__reverificationError` +- `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` diff --git a/integration/templates/next-app-router/src/app/(reverification)/action-with-use-reverification/page.tsx b/integration/templates/next-app-router/src/app/(reverification)/action-with-use-reverification/page.tsx index 8ac2db94ba..ad3bf6b307 100644 --- a/integration/templates/next-app-router/src/app/(reverification)/action-with-use-reverification/page.tsx +++ b/integration/templates/next-app-router/src/app/(reverification)/action-with-use-reverification/page.tsx @@ -1,6 +1,6 @@ 'use client'; import { useState, useTransition } from 'react'; -import { __experimental_useReverification as useReverification } from '@clerk/nextjs'; +import { useReverification } from '@clerk/nextjs'; import { logUserIdActionReverification } from '@/app/(reverification)/actions'; function Page() { diff --git a/integration/templates/next-app-router/src/app/(reverification)/actions.ts b/integration/templates/next-app-router/src/app/(reverification)/actions.ts index f281ffed63..5433473053 100644 --- a/integration/templates/next-app-router/src/app/(reverification)/actions.ts +++ b/integration/templates/next-app-router/src/app/(reverification)/actions.ts @@ -1,19 +1,17 @@ 'use server'; -import { auth } from '@clerk/nextjs/server'; -import { __experimental_reverificationError as reverificationError } from '@clerk/shared/authorization-errors'; -import { __experimental_ReverificationConfig } from '@clerk/types'; - +import { auth, reverificationError } from '@clerk/nextjs/server'; +import { ReverificationConfig } from '@clerk/types'; const logUserIdActionReverification = async () => { const { userId, has } = await auth.protect(); const config = { level: 'second_factor', afterMinutes: 1, - } satisfies __experimental_ReverificationConfig; + } satisfies ReverificationConfig; const userNeedsReverification = !has({ - __experimental_reverification: config, + reverification: config, }); if (userNeedsReverification) { diff --git a/packages/backend/src/__tests__/exports.test.ts b/packages/backend/src/__tests__/exports.test.ts index 0a9d580229..17c4894285 100644 --- a/packages/backend/src/__tests__/exports.test.ts +++ b/packages/backend/src/__tests__/exports.test.ts @@ -37,8 +37,6 @@ describe('subpath /internal exports', () => { expect(Object.keys(internalExports).sort()).toMatchInlineSnapshot(` [ "AuthStatus", - "__experimental_reverificationError", - "__experimental_reverificationErrorResponse", "constants", "createAuthenticateRequest", "createClerkRequest", @@ -46,6 +44,8 @@ describe('subpath /internal exports', () => { "debugRequestState", "decorateObjectWithResources", "makeAuthObjectSerializable", + "reverificationError", + "reverificationErrorResponse", "signedInAuthObject", "signedOutAuthObject", "stripPrivateDataFromObject", diff --git a/packages/backend/src/internal.ts b/packages/backend/src/internal.ts index e29158d637..c9b7daf9ff 100644 --- a/packages/backend/src/internal.ts +++ b/packages/backend/src/internal.ts @@ -20,7 +20,4 @@ export { decorateObjectWithResources, stripPrivateDataFromObject } from './util/ export { createClerkRequest } from './tokens/clerkRequest'; export type { ClerkRequest } from './tokens/clerkRequest'; -export { - __experimental_reverificationError, - __experimental_reverificationErrorResponse, -} from '@clerk/shared/authorization-errors'; +export { reverificationError, reverificationErrorResponse } from '@clerk/shared/authorization-errors'; diff --git a/packages/backend/src/tokens/authObjects.ts b/packages/backend/src/tokens/authObjects.ts index 8f51a97756..e24df5830c 100644 --- a/packages/backend/src/tokens/authObjects.ts +++ b/packages/backend/src/tokens/authObjects.ts @@ -39,9 +39,8 @@ export type SignedInAuthObject = { * Factor Verification Age * Each item represents the minutes that have passed since the last time a first or second factor were verified. * [fistFactorAge, secondFactorAge] - * @experimental This API is experimental and may change at any moment. */ - __experimental_factorVerificationAge: [number, number] | null; + factorVerificationAge: [number, number] | null; getToken: ServerGetToken; has: CheckAuthorizationWithCustomPermissions; debug: AuthObjectDebug; @@ -63,9 +62,8 @@ export type SignedOutAuthObject = { * Factor Verification Age * Each item represents the minutes that have passed since the last time a first or second factor were verified. * [fistFactorAge, secondFactorAge] - * @experimental This API is experimental and may change at any moment. */ - __experimental_factorVerificationAge: null; + factorVerificationAge: null; getToken: ServerGetToken; has: CheckAuthorizationWithCustomPermissions; debug: AuthObjectDebug; @@ -111,7 +109,7 @@ export function signedInAuthObject( }); // fva can be undefined for instances that have not opt-in - const __experimental_factorVerificationAge = fva ?? null; + const factorVerificationAge = fva ?? null; return { actor, @@ -122,9 +120,9 @@ export function signedInAuthObject( orgRole, orgSlug, orgPermissions, - __experimental_factorVerificationAge, + factorVerificationAge, getToken, - has: createCheckAuthorization({ orgId, orgRole, orgPermissions, userId, __experimental_factorVerificationAge }), + has: createCheckAuthorization({ orgId, orgRole, orgPermissions, userId, factorVerificationAge }), debug: createDebug({ ...authenticateContext, sessionToken }), }; } @@ -142,7 +140,7 @@ export function signedOutAuthObject(debugData?: AuthObjectDebugData): SignedOutA orgRole: null, orgSlug: null, orgPermissions: null, - __experimental_factorVerificationAge: null, + factorVerificationAge: null, getToken: () => Promise.resolve(null), has: () => false, debug: createDebug(debugData), diff --git a/packages/chrome-extension/src/__tests__/__snapshots__/exports.test.ts.snap b/packages/chrome-extension/src/__tests__/__snapshots__/exports.test.ts.snap index e649aa8c78..0be5a3259f 100644 --- a/packages/chrome-extension/src/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/chrome-extension/src/__tests__/__snapshots__/exports.test.ts.snap @@ -28,12 +28,12 @@ exports[`public exports should not include a breaking change 1`] = ` "UserButton", "UserProfile", "Waitlist", - "__experimental_useReverification", "useAuth", "useClerk", "useEmailLink", "useOrganization", "useOrganizationList", + "useReverification", "useSession", "useSessionList", "useSignIn", diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 516ce741dc..99b578e14f 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -9,7 +9,7 @@ import { eventPrebuiltComponentMounted, TelemetryCollector } from '@clerk/shared import { addClerkPrefix, stripScheme } from '@clerk/shared/url'; import { handleValueOrFn, noop } from '@clerk/shared/utils'; import type { - __experimental_UserVerificationModalProps, + __internal_UserVerificationModalProps, ActiveSessionResource, AuthenticateWithCoinbaseWalletParams, AuthenticateWithGoogleOneTapParams, @@ -425,7 +425,7 @@ export class Clerk implements ClerkInterface { void this.#componentControls.ensureMounted().then(controls => controls.closeModal('signIn')); }; - public __experimental_openUserVerification = (props?: __experimental_UserVerificationModalProps): void => { + public __internal_openUserVerification = (props?: __internal_UserVerificationModalProps): void => { this.assertComponentsReady(this.#componentControls); if (noUserExists(this)) { if (this.#instanceType === 'development') { @@ -440,6 +440,11 @@ export class Clerk implements ClerkInterface { .then(controls => controls.openModal('userVerification', props || {})); }; + public __internal_closeUserVerification = (): void => { + this.assertComponentsReady(this.#componentControls); + void this.#componentControls.ensureMounted().then(controls => controls.closeModal('userVerification')); + }; + public __internal_openBlankCaptchaModal = (): Promise => { this.assertComponentsReady(this.#componentControls); return this.#componentControls @@ -454,11 +459,6 @@ export class Clerk implements ClerkInterface { .then(controls => controls.closeModal('blankCaptcha')); }; - public __experimental_closeUserVerification = (): void => { - this.assertComponentsReady(this.#componentControls); - void this.#componentControls.ensureMounted().then(controls => controls.closeModal('userVerification')); - }; - public openSignUp = (props?: SignUpProps): void => { this.assertComponentsReady(this.#componentControls); if (sessionExistsAndSingleSessionModeEnabled(this, this.environment)) { diff --git a/packages/clerk-js/src/core/resources/Session.ts b/packages/clerk-js/src/core/resources/Session.ts index 3d5fcf5673..2249189589 100644 --- a/packages/clerk-js/src/core/resources/Session.ts +++ b/packages/clerk-js/src/core/resources/Session.ts @@ -2,13 +2,6 @@ import { createCheckAuthorization } from '@clerk/shared/authorization'; import { is4xxError, isClerkAPIResponseError } from '@clerk/shared/error'; import { runWithExponentialBackOff } from '@clerk/shared/utils'; import type { - __experimental_SessionVerificationJSON, - __experimental_SessionVerificationResource, - __experimental_SessionVerifyAttemptFirstFactorParams, - __experimental_SessionVerifyAttemptSecondFactorParams, - __experimental_SessionVerifyCreateParams, - __experimental_SessionVerifyPrepareFirstFactorParams, - __experimental_SessionVerifyPrepareSecondFactorParams, ActJWTClaim, CheckAuthorization, EmailCodeConfig, @@ -18,6 +11,13 @@ import type { SessionJSON, SessionResource, SessionStatus, + SessionVerificationJSON, + SessionVerificationResource, + SessionVerifyAttemptFirstFactorParams, + SessionVerifyAttemptSecondFactorParams, + SessionVerifyCreateParams, + SessionVerifyPrepareFirstFactorParams, + SessionVerifyPrepareSecondFactorParams, TokenResource, UserResource, } from '@clerk/types'; @@ -41,7 +41,7 @@ export class Session extends BaseResource implements SessionResource { actor!: ActJWTClaim | null; user!: UserResource | null; publicUserData!: PublicUserData; - __experimental_factorVerificationAge: [number, number] | null = null; + factorVerificationAge: [number, number] | null = null; expireAt!: Date; abandonAt!: Date; createdAt!: Date; @@ -94,7 +94,7 @@ export class Session extends BaseResource implements SessionResource { const activeMembership = orgMemberships.find(mem => mem.organization.id === this.lastActiveOrganizationId); return createCheckAuthorization({ userId: this.user?.id, - __experimental_factorVerificationAge: this.__experimental_factorVerificationAge, + factorVerificationAge: this.factorVerificationAge, orgId: activeMembership?.id, orgRole: activeMembership?.role, orgPermissions: activeMembership?.permissions, @@ -121,9 +121,7 @@ export class Session extends BaseResource implements SessionResource { return [this.id, template, resolvedOrganizationId, this.updatedAt.getTime()].filter(Boolean).join('-'); } - __experimental_startVerification = async ({ - level, - }: __experimental_SessionVerifyCreateParams): Promise<__experimental_SessionVerificationResource> => { + startVerification = async ({ level }: SessionVerifyCreateParams): Promise => { const json = ( await BaseResource._fetch({ method: 'POST', @@ -132,14 +130,14 @@ export class Session extends BaseResource implements SessionResource { level, } as any, }) - )?.response as unknown as __experimental_SessionVerificationJSON; + )?.response as unknown as SessionVerificationJSON; return new SessionVerification(json); }; - __experimental_prepareFirstFactorVerification = async ( - factor: __experimental_SessionVerifyPrepareFirstFactorParams, - ): Promise<__experimental_SessionVerificationResource> => { + prepareFirstFactorVerification = async ( + factor: SessionVerifyPrepareFirstFactorParams, + ): Promise => { let config; switch (factor.strategy) { case 'email_code': @@ -164,49 +162,49 @@ export class Session extends BaseResource implements SessionResource { strategy: factor.strategy, } as any, }) - )?.response as unknown as __experimental_SessionVerificationJSON; + )?.response as unknown as SessionVerificationJSON; return new SessionVerification(json); }; - __experimental_attemptFirstFactorVerification = async ( - attemptFactor: __experimental_SessionVerifyAttemptFirstFactorParams, - ): Promise<__experimental_SessionVerificationResource> => { + attemptFirstFactorVerification = async ( + attemptFactor: SessionVerifyAttemptFirstFactorParams, + ): Promise => { const json = ( await BaseResource._fetch({ method: 'POST', path: `/client/sessions/${this.id}/verify/attempt_first_factor`, body: { ...attemptFactor, strategy: attemptFactor.strategy } as any, }) - )?.response as unknown as __experimental_SessionVerificationJSON; + )?.response as unknown as SessionVerificationJSON; return new SessionVerification(json); }; - __experimental_prepareSecondFactorVerification = async ( - params: __experimental_SessionVerifyPrepareSecondFactorParams, - ): Promise<__experimental_SessionVerificationResource> => { + prepareSecondFactorVerification = async ( + params: SessionVerifyPrepareSecondFactorParams, + ): Promise => { const json = ( await BaseResource._fetch({ method: 'POST', path: `/client/sessions/${this.id}/verify/prepare_second_factor`, body: params as any, }) - )?.response as unknown as __experimental_SessionVerificationJSON; + )?.response as unknown as SessionVerificationJSON; return new SessionVerification(json); }; - __experimental_attemptSecondFactorVerification = async ( - params: __experimental_SessionVerifyAttemptSecondFactorParams, - ): Promise<__experimental_SessionVerificationResource> => { + attemptSecondFactorVerification = async ( + params: SessionVerifyAttemptSecondFactorParams, + ): Promise => { const json = ( await BaseResource._fetch({ method: 'POST', path: `/client/sessions/${this.id}/verify/attempt_second_factor`, body: params as any, }) - )?.response as unknown as __experimental_SessionVerificationJSON; + )?.response as unknown as SessionVerificationJSON; return new SessionVerification(json); }; @@ -220,7 +218,7 @@ export class Session extends BaseResource implements SessionResource { this.status = data.status; this.expireAt = unixEpochToDate(data.expire_at); this.abandonAt = unixEpochToDate(data.abandon_at); - this.__experimental_factorVerificationAge = data.factor_verification_age; + this.factorVerificationAge = data.factor_verification_age; this.lastActiveAt = unixEpochToDate(data.last_active_at); this.lastActiveOrganizationId = data.last_active_organization_id; this.actor = data.actor; diff --git a/packages/clerk-js/src/core/resources/SessionVerification.ts b/packages/clerk-js/src/core/resources/SessionVerification.ts index 234b3b8339..34e703b25a 100644 --- a/packages/clerk-js/src/core/resources/SessionVerification.ts +++ b/packages/clerk-js/src/core/resources/SessionVerification.ts @@ -1,42 +1,42 @@ import { deepSnakeToCamel } from '@clerk/shared/underscore'; import type { - __experimental_SessionVerificationFirstFactor, - __experimental_SessionVerificationJSON, - __experimental_SessionVerificationLevel, - __experimental_SessionVerificationResource, - __experimental_SessionVerificationSecondFactor, - __experimental_SessionVerificationStatus, SessionResource, + SessionVerificationFirstFactor, + SessionVerificationJSON, + SessionVerificationLevel, + SessionVerificationResource, + SessionVerificationSecondFactor, + SessionVerificationStatus, VerificationResource, } from '@clerk/types'; import { BaseResource, Session, Verification } from './internal'; -export class SessionVerification extends BaseResource implements __experimental_SessionVerificationResource { - status!: __experimental_SessionVerificationStatus; - level!: __experimental_SessionVerificationLevel; +export class SessionVerification extends BaseResource implements SessionVerificationResource { + status!: SessionVerificationStatus; + level!: SessionVerificationLevel; session!: SessionResource; - supportedFirstFactors: __experimental_SessionVerificationFirstFactor[] | null = []; - supportedSecondFactors: __experimental_SessionVerificationSecondFactor[] | null = []; + supportedFirstFactors: SessionVerificationFirstFactor[] | null = []; + supportedSecondFactors: SessionVerificationSecondFactor[] | null = []; firstFactorVerification: VerificationResource = new Verification(null); secondFactorVerification: VerificationResource = new Verification(null); - constructor(data: __experimental_SessionVerificationJSON | null = null) { + constructor(data: SessionVerificationJSON | null = null) { super(); this.fromJSON(data); } - protected fromJSON(data: __experimental_SessionVerificationJSON | null): this { + protected fromJSON(data: SessionVerificationJSON | null): this { if (data) { this.id = data.id; this.status = data.status; this.session = new Session(data.session); this.level = data.level; this.supportedFirstFactors = deepSnakeToCamel(data.supported_first_factors) as - | __experimental_SessionVerificationFirstFactor[] + | SessionVerificationFirstFactor[] | null; this.supportedSecondFactors = deepSnakeToCamel(data.supported_second_factors) as - | __experimental_SessionVerificationSecondFactor[] + | SessionVerificationSecondFactor[] | null; this.firstFactorVerification = new Verification(data.first_factor_verification); this.secondFactorVerification = new Verification(data.second_factor_verification); diff --git a/packages/clerk-js/src/core/resources/__tests__/Session.test.ts b/packages/clerk-js/src/core/resources/__tests__/Session.test.ts index 0eaf4626f2..b625c82a09 100644 --- a/packages/clerk-js/src/core/resources/__tests__/Session.test.ts +++ b/packages/clerk-js/src/core/resources/__tests__/Session.test.ts @@ -311,7 +311,7 @@ describe('Session', () => { const isAuthorized = session.checkAuthorization({ permission: 'org:sys_profile:delete', - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -338,7 +338,7 @@ describe('Session', () => { const isAuthorized = session.checkAuthorization({ permission: 'org:sys_profile:delete', - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -362,7 +362,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -386,7 +386,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -410,7 +410,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -434,7 +434,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -458,7 +458,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -482,7 +482,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: 'strict', + reverification: 'strict', }); expect(isAuthorized).toBe(false); @@ -503,7 +503,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: 'strict_mfa', + reverification: 'strict_mfa', }); expect(isAuthorized).toBe(true); @@ -524,7 +524,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -548,7 +548,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -572,7 +572,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multiFactor', afterMinutes: 10, }, @@ -596,7 +596,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multiFactor', afterMinutes: 10, }, @@ -620,7 +620,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multiFactor', afterMinutes: 10, }, @@ -644,7 +644,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'first_factor', afterMinutes: 10, }, @@ -668,7 +668,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: 'strict', + reverification: 'strict', }); expect(isAuthorized).toBe(false); @@ -677,7 +677,7 @@ describe('Session', () => { /** * Test for invalid input */ - it('incorrect params for __experimental_reverification', async () => { + it('incorrect params for reverification', async () => { const session = new Session({ status: 'active', id: 'session_1', @@ -692,7 +692,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { //@ts-expect-error level: 'any level', afterMinutes: 10, @@ -702,7 +702,7 @@ describe('Session', () => { expect(isAuthorized).toBe(false); }); - it('incorrect params for __experimental_reverification', async () => { + it('incorrect params for reverification', async () => { const session = new Session({ status: 'active', id: 'session_1', @@ -717,7 +717,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { //@ts-expect-error level: 'any level', //@ts-expect-error @@ -728,7 +728,7 @@ describe('Session', () => { expect(isAuthorized).toBe(false); }); - it('incorrect params for __experimental_reverification', async () => { + it('incorrect params for reverification', async () => { const session = new Session({ status: 'active', id: 'session_1', @@ -743,13 +743,14 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: 'invalid-value', + // @ts-expect-error + reverification: 'invalid-value', }); expect(isAuthorized).toBe(false); }); - it('incorrect params for __experimental_reverification', async () => { + it('incorrect params for reverification', async () => { const session = new Session({ status: 'active', id: 'session_1', @@ -764,13 +765,14 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: 123, + // @ts-expect-error + reverification: 123, }); expect(isAuthorized).toBe(false); }); - it('incorrect params for __experimental_reverification', async () => { + it('incorrect params for reverification', async () => { const session = new Session({ status: 'active', id: 'session_1', @@ -785,7 +787,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'first_factor', //@ts-expect-error afterMinutes: '10', @@ -813,7 +815,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'multi_factor', afterMinutes: 10, }, @@ -837,7 +839,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: { + reverification: { level: 'first_factor', afterMinutes: 10, }, @@ -861,7 +863,7 @@ describe('Session', () => { } as SessionJSON); const isAuthorized = session.checkAuthorization({ - __experimental_reverification: 'strict', + reverification: 'strict', }); expect(isAuthorized).toBe(true); diff --git a/packages/clerk-js/src/ui/Components.tsx b/packages/clerk-js/src/ui/Components.tsx index f12eac988c..81b8e93036 100644 --- a/packages/clerk-js/src/ui/Components.tsx +++ b/packages/clerk-js/src/ui/Components.tsx @@ -1,7 +1,7 @@ import { useSafeLayoutEffect } from '@clerk/shared/react'; import { createDeferredPromise } from '@clerk/shared/utils'; import type { - __experimental_UserVerificationProps, + __internal_UserVerificationProps, Appearance, Clerk, ClerkOptions, @@ -79,7 +79,7 @@ export type ComponentControls = { : T extends 'signUp' ? SignUpProps : T extends 'userVerification' - ? __experimental_UserVerificationProps + ? __internal_UserVerificationProps : T extends 'waitlist' ? WaitlistProps : UserProfileProps, @@ -125,7 +125,7 @@ interface ComponentsState { signInModal: null | SignInProps; signUpModal: null | SignUpProps; userProfileModal: null | UserProfileProps; - userVerificationModal: null | __experimental_UserVerificationProps; + userVerificationModal: null | __internal_UserVerificationProps; organizationProfileModal: null | OrganizationProfileProps; createOrganizationModal: null | CreateOrganizationProps; blankCaptchaModal: null; diff --git a/packages/clerk-js/src/ui/common/RemoveResourceForm.tsx b/packages/clerk-js/src/ui/common/RemoveResourceForm.tsx index 1959fe6ad8..52268fb43f 100644 --- a/packages/clerk-js/src/ui/common/RemoveResourceForm.tsx +++ b/packages/clerk-js/src/ui/common/RemoveResourceForm.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification } from '@clerk/shared/react'; +import { useReverification } from '@clerk/shared/react'; import { localizationKeys, Text } from '../customizables'; import type { FormProps } from '../elements'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/ActiveDevicesSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/ActiveDevicesSection.tsx index 3d57b8b32c..5d0f238163 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/ActiveDevicesSection.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/ActiveDevicesSection.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useSession, useUser } from '@clerk/shared/react'; +import { useReverification, useSession, useUser } from '@clerk/shared/react'; import type { SessionWithActivitiesResource } from '@clerk/types'; import { Badge, Col, descriptors, Flex, Icon, localizationKeys, Text, useLocalizations } from '../../customizables'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx b/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx index 3393e31e99..6aa4b8d646 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/AddAuthenticatorApp.tsx @@ -1,5 +1,5 @@ import { isClerkRuntimeError } from '@clerk/shared/error'; -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import type { TOTPResource } from '@clerk/types'; import React from 'react'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx index 9845cf6bf1..d1fdbf607d 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsMenu.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import type { OAuthProvider, OAuthStrategy } from '@clerk/types'; import { appendModalState } from '../../../utils'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx index ab61bcd687..7843ece13a 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/ConnectedAccountsSection.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import type { ExternalAccountResource, OAuthProvider, OAuthScope, OAuthStrategy } from '@clerk/types'; import { appendModalState } from '../../../utils'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx index edbe4b8244..5a90cfadd9 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/DeleteUserForm.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useClerk, useUser } from '@clerk/shared/react'; +import { useClerk, useReverification, useUser } from '@clerk/shared/react'; import { useSignOutContext } from '../../contexts'; import { Col, localizationKeys, Text, useLocalizations } from '../../customizables'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx index 4c7e0bf44e..9eced5436a 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/EmailForm.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import type { EmailAddressResource } from '@clerk/types'; import React from 'react'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx index 4f9cac0c06..a7a7f7e58b 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/MfaBackupCodeCreateForm.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import type { BackupCodeResource } from '@clerk/types'; import React from 'react'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodeScreen.tsx b/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodeScreen.tsx index 7dc1762ddd..68d75a0a98 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodeScreen.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/MfaPhoneCodeScreen.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import type { PhoneNumberResource } from '@clerk/types'; import React from 'react'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx b/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx index 4059a396a1..940a6b2ae2 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/PasskeySection.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useClerk, useUser } from '@clerk/shared/react'; +import { useClerk, useReverification, useUser } from '@clerk/shared/react'; import type { PasskeyResource } from '@clerk/types'; import React from 'react'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx index 8b9b22a5fc..6834d0b773 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/PasswordForm.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useSession, useUser } from '@clerk/shared/react'; +import { useReverification, useSession, useUser } from '@clerk/shared/react'; import type { UserResource } from '@clerk/types'; import { useRef } from 'react'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx index 6b1baeb9ef..77a60012ad 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/PhoneForm.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import type { PhoneNumberResource, UserResource } from '@clerk/types'; import React from 'react'; diff --git a/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx b/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx index fc4876ded1..a052638465 100644 --- a/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx +++ b/packages/clerk-js/src/ui/components/UserProfile/UsernameForm.tsx @@ -1,4 +1,4 @@ -import { __experimental_useReverification as useReverification, useUser } from '@clerk/shared/react'; +import { useReverification, useUser } from '@clerk/shared/react'; import { useEnvironment } from '../../contexts'; import { localizationKeys } from '../../customizables'; diff --git a/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx b/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx index 4699d6e34d..28e0fabfd8 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx @@ -1,4 +1,4 @@ -import type { __experimental_SessionVerificationFirstFactor, SignInFactor } from '@clerk/types'; +import type { SessionVerificationFirstFactor, SignInFactor } from '@clerk/types'; import React from 'react'; import type { LocalizationKey } from '../../customizables'; @@ -29,24 +29,18 @@ const AlternativeMethodsList = (props: AlternativeMethodListProps) => { const { onBackLinkClick, onHavingTroubleClick, onFactorSelected } = props; const card = useCardState(); const { data } = useUserVerificationSession(); - const { firstPartyFactors, hasAnyStrategy } = useAlternativeStrategies<__experimental_SessionVerificationFirstFactor>( - { - filterOutFactor: props?.currentFactor, - supportedFirstFactors: data!.supportedFirstFactors, - }, - ); + const { firstPartyFactors, hasAnyStrategy } = useAlternativeStrategies({ + filterOutFactor: props?.currentFactor, + supportedFirstFactors: data?.supportedFirstFactors, + }); return ( - - + + {card.error} {/*TODO: extract main in its own component */} @@ -93,11 +87,9 @@ const AlternativeMethodsList = (props: AlternativeMethodListProps) => { - + @@ -107,24 +99,24 @@ const AlternativeMethodsList = (props: AlternativeMethodListProps) => { ); }; -export function getButtonLabel(factor: __experimental_SessionVerificationFirstFactor): LocalizationKey { +export function getButtonLabel(factor: SessionVerificationFirstFactor): LocalizationKey { switch (factor.strategy) { case 'email_code': - return localizationKeys('__experimental_userVerification.alternativeMethods.blockButton__emailCode', { + return localizationKeys('userVerification.alternativeMethods.blockButton__emailCode', { identifier: formatSafeIdentifier(factor.safeIdentifier) || '', }); case 'phone_code': - return localizationKeys('__experimental_userVerification.alternativeMethods.blockButton__phoneCode', { + return localizationKeys('userVerification.alternativeMethods.blockButton__phoneCode', { identifier: formatSafeIdentifier(factor.safeIdentifier) || '', }); case 'password': - return localizationKeys('__experimental_userVerification.alternativeMethods.blockButton__password'); + return localizationKeys('userVerification.alternativeMethods.blockButton__password'); default: throw `Invalid sign in strategy: "${(factor as any).strategy}"`; } } -export function getButtonIcon(factor: __experimental_SessionVerificationFirstFactor) { +export function getButtonIcon(factor: SessionVerificationFirstFactor) { const icons = { email_code: Email, phone_code: ChatAltIcon, diff --git a/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx b/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx index 92a9f706bb..a6c020deba 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx @@ -7,8 +7,8 @@ export const HavingTrouble = (props: PropsOfComponent) => { return ( ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneCodeForm.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneCodeForm.tsx index c9091fd9fc..94290e5585 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneCodeForm.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneCodeForm.tsx @@ -38,14 +38,14 @@ export const UVFactorOneCodeForm = (props: UVFactorOneCodeFormProps) => { const prepare = () => { void session! - .__experimental_prepareFirstFactorVerification(props.factor) + .prepareFirstFactorVerification(props.factor) .then(() => props.onFactorPrepare()) .catch(err => handleError(err, [], card.setError)); }; const action: VerificationCodeCardProps['onCodeEntryFinishedAction'] = (code, resolve, reject) => { session! - .__experimental_attemptFirstFactorVerification({ strategy: props.factor.strategy, code }) + .attemptFirstFactorVerification({ strategy: props.factor.strategy, code }) .then(async res => { await resolve(); return handleVerificationResponse(res); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx index ca72283043..c1f02b13ca 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx @@ -11,10 +11,10 @@ export const UVFactorOneEmailCodeCard = (props: UVFactorOneEmailCodeCardProps) = ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx index 9ba5c0b778..e18ae2b754 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx @@ -11,10 +11,10 @@ export const UVFactorOnePhoneCodeCard = (props: UVFactorOnePhoneCodeCardProps) = ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx index 5ec8ea0297..9c4971ccde 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx @@ -1,4 +1,4 @@ -import type { __experimental_SessionVerificationSecondFactor } from '@clerk/types'; +import type { SessionVerificationSecondFactor } from '@clerk/types'; import React from 'react'; import type { LocalizationKey } from '../../customizables'; @@ -10,8 +10,8 @@ import { HavingTrouble } from './HavingTrouble'; export type AlternativeMethodsProps = { onBackLinkClick: React.MouseEventHandler | undefined; - onFactorSelected: (factor: __experimental_SessionVerificationSecondFactor) => void; - supportedSecondFactors: __experimental_SessionVerificationSecondFactor[] | null; + onFactorSelected: (factor: SessionVerificationSecondFactor) => void; + supportedSecondFactors: SessionVerificationSecondFactor[] | null; }; export const UVFactorTwoAlternativeMethods = (props: AlternativeMethodsProps) => { @@ -41,12 +41,8 @@ const AlternativeMethodsList = (props: AlternativeMethodsProps & { onHavingTroub - - + + {card.error} {/*TODO: extract main in its own component */} @@ -80,11 +76,9 @@ const AlternativeMethodsList = (props: AlternativeMethodsProps & { onHavingTroub - + @@ -94,16 +88,16 @@ const AlternativeMethodsList = (props: AlternativeMethodsProps & { onHavingTroub ); }; -export function getButtonLabel(factor: __experimental_SessionVerificationSecondFactor): LocalizationKey { +export function getButtonLabel(factor: SessionVerificationSecondFactor): LocalizationKey { switch (factor.strategy) { case 'phone_code': - return localizationKeys('__experimental_userVerification.alternativeMethods.blockButton__phoneCode', { + return localizationKeys('userVerification.alternativeMethods.blockButton__phoneCode', { identifier: formatSafeIdentifier(factor.safeIdentifier) || '', }); case 'totp': - return localizationKeys('__experimental_userVerification.alternativeMethods.blockButton__totp'); + return localizationKeys('userVerification.alternativeMethods.blockButton__totp'); case 'backup_code': - return localizationKeys('__experimental_userVerification.alternativeMethods.blockButton__backupCode'); + return localizationKeys('userVerification.alternativeMethods.blockButton__backupCode'); default: throw `Invalid verification strategy: "${(factor as any).strategy}"`; } diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx index d414981b93..bfc99a2e77 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx @@ -25,7 +25,7 @@ export const UVFactorTwoBackupCodeCard = (props: UVFactorTwoBackupCodeCardProps) const handleBackupCodeSubmit: React.FormEventHandler = e => { e.preventDefault(); return session! - .__experimental_attemptSecondFactorVerification({ strategy: 'backup_code', code: codeControl.value }) + .attemptSecondFactorVerification({ strategy: 'backup_code', code: codeControl.value }) .then(handleVerificationResponse) .catch(err => handleError(err, [codeControl], card.setError)); }; @@ -34,10 +34,8 @@ export const UVFactorTwoBackupCodeCard = (props: UVFactorTwoBackupCodeCardProps) - - + + {card.error} void; - prepare?: () => Promise<__experimental_SessionVerificationResource>; + prepare?: () => Promise; }; type SignInFactorTwoCodeFormProps = UVFactorTwoCodeCard & { @@ -45,7 +45,7 @@ export const UVFactorTwoCodeForm = (props: SignInFactorTwoCodeFormProps) => { const action: VerificationCodeCardProps['onCodeEntryFinishedAction'] = (code, resolve, reject) => { session! - .__experimental_attemptSecondFactorVerification({ strategy: props.factor.strategy, code }) + .attemptSecondFactorVerification({ strategy: props.factor.strategy, code }) .then(async res => { await resolve(); return handleVerificationResponse(res); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoPhoneCodeCard.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoPhoneCodeCard.tsx index 162c3c2107..10c89df3e0 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoPhoneCodeCard.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoPhoneCodeCard.tsx @@ -12,17 +12,17 @@ export const UVFactorTwoPhoneCodeCard = (props: UVFactorTwoPhoneCodeCardProps) = const prepare = () => { const { phoneNumberId, strategy } = props.factor; - return session!.__experimental_prepareSecondFactorVerification({ phoneNumberId, strategy }); + return session!.prepareSecondFactorVerification({ phoneNumberId, strategy }); }; return ( diff --git a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx index 964468342e..908e5f08cc 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx @@ -77,9 +77,9 @@ export function _UserVerificationFactorOne(): JSX.Element | null { if (!currentFactor) { return ( ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx index 1345a853a1..667e5fce97 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx @@ -30,7 +30,7 @@ export function UserVerificationFactorOnePasswordCard(props: UserVerificationFac const handlePasswordSubmit: React.FormEventHandler = async e => { e.preventDefault(); return session - ?.__experimental_attemptFirstFactorVerification({ + ?.attemptFirstFactorVerification({ strategy: 'password', password: passwordControl.value, }) @@ -47,8 +47,8 @@ export function UserVerificationFactorOnePasswordCard(props: UserVerificationFac - - + + {card.error} diff --git a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwo.tsx b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwo.tsx index f2fb1af64d..efccbc8996 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwo.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwo.tsx @@ -1,4 +1,4 @@ -import type { __experimental_SessionVerificationSecondFactor, SignInFactor } from '@clerk/types'; +import type { SessionVerificationResource, SessionVerificationSecondFactor, SignInFactor } from '@clerk/types'; import React, { useEffect } from 'react'; import { LoadingCard, withCardStateProvider } from '../../elements'; @@ -24,13 +24,13 @@ const factorKey = (factor: SignInFactor | null | undefined) => { export function _UserVerificationFactorTwo(): JSX.Element { const { navigate } = useRouter(); const { data } = useUserVerificationSession(); - const sessionVerification = data!; + const sessionVerification = data as SessionVerificationResource; const availableFactors = sessionVerification.supportedSecondFactors; const lastPreparedFactorKeyRef = React.useRef(''); - const [currentFactor, setCurrentFactor] = React.useState<__experimental_SessionVerificationSecondFactor | null>( - () => determineStartingSignInSecondFactor(availableFactors) as __experimental_SessionVerificationSecondFactor, + const [currentFactor, setCurrentFactor] = React.useState( + () => determineStartingSignInSecondFactor(availableFactors) as SessionVerificationSecondFactor, ); const [showAllStrategies, setShowAllStrategies] = React.useState(!currentFactor); const toggleAllStrategies = () => setShowAllStrategies(s => !s); @@ -39,7 +39,7 @@ export function _UserVerificationFactorTwo(): JSX.Element { lastPreparedFactorKeyRef.current = factorKey(currentFactor); }; - const selectFactor = (factor: __experimental_SessionVerificationSecondFactor) => { + const selectFactor = (factor: SessionVerificationSecondFactor) => { setCurrentFactor(factor); toggleAllStrategies(); }; diff --git a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx index 906049eed6..0cf2ca1065 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx @@ -11,9 +11,9 @@ export function UserVerificationFactorTwoTOTP(props: UVFactorTwoTOTPCardProps): ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx index 5fc18ffb96..389f008a17 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx @@ -20,7 +20,7 @@ describe('UserVerificationFactorOne', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_first_factor', supportedFirstFactors: [{ strategy: 'password' }], }); @@ -38,11 +38,11 @@ describe('UserVerificationFactorOne', () => { f.withUser({ username: 'clerkuser' }); f.withPreferredSignInStrategy({ strategy: 'otp' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_first_factor', supportedFirstFactors: [{ strategy: 'password' }, { strategy: 'email_code' }], }); - fixtures.session?.__experimental_prepareFirstFactorVerification.mockResolvedValue({}); + fixtures.session?.prepareFirstFactorVerification.mockResolvedValue({}); const { getByLabelText, getByText } = render(, { wrapper }); await waitFor(() => { @@ -50,7 +50,7 @@ describe('UserVerificationFactorOne', () => { getByLabelText(/Enter verification code/i); }); - expect(fixtures.session?.__experimental_prepareFirstFactorVerification).toHaveBeenCalledTimes(1); + expect(fixtures.session?.prepareFirstFactorVerification).toHaveBeenCalledTimes(1); }); it('renders the component for with strategy:phone_code', async () => { @@ -58,11 +58,11 @@ describe('UserVerificationFactorOne', () => { f.withUser({ username: 'clerkuser' }); f.withPreferredSignInStrategy({ strategy: 'otp' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_first_factor', supportedFirstFactors: [{ strategy: 'password' }, { strategy: 'phone_code' }], }); - fixtures.session?.__experimental_prepareFirstFactorVerification.mockResolvedValue({}); + fixtures.session?.prepareFirstFactorVerification.mockResolvedValue({}); const { getByLabelText, getByText } = render(, { wrapper }); await waitFor(() => { @@ -70,7 +70,7 @@ describe('UserVerificationFactorOne', () => { getByLabelText(/Enter verification code/i); }); - expect(fixtures.session?.__experimental_prepareFirstFactorVerification).toHaveBeenCalledTimes(1); + expect(fixtures.session?.prepareFirstFactorVerification).toHaveBeenCalledTimes(1); }); describe('Submitting', () => { @@ -78,15 +78,15 @@ describe('UserVerificationFactorOne', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_first_factor', supportedFirstFactors: [{ strategy: 'password' }], }); - fixtures.session?.__experimental_attemptFirstFactorVerification.mockResolvedValue({ + fixtures.session?.attemptFirstFactorVerification.mockResolvedValue({ status: 'needs_second_factor', supportedFirstFactors: [{ strategy: 'password' }], }); - fixtures.session?.__experimental_prepareSecondFactorVerification.mockResolvedValue({ + fixtures.session?.prepareSecondFactorVerification.mockResolvedValue({ status: 'needs_second_factor', supportedFirstFactors: [{ strategy: 'password' }], }); @@ -97,7 +97,7 @@ describe('UserVerificationFactorOne', () => { await userEvent.type(getByLabelText(/^password/i), 'testtest'); await userEvent.click(getByText('Continue')); - expect(fixtures.session?.__experimental_attemptFirstFactorVerification).toHaveBeenCalledWith({ + expect(fixtures.session?.attemptFirstFactorVerification).toHaveBeenCalledWith({ strategy: 'password', password: 'testtest', }); @@ -109,11 +109,11 @@ describe('UserVerificationFactorOne', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_first_factor', supportedFirstFactors: [{ strategy: 'password' }], }); - fixtures.session?.__experimental_attemptFirstFactorVerification.mockResolvedValue({ + fixtures.session?.attemptFirstFactorVerification.mockResolvedValue({ status: 'complete', session: { id: '123', @@ -130,7 +130,7 @@ describe('UserVerificationFactorOne', () => { await waitFor(() => { expect(fixtures.clerk.setActive).toHaveBeenCalled(); }); - expect(fixtures.session?.__experimental_attemptFirstFactorVerification).toHaveBeenCalledTimes(1); + expect(fixtures.session?.attemptFirstFactorVerification).toHaveBeenCalledTimes(1); }); }); diff --git a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx index 5449844774..4e6d7ece1e 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx @@ -20,12 +20,12 @@ describe('UserVerificationFactorTwo', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'phone_code' }], }); - fixtures.session?.__experimental_prepareSecondFactorVerification.mockResolvedValue({ + fixtures.session?.prepareSecondFactorVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'phone_code' }], }); @@ -43,12 +43,12 @@ describe('UserVerificationFactorTwo', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'totp' }], }); - fixtures.session?.__experimental_prepareSecondFactorVerification.mockResolvedValue({ + fixtures.session?.prepareSecondFactorVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'totp' }], }); @@ -65,12 +65,12 @@ describe('UserVerificationFactorTwo', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'backup_code' }], }); - fixtures.session?.__experimental_prepareSecondFactorVerification.mockResolvedValue({ + fixtures.session?.prepareSecondFactorVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'backup_code' }], }); @@ -88,7 +88,7 @@ describe('UserVerificationFactorTwo', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_first_factor', }); render(, { wrapper }); @@ -102,17 +102,17 @@ describe('UserVerificationFactorTwo', () => { const { wrapper, fixtures } = await createFixtures(f => { f.withUser({ username: 'clerkuser' }); }); - fixtures.session?.__experimental_startVerification.mockResolvedValue({ + fixtures.session?.startVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'phone_code' }], }); - fixtures.session?.__experimental_prepareSecondFactorVerification.mockResolvedValue({ + fixtures.session?.prepareSecondFactorVerification.mockResolvedValue({ status: 'needs_second_factor', supportedSecondFactors: [{ strategy: 'phone_code' }], }); - fixtures.session?.__experimental_attemptSecondFactorVerification.mockResolvedValue({ + fixtures.session?.attemptSecondFactorVerification.mockResolvedValue({ status: 'complete', supportedSecondFactors: [], session: { diff --git a/packages/clerk-js/src/ui/components/UserVerification/index.tsx b/packages/clerk-js/src/ui/components/UserVerification/index.tsx index 964487cdef..f00cd57fae 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/index.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/index.tsx @@ -1,4 +1,4 @@ -import type { __experimental_UserVerificationModalProps, __experimental_UserVerificationProps } from '@clerk/types'; +import type { __internal_UserVerificationModalProps, __internal_UserVerificationProps } from '@clerk/types'; import React, { useEffect } from 'react'; import { UserVerificationContext, withCoreSessionSwitchGuard } from '../../contexts'; @@ -31,10 +31,10 @@ function UserVerificationRoutes(): JSX.Element { UserVerificationRoutes.displayName = 'UserVerification'; -const UserVerification: React.ComponentType<__experimental_UserVerificationProps> = +const UserVerification: React.ComponentType<__internal_UserVerificationProps> = withCoreSessionSwitchGuard(UserVerificationRoutes); -const UserVerificationModal = (props: __experimental_UserVerificationModalProps): JSX.Element => { +const UserVerificationModal = (props: __internal_UserVerificationModalProps): JSX.Element => { return ( { const { navigate } = useRouter(); const handleVerificationResponse = useCallback( - async (sessionVerification: __experimental_SessionVerificationResource) => { + async (sessionVerification: SessionVerificationResource) => { setCache({ data: sessionVerification, isLoading: false, diff --git a/packages/clerk-js/src/ui/components/UserVerification/useUserVerificationSession.tsx b/packages/clerk-js/src/ui/components/UserVerification/useUserVerificationSession.tsx index aa5fee307b..a32c8d88ed 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/useUserVerificationSession.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/useUserVerificationSession.tsx @@ -1,5 +1,5 @@ import { useSession } from '@clerk/shared/react'; -import type { __experimental_SessionVerificationLevel } from '@clerk/types'; +import type { SessionVerificationLevel } from '@clerk/types'; import { useMemo } from 'react'; import { useUserVerification } from '../../contexts'; @@ -12,7 +12,7 @@ const useUserVerificationSessionKey = () => { () => ({ level: level || 'second_factor', - }) satisfies { level: __experimental_SessionVerificationLevel }, + }) satisfies { level: SessionVerificationLevel }, [level], ); }; @@ -20,7 +20,7 @@ const useUserVerificationSessionKey = () => { const useUserVerificationSession = () => { const { session } = useSession(); const key = useUserVerificationSessionKey(); - const data = useFetch(session ? session.__experimental_startVerification : undefined, key, { + const data = useFetch(session ? session.startVerification : undefined, key, { throttleTime: 300, }); diff --git a/packages/clerk-js/src/ui/types.ts b/packages/clerk-js/src/ui/types.ts index 366358c2d7..d9af51adce 100644 --- a/packages/clerk-js/src/ui/types.ts +++ b/packages/clerk-js/src/ui/types.ts @@ -1,5 +1,5 @@ import type { - __experimental_UserVerificationProps, + __internal_UserVerificationProps, CreateOrganizationProps, GoogleOneTapProps, OrganizationListProps, @@ -23,7 +23,7 @@ export type { CreateOrganizationProps, OrganizationListProps, WaitlistProps, - __experimental_UserVerificationProps, + __internal_UserVerificationProps, }; export type AvailableComponentProps = @@ -36,7 +36,7 @@ export type AvailableComponentProps = | CreateOrganizationProps | OrganizationListProps | WaitlistProps - | __experimental_UserVerificationProps; + | __internal_UserVerificationProps; type ComponentMode = 'modal' | 'mounted'; @@ -45,7 +45,7 @@ export type SignInCtx = SignInProps & { mode?: ComponentMode; }; -export type UserVerificationCtx = __experimental_UserVerificationProps & { +export type UserVerificationCtx = __internal_UserVerificationProps & { componentName: 'UserVerification'; mode?: ComponentMode; }; diff --git a/packages/clerk-js/src/utils/memoizeStateListenerCallback.ts b/packages/clerk-js/src/utils/memoizeStateListenerCallback.ts index a48efc4839..a021cb343f 100644 --- a/packages/clerk-js/src/utils/memoizeStateListenerCallback.ts +++ b/packages/clerk-js/src/utils/memoizeStateListenerCallback.ts @@ -51,8 +51,8 @@ function userMembershipsChanged(prev: UserResource, next: UserResource): boolean } function sessionFVAChanged(prev: SessionResource, next: SessionResource): boolean { - const prevFVA = prev.__experimental_factorVerificationAge; - const nextFVA = next.__experimental_factorVerificationAge; + const prevFVA = prev.factorVerificationAge; + const nextFVA = next.factorVerificationAge; if (prevFVA !== null && nextFVA !== null) { return prevFVA[0] !== nextFVA[0] || prevFVA[1] !== nextFVA[1]; } diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index 14339709d0..9d9d1dadd2 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const arSA: LocalizationResource = { locale: 'ar-SA', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'الرجوع', badge__default: 'الأفتراضي', badge__otherImpersonatorDevice: 'جهاز منتحل آخر', @@ -901,6 +846,61 @@ export const arSA: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index 8cc8c9749b..71a4c2cd87 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const beBY: LocalizationResource = { locale: 'be-BY', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Назад', badge__default: 'Па-змаўчанні', badge__otherImpersonatorDevice: 'Іншая прылада', @@ -914,6 +859,61 @@ export const beBY: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index 7f4dd3176d..11a58948ca 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const bgBG: LocalizationResource = { locale: 'bg-BG', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Назад', badge__default: 'По подразбиране', badge__otherImpersonatorDevice: 'Друго устройство за имитация', @@ -908,6 +853,61 @@ export const bgBG: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index 26e92e8a5d..6e88a20bc6 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const csCZ: LocalizationResource = { locale: 'cs-CZ', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Zpět', badge__default: 'Výchozí', badge__otherImpersonatorDevice: 'Jiné zařízení představitele', @@ -904,6 +849,61 @@ export const csCZ: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index 916db9b035..c20c6ae784 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const daDK: LocalizationResource = { locale: 'da-DK', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Tilbage', badge__default: 'Standard', badge__otherImpersonatorDevice: 'Anden enhed som efterligner', @@ -906,6 +851,61 @@ export const daDK: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index a8b48707be..25e8c9eba8 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const deDE: LocalizationResource = { locale: 'de-DE', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Zurück', badge__default: 'Standard', badge__otherImpersonatorDevice: 'Anderes Imitationsgerät', @@ -921,6 +866,61 @@ export const deDE: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index 1ac50d81a5..9e72864537 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const elGR: LocalizationResource = { locale: 'el-GR', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Πίσω', badge__default: 'Προεπιλογή', badge__otherImpersonatorDevice: 'Άλλη συσκευή υποδυόμενου', @@ -916,6 +861,61 @@ export const elGR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index 4775dfd6cf..c5e383b269 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -2,62 +2,6 @@ import type { LocalizationResource } from '@clerk/types'; export const enUS: LocalizationResource = { locale: 'en-US', - __experimental_userVerification: { - alternativeMethods: { - actionLink: 'Get help', - actionText: 'Don’t have any of these?', - blockButton__backupCode: 'Use a backup code', - blockButton__emailCode: 'Email code to {{identifier}}', - blockButton__password: 'Continue with your password', - blockButton__phoneCode: 'Send SMS code to {{identifier}}', - blockButton__totp: 'Use your authenticator app', - getHelp: { - blockButton__emailSupport: 'Email support', - content: - 'If you have trouble verifying your account, email us and we will work with you to restore access as soon as possible.', - title: 'Get help', - }, - subtitle: 'Facing issues? You can use any of these methods for verification.', - title: 'Use another method', - }, - backupCodeMfa: { - subtitle: 'Your backup code is the one you got when setting up two-step authentication.', - title: 'Enter a backup code', - }, - emailCode: { - formTitle: 'Verification code', - resendButton: "Didn't receive a code? Resend", - subtitle: 'to continue to {{applicationName}}', - title: 'Check your email', - }, - noAvailableMethods: { - message: "Cannot proceed with verification. There's no available authentication factor.", - subtitle: 'An error occurred', - title: 'Cannot verify your account', - }, - password: { - actionLink: 'Use another method', - subtitle: 'Enter the password associated with your account', - title: 'Enter your password', - }, - phoneCode: { - formTitle: 'Verification code', - resendButton: "Didn't receive a code? Resend", - subtitle: 'to continue to {{applicationName}}', - title: 'Check your phone', - }, - phoneCodeMfa: { - formTitle: 'Verification code', - resendButton: "Didn't receive a code? Resend", - subtitle: 'To continue, please enter the verification code sent to your phone', - title: 'Check your phone', - }, - totpMfa: { - formTitle: 'Verification code', - subtitle: 'To continue, please enter the verification code generated by your authenticator app', - title: 'Two-step verification', - }, - }, backButton: 'Back', badge__default: 'Default', badge__otherImpersonatorDevice: 'Other impersonator device', @@ -902,6 +846,62 @@ export const enUS: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, + userVerification: { + alternativeMethods: { + actionLink: 'Get help', + actionText: 'Don’t have any of these?', + blockButton__backupCode: 'Use a backup code', + blockButton__emailCode: 'Email code to {{identifier}}', + blockButton__password: 'Continue with your password', + blockButton__phoneCode: 'Send SMS code to {{identifier}}', + blockButton__totp: 'Use your authenticator app', + getHelp: { + blockButton__emailSupport: 'Email support', + content: + 'If you have trouble verifying your account, email us and we will work with you to restore access as soon as possible.', + title: 'Get help', + }, + subtitle: 'Facing issues? You can use any of these methods for verification.', + title: 'Use another method', + }, + backupCodeMfa: { + subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + title: 'Enter a backup code', + }, + emailCode: { + formTitle: 'Verification code', + resendButton: "Didn't receive a code? Resend", + subtitle: 'to continue to {{applicationName}}', + title: 'Check your email', + }, + noAvailableMethods: { + message: "Cannot proceed with verification. There's no available authentication factor.", + subtitle: 'An error occurred', + title: 'Cannot verify your account', + }, + password: { + actionLink: 'Use another method', + subtitle: 'Enter the password associated with your account', + title: 'Enter your password', + }, + phoneCode: { + formTitle: 'Verification code', + resendButton: "Didn't receive a code? Resend", + subtitle: 'to continue to {{applicationName}}', + title: 'Check your phone', + }, + phoneCodeMfa: { + formTitle: 'Verification code', + resendButton: "Didn't receive a code? Resend", + subtitle: 'To continue, please enter the verification code sent to your phone', + title: 'Check your phone', + }, + totpMfa: { + formTitle: 'Verification code', + subtitle: 'To continue, please enter the verification code generated by your authenticator app', + title: 'Two-step verification', + }, + }, waitlist: { start: { actionLink: 'Sign in', diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index b621c74641..ae186a8c00 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const esES: LocalizationResource = { locale: 'es-ES', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Atrás', badge__default: 'Por defecto', badge__otherImpersonatorDevice: 'Otro dispositivo de imitación', @@ -912,6 +857,61 @@ export const esES: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index f208064746..ed57cd161e 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const esMX: LocalizationResource = { locale: 'es-MX', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Atrás', badge__default: 'Por defecto', badge__otherImpersonatorDevice: 'Otro dispositivo de imitación', @@ -914,6 +859,61 @@ export const esMX: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index a09fa89bf2..e107f1ffe2 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const fiFI: LocalizationResource = { locale: 'fi-FI', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Takaisin', badge__default: 'Oletus', badge__otherImpersonatorDevice: 'Toinen jäljitelty laite', @@ -910,6 +855,61 @@ export const fiFI: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index 0d772633ca..97524a2fe5 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const frFR: LocalizationResource = { locale: 'fr-FR', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Retour', badge__default: 'Défaut', badge__otherImpersonatorDevice: "Autre dispositif d'imitation", @@ -914,6 +859,61 @@ export const frFR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index 75d3a8b5e1..fd614dba13 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const heIL: LocalizationResource = { locale: 'he-IL', - __experimental_userVerification: { - alternativeMethods: { - actionLink: 'השג עזרה', - actionText: 'אין לך אף אחד מאלה?', - blockButton__backupCode: 'השתמש בקוד גיבוי', - blockButton__emailCode: 'קוד אימייל ל {{identifier}}', - blockButton__password: 'המשך עם הסיסמה שלך', - blockButton__phoneCode: 'שלח קוד SMS ל {{identifier}}', - blockButton__totp: 'השתמש באפליקציית האימות שלך', - getHelp: { - blockButton__emailSupport: 'תמיכה באימייל', - content: 'אם יש לך בעיה באימות חשבונך, שלח לנו אימייל ואנחנו ניצור איתך קשר על מנת לשחזר את הגישה בהקדם האפשרי', - title: 'השג עזרה', - }, - subtitle: 'נתקלת בבעיות? אתה יכול להשתמש בכל אחת מהשיטות הללו עבור אימות', - title: 'השתמש בשיטה אחרת', - }, - backupCodeMfa: { - subtitle: 'קוד הגיבוי שלך הוא הקוד שקיבלת כאשר הגדרת את האימות הדו-שלבי', - title: 'הכנס את קוד הגיבוי', - }, - emailCode: { - formTitle: 'קוד אימות', - resendButton: 'לא קיבלת קוד? שלח שוב', - subtitle: 'המשך ל {{applicationName}}', - title: 'בדוק את האימייל שלך', - }, - noAvailableMethods: { - message: 'לא ניתן להמשיך עם האימות. אין גורם אימות זמין', - subtitle: 'קרתה תקלה', - title: 'לא ניתן לאמת את חשבונך', - }, - password: { - actionLink: 'השתמש בשיטה אחרת', - subtitle: 'הכנס את הסיסמה המקושרת עם חשבונך', - title: 'הכנס סיסמה', - }, - phoneCode: { - formTitle: 'קוד אימות', - resendButton: 'לא קיבלת קוד? שלח שוב', - subtitle: 'להמשך ל {{applicationName}}', - title: 'בדוק את הטלפון שלך', - }, - phoneCodeMfa: { - formTitle: 'קוד אימות', - resendButton: 'לא קיבלת קוד? שלח שוב', - subtitle: 'להמשך, אנא הכנס את קוד האימות שנשלח לטלפון שלך', - title: 'בדוק את הטלפון שלך', - }, - totpMfa: { - formTitle: 'קוד אימות', - subtitle: 'להמשך, אנא הכנס את קוד האימות שנוצר על ידי אפליקציית האימות שלך', - title: 'אימות דו-שלבי', - }, - }, backButton: 'חזור', badge__default: 'ברירת מחדל', badge__otherImpersonatorDevice: 'מכשיר מחקה אחר', @@ -888,6 +833,61 @@ export const heIL: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, + userVerification: { + alternativeMethods: { + actionLink: 'השג עזרה', + actionText: 'אין לך אף אחד מאלה?', + blockButton__backupCode: 'השתמש בקוד גיבוי', + blockButton__emailCode: 'קוד אימייל ל {{identifier}}', + blockButton__password: 'המשך עם הסיסמה שלך', + blockButton__phoneCode: 'שלח קוד SMS ל {{identifier}}', + blockButton__totp: 'השתמש באפליקציית האימות שלך', + getHelp: { + blockButton__emailSupport: 'תמיכה באימייל', + content: 'אם יש לך בעיה באימות חשבונך, שלח לנו אימייל ואנחנו ניצור איתך קשר על מנת לשחזר את הגישה בהקדם האפשרי', + title: 'השג עזרה', + }, + subtitle: 'נתקלת בבעיות? אתה יכול להשתמש בכל אחת מהשיטות הללו עבור אימות', + title: 'השתמש בשיטה אחרת', + }, + backupCodeMfa: { + subtitle: 'קוד הגיבוי שלך הוא הקוד שקיבלת כאשר הגדרת את האימות הדו-שלבי', + title: 'הכנס את קוד הגיבוי', + }, + emailCode: { + formTitle: 'קוד אימות', + resendButton: 'לא קיבלת קוד? שלח שוב', + subtitle: 'המשך ל {{applicationName}}', + title: 'בדוק את האימייל שלך', + }, + noAvailableMethods: { + message: 'לא ניתן להמשיך עם האימות. אין גורם אימות זמין', + subtitle: 'קרתה תקלה', + title: 'לא ניתן לאמת את חשבונך', + }, + password: { + actionLink: 'השתמש בשיטה אחרת', + subtitle: 'הכנס את הסיסמה המקושרת עם חשבונך', + title: 'הכנס סיסמה', + }, + phoneCode: { + formTitle: 'קוד אימות', + resendButton: 'לא קיבלת קוד? שלח שוב', + subtitle: 'להמשך ל {{applicationName}}', + title: 'בדוק את הטלפון שלך', + }, + phoneCodeMfa: { + formTitle: 'קוד אימות', + resendButton: 'לא קיבלת קוד? שלח שוב', + subtitle: 'להמשך, אנא הכנס את קוד האימות שנשלח לטלפון שלך', + title: 'בדוק את הטלפון שלך', + }, + totpMfa: { + formTitle: 'קוד אימות', + subtitle: 'להמשך, אנא הכנס את קוד האימות שנוצר על ידי אפליקציית האימות שלך', + title: 'אימות דו-שלבי', + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index 736244d1d8..b2f1bfbfa5 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -2,7 +2,7 @@ import type { LocalizationResource } from '@clerk/types'; export const hrHR: LocalizationResource = { locale: 'hr-HR', - __experimental_userVerification: { + userVerification: { alternativeMethods: { actionLink: 'Zatražite pomoć', actionText: 'Nemate ništa od ovoga?', diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 1d54e4b419..62bfff86ac 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const huHU: LocalizationResource = { locale: 'hu-HU', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Vissza', badge__default: 'Alapértelmezett', badge__otherImpersonatorDevice: 'Másik megszemélyesítő eszköz', @@ -911,6 +856,61 @@ export const huHU: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index 5340dd1cd0..a13b8e4937 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const isIS: LocalizationResource = { locale: 'is-IS', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Til baka', badge__default: 'Sjálfgefið', badge__otherImpersonatorDevice: 'Önnur tæki sem herma eftir', @@ -914,6 +859,61 @@ export const isIS: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index f6b9d6fecc..04c893098d 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const itIT: LocalizationResource = { locale: 'it-IT', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Indietro', badge__default: 'Predefinito', badge__otherImpersonatorDevice: 'Altro dispositivo impersonato', @@ -910,6 +855,61 @@ export const itIT: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index 8d874cd52c..e21428045e 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const jaJP: LocalizationResource = { locale: 'ja-JP', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: '戻る', badge__default: 'デフォルト', badge__otherImpersonatorDevice: '他の模倣者デバイス', @@ -903,6 +848,61 @@ export const jaJP: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index db9c329bd0..8284300471 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const koKR: LocalizationResource = { locale: 'ko-KR', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: '돌아가기', badge__default: '기본값', badge__otherImpersonatorDevice: '기타 사칭 장치', @@ -894,6 +839,61 @@ export const koKR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index 6063b5b0df..e3c686dfed 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const mnMN: LocalizationResource = { locale: 'mn-MN', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Буцах', badge__default: 'Анхдагч', badge__otherImpersonatorDevice: 'Бусад дуурайгч төхөөрөмж', @@ -909,6 +854,61 @@ export const mnMN: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index 4be9bf3455..f9ba465ce6 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const nbNO: LocalizationResource = { locale: 'nb-NO', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Tilbake', badge__default: 'Standard', badge__otherImpersonatorDevice: 'Annen imitators enhet', @@ -908,6 +853,61 @@ export const nbNO: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index adea79d9c5..62bc31bd29 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -14,62 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const nlNL: LocalizationResource = { locale: 'nl-NL', - __experimental_userVerification: { - alternativeMethods: { - actionLink: 'Krijg hulp', - actionText: 'Heb je geen van deze?', - blockButton__backupCode: 'Backupcode gebruiken', - blockButton__emailCode: 'Email code naar {{identifier}}', - blockButton__password: 'Doorgaan met je wachtwoord', - blockButton__phoneCode: 'Verzend SMS code naar {{identifier}}', - blockButton__totp: 'Use your authenticator app', - getHelp: { - blockButton__emailSupport: 'Email ondersteuning', - content: - 'Als je moeite hebt om je account te verifiëren, email ons en we zullen met je werken om toegang te herstellen zo snel mogelijk.', - title: 'Krijg hulp', - }, - subtitle: 'Problemen? Je kunt een van deze methoden gebruiken voor verificatie.', - title: 'Gebruik een andere methode', - }, - backupCodeMfa: { - subtitle: 'Je backupcode is de code die je kreeg bij het installeren van tweestapsverificatie.', - title: 'Backupcode invoeren', - }, - emailCode: { - formTitle: 'Verificatiecode', - resendButton: 'Niet ontvangen? Opnieuw verzenden', - subtitle: 'om door te gaan naar {{applicationName}}', - title: 'Controleer je email', - }, - noAvailableMethods: { - message: 'Kan niet verder gaan met verificatie. Er is geen beschikbare verificatiefactor.', - subtitle: 'Er is een fout opgetreden', - title: 'Kan je account niet verifiëren', - }, - password: { - actionLink: 'Gebruik een andere methode', - subtitle: 'Voer het wachtwoord in dat bij je account hoort', - title: 'Voer je wachtwoord in', - }, - phoneCode: { - formTitle: 'Verificatiecode', - resendButton: 'Niet ontvangen? Opnieuw verzenden', - subtitle: 'om door te gaan naar {{applicationName}}', - title: 'Controleer je telefoon', - }, - phoneCodeMfa: { - formTitle: 'Verificatiecode', - resendButton: 'Niet ontvangen? Opnieuw verzenden', - subtitle: 'om door te gaan naar {{applicationName}}', - title: 'Controleer je telefoon', - }, - totpMfa: { - formTitle: 'Verificatiecode', - subtitle: 'om door te gaan naar {{applicationName}}', - title: 'Tweestapsverificatie', - }, - }, backButton: 'Terug', badge__default: 'Standaard', badge__otherImpersonatorDevice: 'Ander impersonatie apparaat', @@ -905,6 +849,62 @@ export const nlNL: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: 'Krijg hulp', + actionText: 'Heb je geen van deze?', + blockButton__backupCode: 'Backupcode gebruiken', + blockButton__emailCode: 'Email code naar {{identifier}}', + blockButton__password: 'Doorgaan met je wachtwoord', + blockButton__phoneCode: 'Verzend SMS code naar {{identifier}}', + blockButton__totp: 'Use your authenticator app', + getHelp: { + blockButton__emailSupport: 'Email ondersteuning', + content: + 'Als je moeite hebt om je account te verifiëren, email ons en we zullen met je werken om toegang te herstellen zo snel mogelijk.', + title: 'Krijg hulp', + }, + subtitle: 'Problemen? Je kunt een van deze methoden gebruiken voor verificatie.', + title: 'Gebruik een andere methode', + }, + backupCodeMfa: { + subtitle: 'Je backupcode is de code die je kreeg bij het installeren van tweestapsverificatie.', + title: 'Backupcode invoeren', + }, + emailCode: { + formTitle: 'Verificatiecode', + resendButton: 'Niet ontvangen? Opnieuw verzenden', + subtitle: 'om door te gaan naar {{applicationName}}', + title: 'Controleer je email', + }, + noAvailableMethods: { + message: 'Kan niet verder gaan met verificatie. Er is geen beschikbare verificatiefactor.', + subtitle: 'Er is een fout opgetreden', + title: 'Kan je account niet verifiëren', + }, + password: { + actionLink: 'Gebruik een andere methode', + subtitle: 'Voer het wachtwoord in dat bij je account hoort', + title: 'Voer je wachtwoord in', + }, + phoneCode: { + formTitle: 'Verificatiecode', + resendButton: 'Niet ontvangen? Opnieuw verzenden', + subtitle: 'om door te gaan naar {{applicationName}}', + title: 'Controleer je telefoon', + }, + phoneCodeMfa: { + formTitle: 'Verificatiecode', + resendButton: 'Niet ontvangen? Opnieuw verzenden', + subtitle: 'om door te gaan naar {{applicationName}}', + title: 'Controleer je telefoon', + }, + totpMfa: { + formTitle: 'Verificatiecode', + subtitle: 'om door te gaan naar {{applicationName}}', + title: 'Tweestapsverificatie', + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index 59b3c48d95..ed8d1a9218 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -14,62 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const plPL: LocalizationResource = { locale: 'pl-PL', - __experimental_userVerification: { - alternativeMethods: { - actionLink: 'Uzyskaj pomoc', - actionText: 'Nie używasz żadnej z tych metod?', - blockButton__backupCode: 'Użyj kodu zapasowego', - blockButton__emailCode: 'Wyślij kod e-mailem do {{identifier}}', - blockButton__password: 'Zaloguj się za pomocą hasła', - blockButton__phoneCode: 'Wyślij kod SMS-em do {{identifier}}', - blockButton__totp: 'Użyj aplikacji uwierzytelniającej', - getHelp: { - blockButton__emailSupport: 'Skontaktuj się z pomocą', - content: - 'Jeśli masz problem z weryfikacją konta, wyślij do nas e-mail, a postaramy się jak najszybciej przywrócić dostęp.', - title: 'Uzyskaj wsparcie', - }, - subtitle: 'Masz problem? Możesz użyć dowolnej z tych metod weryfikacji.', - title: 'Użyj innej metody', - }, - backupCodeMfa: { - subtitle: 'Twój kod zapasowy to ten, który otrzymałeś podczas konfigurowania uwierzytelniania dwuetapowego.', - title: 'Wprowadź kod zapasowy', - }, - emailCode: { - formTitle: 'Kod weryfikacyjny', - resendButton: 'Nie otrzymałeś kodu? Wyślij ponownie', - subtitle: 'aby kontynuować w {{applicationName}}', - title: 'Sprawdź swoją pocztę e-mail', - }, - noAvailableMethods: { - message: 'Nie można kontynuować weryfikacji. Brak dostępnych czynników uwierzytelniania.', - subtitle: 'Wystąpił błąd', - title: 'Nie możemy zweryfikować twojego konta', - }, - password: { - actionLink: 'Użyj innej metody', - subtitle: 'Wprowadź hasło powiązane z twoim kontem', - title: 'Wprowadź swoje hasło', - }, - phoneCode: { - formTitle: 'Kod weryfikacyjny', - resendButton: 'Nie otrzymałeś kodu? Wyślij ponownie', - subtitle: 'aby kontynuować w {{applicationName}}', - title: 'Sprawdź swój telefon', - }, - phoneCodeMfa: { - formTitle: 'Kod weryfikacyjny', - resendButton: 'Nie otrzymałeś kodu? Wyślij ponownie', - subtitle: 'Aby kontynuować, wprowadź kod weryfikacyjny wysłany na twój telefon', - title: 'Sprawdź swój telefon', - }, - totpMfa: { - formTitle: 'Kod weryfikacyjny', - subtitle: 'Aby kontynuować, wprowadź kod weryfikacyjny wygenerowany przez swoją aplikację uwierzytelniającą', - title: 'Weryfikacja dwuetapowa', - }, - }, backButton: 'Powrót', badge__default: 'Domyślny', badge__otherImpersonatorDevice: 'Inne urządzenie osobiste', @@ -907,6 +851,62 @@ export const plPL: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: 'Uzyskaj pomoc', + actionText: 'Nie używasz żadnej z tych metod?', + blockButton__backupCode: 'Użyj kodu zapasowego', + blockButton__emailCode: 'Wyślij kod e-mailem do {{identifier}}', + blockButton__password: 'Zaloguj się za pomocą hasła', + blockButton__phoneCode: 'Wyślij kod SMS-em do {{identifier}}', + blockButton__totp: 'Użyj aplikacji uwierzytelniającej', + getHelp: { + blockButton__emailSupport: 'Skontaktuj się z pomocą', + content: + 'Jeśli masz problem z weryfikacją konta, wyślij do nas e-mail, a postaramy się jak najszybciej przywrócić dostęp.', + title: 'Uzyskaj wsparcie', + }, + subtitle: 'Masz problem? Możesz użyć dowolnej z tych metod weryfikacji.', + title: 'Użyj innej metody', + }, + backupCodeMfa: { + subtitle: 'Twój kod zapasowy to ten, który otrzymałeś podczas konfigurowania uwierzytelniania dwuetapowego.', + title: 'Wprowadź kod zapasowy', + }, + emailCode: { + formTitle: 'Kod weryfikacyjny', + resendButton: 'Nie otrzymałeś kodu? Wyślij ponownie', + subtitle: 'aby kontynuować w {{applicationName}}', + title: 'Sprawdź swoją pocztę e-mail', + }, + noAvailableMethods: { + message: 'Nie można kontynuować weryfikacji. Brak dostępnych czynników uwierzytelniania.', + subtitle: 'Wystąpił błąd', + title: 'Nie możemy zweryfikować twojego konta', + }, + password: { + actionLink: 'Użyj innej metody', + subtitle: 'Wprowadź hasło powiązane z twoim kontem', + title: 'Wprowadź swoje hasło', + }, + phoneCode: { + formTitle: 'Kod weryfikacyjny', + resendButton: 'Nie otrzymałeś kodu? Wyślij ponownie', + subtitle: 'aby kontynuować w {{applicationName}}', + title: 'Sprawdź swój telefon', + }, + phoneCodeMfa: { + formTitle: 'Kod weryfikacyjny', + resendButton: 'Nie otrzymałeś kodu? Wyślij ponownie', + subtitle: 'Aby kontynuować, wprowadź kod weryfikacyjny wysłany na twój telefon', + title: 'Sprawdź swój telefon', + }, + totpMfa: { + formTitle: 'Kod weryfikacyjny', + subtitle: 'Aby kontynuować, wprowadź kod weryfikacyjny wygenerowany przez swoją aplikację uwierzytelniającą', + title: 'Weryfikacja dwuetapowa', + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index 6c5be5442e..a60edcd061 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const ptBR: LocalizationResource = { locale: 'pt-BR', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Voltar', badge__default: 'Padrão', badge__otherImpersonatorDevice: 'Personificar outro dispositivo', @@ -912,6 +857,61 @@ export const ptBR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index 9dd30c63b2..55bc045557 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const ptPT: LocalizationResource = { locale: 'pt-PT', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Voltar', badge__default: 'Padrão', badge__otherImpersonatorDevice: 'Personificar outro dispositivo', @@ -905,6 +850,61 @@ export const ptPT: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index bf78cb0be3..ec14a0ed84 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const roRO: LocalizationResource = { locale: 'ro-RO', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Înapoi', badge__default: 'Implicit', badge__otherImpersonatorDevice: 'Alt dispozitiv de imitație', @@ -916,6 +861,61 @@ export const roRO: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index 96a47e8e67..07564c9a27 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -14,62 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const ruRU: LocalizationResource = { locale: 'ru-RU', - __experimental_userVerification: { - alternativeMethods: { - actionLink: 'Получить помощь', - actionText: 'У вас нет ничего из этого?', - blockButton__backupCode: 'Использовать резервный код', - blockButton__emailCode: 'Отправить код на {{identifier}}', - blockButton__password: 'Продолжить с вашим паролем', - blockButton__phoneCode: 'Отправить SMS код на {{identifier}}', - blockButton__totp: 'Использовать приложение аутентификации', - getHelp: { - blockButton__emailSupport: 'Написать в поддержку', - content: - 'Если у вас возникли проблемы с проверкой учетной записи, напишите нам, и мы вместе с вами восстановим доступ как можно скорее.', - title: 'Получить помощь', - }, - subtitle: 'Столкнулись с проблемами? Вы можете использовать любой из этих методов для верификации', - title: 'Использовать другой метод', - }, - backupCodeMfa: { - subtitle: 'Ваш резервный код - это код, который вы получили при настройке двухфакторной аутентификации.', - title: 'Введите резервный код', - }, - emailCode: { - formTitle: 'Верификационный код', - resendButton: 'Не получили код? Отправить повторно', - subtitle: 'для продолжения {{applicationName}}', - title: 'Проверьте вашу почту', - }, - noAvailableMethods: { - message: 'Невозможно продолжить верификацию. Нет доступного фактора аутентификации.', - subtitle: 'Произошла ошибка', - title: 'Невозможно подтвердить учетную запись', - }, - password: { - actionLink: 'Используйте другой метод', - subtitle: 'Введите пароль, связанный с вашей учетной записью', - title: 'Введите ваш пароль', - }, - phoneCode: { - formTitle: 'Верификационный код', - resendButton: 'Не получили код? Отправить повторно', - subtitle: 'для продолжения {{applicationName}}', - title: 'Проверьте ваш телефон', - }, - phoneCodeMfa: { - formTitle: 'Верификационный код', - resendButton: 'Не получили код? Отправить повторно', - subtitle: 'Для продолжения, введите верификационный код, отправленный на ваш телефон', - title: 'Проверьте ваш телефон', - }, - totpMfa: { - formTitle: 'Верификационный код', - subtitle: 'Чтобы продолжить, введите верификационный код, сгенерированный вашим приложением-аутентификатором', - title: 'Двухфакторная верификация', - }, - }, backButton: 'Назад', badge__default: 'По-умолчанию', badge__otherImpersonatorDevice: 'Другое устройство', @@ -925,6 +869,62 @@ export const ruRU: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, + userVerification: { + alternativeMethods: { + actionLink: 'Получить помощь', + actionText: 'У вас нет ничего из этого?', + blockButton__backupCode: 'Использовать резервный код', + blockButton__emailCode: 'Отправить код на {{identifier}}', + blockButton__password: 'Продолжить с вашим паролем', + blockButton__phoneCode: 'Отправить SMS код на {{identifier}}', + blockButton__totp: 'Использовать приложение аутентификации', + getHelp: { + blockButton__emailSupport: 'Написать в поддержку', + content: + 'Если у вас возникли проблемы с проверкой учетной записи, напишите нам, и мы вместе с вами восстановим доступ как можно скорее.', + title: 'Получить помощь', + }, + subtitle: 'Столкнулись с проблемами? Вы можете использовать любой из этих методов для верификации', + title: 'Использовать другой метод', + }, + backupCodeMfa: { + subtitle: 'Ваш резервный код - это код, который вы получили при настройке двухфакторной аутентификации.', + title: 'Введите резервный код', + }, + emailCode: { + formTitle: 'Верификационный код', + resendButton: 'Не получили код? Отправить повторно', + subtitle: 'для продолжения {{applicationName}}', + title: 'Проверьте вашу почту', + }, + noAvailableMethods: { + message: 'Невозможно продолжить верификацию. Нет доступного фактора аутентификации.', + subtitle: 'Произошла ошибка', + title: 'Невозможно подтвердить учетную запись', + }, + password: { + actionLink: 'Используйте другой метод', + subtitle: 'Введите пароль, связанный с вашей учетной записью', + title: 'Введите ваш пароль', + }, + phoneCode: { + formTitle: 'Верификационный код', + resendButton: 'Не получили код? Отправить повторно', + subtitle: 'для продолжения {{applicationName}}', + title: 'Проверьте ваш телефон', + }, + phoneCodeMfa: { + formTitle: 'Верификационный код', + resendButton: 'Не получили код? Отправить повторно', + subtitle: 'Для продолжения, введите верификационный код, отправленный на ваш телефон', + title: 'Проверьте ваш телефон', + }, + totpMfa: { + formTitle: 'Верификационный код', + subtitle: 'Чтобы продолжить, введите верификационный код, сгенерированный вашим приложением-аутентификатором', + title: 'Двухфакторная верификация', + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index edd8f5e9fe..317f0452f7 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const skSK: LocalizationResource = { locale: 'sk-SK', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Späť', badge__default: 'Predvolené', badge__otherImpersonatorDevice: 'Iné zariadenie zástupcu', @@ -904,6 +849,61 @@ export const skSK: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index f27e526102..c72650de0e 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const srRS: LocalizationResource = { locale: 'sr-RS', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Nazad', badge__default: 'Podrazumevano', badge__otherImpersonatorDevice: 'Drugi uređaj koji se predstavlja', @@ -907,6 +852,61 @@ export const srRS: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index cde0f91ac2..e5e660b1e7 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -14,62 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const svSE: LocalizationResource = { locale: 'sv-SE', - __experimental_userVerification: { - alternativeMethods: { - actionLink: 'Få hjälp', - actionText: 'Har du inget av dessa?', - blockButton__backupCode: 'Använd en reservkod', - blockButton__emailCode: 'Skicka kod via e-post till {{identifier}}', - blockButton__password: 'Fortsätt med ditt lösenord', - blockButton__phoneCode: 'Skicka SMS-kod till {{identifier}}', - blockButton__totp: 'Använd din autentiseringsapp', - getHelp: { - blockButton__emailSupport: 'E-posta support', - content: - 'Om du har problem med att verifiera ditt konto, maila oss så hjälper vi dig att återställa åtkomsten så snart som möjligt.', - title: 'Få hjälp', - }, - subtitle: 'Har du problem? Du kan använda någon av dessa metoder för verifiering.', - title: 'Använd en annan metod', - }, - backupCodeMfa: { - subtitle: 'Din reservkod är den du fick när du ställde in tvåstegsverifiering.', - title: 'Ange en reservkod', - }, - emailCode: { - formTitle: 'Verifieringskod', - resendButton: 'Fick du ingen kod? Skicka igen', - subtitle: 'för att fortsätta till {{applicationName}}', - title: 'Kontrollera din e-post', - }, - noAvailableMethods: { - message: 'Kan inte fortsätta med verifieringen. Det finns ingen tillgänglig autentiseringsfaktor.', - subtitle: 'Ett fel inträffade', - title: 'Kan inte verifiera ditt konto', - }, - password: { - actionLink: 'Använd en annan metod', - subtitle: 'Ange lösenordet som är kopplat till ditt konto', - title: 'Ange ditt lösenord', - }, - phoneCode: { - formTitle: 'Verifieringskod', - resendButton: 'Fick du ingen kod? Skicka igen', - subtitle: 'för att fortsätta till {{applicationName}}', - title: 'Kontrollera din telefon', - }, - phoneCodeMfa: { - formTitle: 'Verifieringskod', - resendButton: 'Fick du ingen kod? Skicka igen', - subtitle: 'För att fortsätta, vänligen ange verifieringskoden som skickats till din telefon', - title: 'Kontrollera din telefon', - }, - totpMfa: { - formTitle: 'Verifieringskod', - subtitle: 'För att fortsätta, vänligen ange verifieringskoden som genererats av din autentiseringsapp', - title: 'Tvåstegsverifiering', - }, - }, backButton: 'Tillbaka', badge__default: 'Standard', badge__otherImpersonatorDevice: 'Annans imitatörenhet', @@ -909,6 +853,62 @@ export const svSE: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, + userVerification: { + alternativeMethods: { + actionLink: 'Få hjälp', + actionText: 'Har du inget av dessa?', + blockButton__backupCode: 'Använd en reservkod', + blockButton__emailCode: 'Skicka kod via e-post till {{identifier}}', + blockButton__password: 'Fortsätt med ditt lösenord', + blockButton__phoneCode: 'Skicka SMS-kod till {{identifier}}', + blockButton__totp: 'Använd din autentiseringsapp', + getHelp: { + blockButton__emailSupport: 'E-posta support', + content: + 'Om du har problem med att verifiera ditt konto, maila oss så hjälper vi dig att återställa åtkomsten så snart som möjligt.', + title: 'Få hjälp', + }, + subtitle: 'Har du problem? Du kan använda någon av dessa metoder för verifiering.', + title: 'Använd en annan metod', + }, + backupCodeMfa: { + subtitle: 'Din reservkod är den du fick när du ställde in tvåstegsverifiering.', + title: 'Ange en reservkod', + }, + emailCode: { + formTitle: 'Verifieringskod', + resendButton: 'Fick du ingen kod? Skicka igen', + subtitle: 'för att fortsätta till {{applicationName}}', + title: 'Kontrollera din e-post', + }, + noAvailableMethods: { + message: 'Kan inte fortsätta med verifieringen. Det finns ingen tillgänglig autentiseringsfaktor.', + subtitle: 'Ett fel inträffade', + title: 'Kan inte verifiera ditt konto', + }, + password: { + actionLink: 'Använd en annan metod', + subtitle: 'Ange lösenordet som är kopplat till ditt konto', + title: 'Ange ditt lösenord', + }, + phoneCode: { + formTitle: 'Verifieringskod', + resendButton: 'Fick du ingen kod? Skicka igen', + subtitle: 'för att fortsätta till {{applicationName}}', + title: 'Kontrollera din telefon', + }, + phoneCodeMfa: { + formTitle: 'Verifieringskod', + resendButton: 'Fick du ingen kod? Skicka igen', + subtitle: 'För att fortsätta, vänligen ange verifieringskoden som skickats till din telefon', + title: 'Kontrollera din telefon', + }, + totpMfa: { + formTitle: 'Verifieringskod', + subtitle: 'För att fortsätta, vänligen ange verifieringskoden som genererats av din autentiseringsapp', + title: 'Tvåstegsverifiering', + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index a5b92f23b8..3f4230e502 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const thTH: LocalizationResource = { locale: 'th-TH', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'กลับ', badge__default: 'ค่าเริ่มต้น', badge__otherImpersonatorDevice: 'อุปกรณ์ปลอมตัวอื่น', @@ -899,6 +844,61 @@ export const thTH: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 60e3d2d17a..4369d4a5b7 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const trTR: LocalizationResource = { locale: 'tr-TR', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Geri', badge__default: 'Varsayılan', badge__otherImpersonatorDevice: 'Diğer taklitçi cihaz', @@ -909,6 +854,61 @@ export const trTR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index 73ac9ed74e..f635b55b8f 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const ukUA: LocalizationResource = { locale: 'uk-UA', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Назад', badge__default: 'За замовчуванням', badge__otherImpersonatorDevice: 'Інший пристрій-двійник', @@ -905,6 +850,61 @@ export const ukUA: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index 421c311f63..5291cfcbc8 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const viVN: LocalizationResource = { locale: 'vi-VN', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: 'Quay lại', badge__default: 'Mặc định', badge__otherImpersonatorDevice: 'Thiết bị nhân danh khác', @@ -905,6 +850,61 @@ export const viVN: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index 5fba3e89c6..d9286a15c4 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const zhCN: LocalizationResource = { locale: 'zh-CN', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: '返回', badge__default: '默认', badge__otherImpersonatorDevice: '其他模拟器设备', @@ -879,6 +824,61 @@ export const zhCN: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 8ced64c75b..0161ba13bc 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -14,61 +14,6 @@ import type { LocalizationResource } from '@clerk/types'; export const zhTW: LocalizationResource = { locale: 'zh-TW', - __experimental_userVerification: { - alternativeMethods: { - actionLink: undefined, - actionText: undefined, - blockButton__backupCode: undefined, - blockButton__emailCode: undefined, - blockButton__password: undefined, - blockButton__phoneCode: undefined, - blockButton__totp: undefined, - getHelp: { - blockButton__emailSupport: undefined, - content: undefined, - title: undefined, - }, - subtitle: undefined, - title: undefined, - }, - backupCodeMfa: { - subtitle: undefined, - title: undefined, - }, - emailCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - noAvailableMethods: { - message: undefined, - subtitle: undefined, - title: undefined, - }, - password: { - actionLink: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCode: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - phoneCodeMfa: { - formTitle: undefined, - resendButton: undefined, - subtitle: undefined, - title: undefined, - }, - totpMfa: { - formTitle: undefined, - subtitle: undefined, - title: undefined, - }, - }, backButton: '返回', badge__default: '默認', badge__otherImpersonatorDevice: '其他模擬器設備', @@ -889,6 +834,61 @@ export const zhTW: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, + userVerification: { + alternativeMethods: { + actionLink: undefined, + actionText: undefined, + blockButton__backupCode: undefined, + blockButton__emailCode: undefined, + blockButton__password: undefined, + blockButton__phoneCode: undefined, + blockButton__totp: undefined, + getHelp: { + blockButton__emailSupport: undefined, + content: undefined, + title: undefined, + }, + subtitle: undefined, + title: undefined, + }, + backupCodeMfa: { + subtitle: undefined, + title: undefined, + }, + emailCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + noAvailableMethods: { + message: undefined, + subtitle: undefined, + title: undefined, + }, + password: { + actionLink: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCode: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + phoneCodeMfa: { + formTitle: undefined, + resendButton: undefined, + subtitle: undefined, + title: undefined, + }, + totpMfa: { + formTitle: undefined, + subtitle: undefined, + title: undefined, + }, + }, waitlist: { start: { actionLink: undefined, diff --git a/packages/nextjs/src/client-boundary/hooks.ts b/packages/nextjs/src/client-boundary/hooks.ts index 3ef5c09f78..41b0d8a008 100644 --- a/packages/nextjs/src/client-boundary/hooks.ts +++ b/packages/nextjs/src/client-boundary/hooks.ts @@ -10,7 +10,7 @@ export { useSignIn, useSignUp, useUser, - __experimental_useReverification, + useReverification, } from '@clerk/clerk-react'; export { diff --git a/packages/nextjs/src/index.ts b/packages/nextjs/src/index.ts index 394648ae6e..4000aeccea 100644 --- a/packages/nextjs/src/index.ts +++ b/packages/nextjs/src/index.ts @@ -49,7 +49,7 @@ export { useSignIn, useSignUp, useUser, - __experimental_useReverification, + useReverification, } from './client-boundary/hooks'; /** diff --git a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap index 77a73c8403..a891300708 100644 --- a/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap +++ b/packages/nextjs/src/server/__tests__/__snapshots__/exports.test.ts.snap @@ -2,8 +2,6 @@ exports[`/server public exports > should not include a breaking change 1`] = ` [ - "__experimental_reverificationError", - "__experimental_reverificationErrorResponse", "auth", "buildClerkProps", "clerkClient", @@ -12,6 +10,8 @@ exports[`/server public exports > should not include a breaking change 1`] = ` "createRouteMatcher", "currentUser", "getAuth", + "reverificationError", + "reverificationErrorResponse", "verifyToken", ] `; diff --git a/packages/nextjs/src/server/index.ts b/packages/nextjs/src/server/index.ts index 686f72d0d7..d1fd9b1192 100644 --- a/packages/nextjs/src/server/index.ts +++ b/packages/nextjs/src/server/index.ts @@ -67,7 +67,4 @@ export type { /** * Utilities for reverification */ -export { - __experimental_reverificationErrorResponse, - __experimental_reverificationError, -} from '@clerk/backend/internal'; +export { reverificationErrorResponse, reverificationError } from '@clerk/backend/internal'; diff --git a/packages/react/src/contexts/AuthContext.ts b/packages/react/src/contexts/AuthContext.ts index db59ac0fe7..02d3919620 100644 --- a/packages/react/src/contexts/AuthContext.ts +++ b/packages/react/src/contexts/AuthContext.ts @@ -9,7 +9,7 @@ export type AuthContextValue = { orgRole: OrganizationCustomRoleKey | null | undefined; orgSlug: string | null | undefined; orgPermissions: OrganizationCustomPermissionKey[] | null | undefined; - __experimental_factorVerificationAge: [number, number] | null; + factorVerificationAge: [number, number] | null; }; export const [AuthContext, useAuthContext] = createContextAndHook('AuthContext'); diff --git a/packages/react/src/contexts/ClerkContextProvider.tsx b/packages/react/src/contexts/ClerkContextProvider.tsx index 13d8933943..2c83c4bae5 100644 --- a/packages/react/src/contexts/ClerkContextProvider.tsx +++ b/packages/react/src/contexts/ClerkContextProvider.tsx @@ -46,7 +46,7 @@ export function ClerkContextProvider(props: ClerkContextProvider): JSX.Element | orgRole, orgSlug, orgPermissions, - __experimental_factorVerificationAge, + factorVerificationAge, } = derivedState; const authCtx = React.useMemo(() => { @@ -58,10 +58,10 @@ export function ClerkContextProvider(props: ClerkContextProvider): JSX.Element | orgRole, orgSlug, orgPermissions, - __experimental_factorVerificationAge, + factorVerificationAge, }; return { value }; - }, [sessionId, userId, actor, orgId, orgRole, orgSlug, __experimental_factorVerificationAge]); + }, [sessionId, userId, actor, orgId, orgRole, orgSlug, factorVerificationAge]); const sessionCtx = React.useMemo(() => ({ value: session }), [sessionId, session]); const userCtx = React.useMemo(() => ({ value: user }), [userId, user]); const organizationCtx = React.useMemo(() => { diff --git a/packages/react/src/hooks/__tests__/useAuth.test.ts b/packages/react/src/hooks/__tests__/useAuth.test.ts index 4fae6bf32b..b7a29cdbd4 100644 --- a/packages/react/src/hooks/__tests__/useAuth.test.ts +++ b/packages/react/src/hooks/__tests__/useAuth.test.ts @@ -25,7 +25,7 @@ describe('useAuth type tests', () => { expectTypeOf({ role: 'org:admin', permission: 'some-perm' }).not.toMatchTypeOf(); }); - it('has with role and assurance is allowed', () => { + it('has with role and re-verification is allowed', () => { expectTypeOf({ role: 'org:admin', __experimental_reverification: { @@ -35,10 +35,10 @@ describe('useAuth type tests', () => { } as const).toMatchTypeOf(); }); - it('has with permission and reverification is allowed', () => { + it('has with permission and re-verification is allowed', () => { expectTypeOf({ permission: 'org:edit:posts', - __experimental_reverification: { + reverification: { level: 'first_factor', afterMinutes: 10, }, @@ -47,7 +47,7 @@ describe('useAuth type tests', () => { it('has({reverification: {level, maxAge}}) is allowed', () => { expectTypeOf({ - __experimental_reverification: { + reverification: { level: 'first_factor', afterMinutes: 10, }, @@ -56,7 +56,7 @@ describe('useAuth type tests', () => { it('reverification with other values as maxAge should throw', () => { expectTypeOf({ - __experimental_reverification: { + reverification: { level: 'first_factor', afterMinutes: '10', }, @@ -65,37 +65,37 @@ describe('useAuth type tests', () => { it('veryStrict reverification is allowed', () => { expectTypeOf({ - __experimental_reverification: 'strict_mfa', + reverification: 'strict_mfa', } as const).toMatchTypeOf(); }); it('strict reverification is allowed', () => { expectTypeOf({ - __experimental_reverification: 'strict', + reverification: 'strict', } as const).toMatchTypeOf(); }); it('moderate reverification is allowed', () => { expectTypeOf({ - __experimental_reverification: 'moderate', + reverification: 'moderate', } as const).toMatchTypeOf(); }); it('lax reverification is allowed', () => { expectTypeOf({ - __experimental_reverification: 'lax', + reverification: 'lax', } as const).toMatchTypeOf(); }); it('random reverification is not allowed', () => { expectTypeOf({ - __experimental_reverification: 'random', + reverification: 'random', } as const).not.toMatchTypeOf(); }); it('reverification with other strings as level should throw', () => { expectTypeOf({ - __experimental_reverification: { + reverification: { level: 'some-factor', afterMinutes: 10, }, @@ -104,7 +104,7 @@ describe('useAuth type tests', () => { it('reverification with number as level should throw', () => { expectTypeOf({ - __experimental_reverification: { + reverification: { level: 2, afterMinutes: 10, }, diff --git a/packages/react/src/hooks/index.ts b/packages/react/src/hooks/index.ts index 788a84b1e2..5a6cb60cb6 100644 --- a/packages/react/src/hooks/index.ts +++ b/packages/react/src/hooks/index.ts @@ -9,5 +9,5 @@ export { useSessionList, useUser, useSession, - __experimental_useReverification, + useReverification, } from '@clerk/shared/react'; diff --git a/packages/react/src/hooks/useAuth.ts b/packages/react/src/hooks/useAuth.ts index bb883908c7..d666c50d23 100644 --- a/packages/react/src/hooks/useAuth.ts +++ b/packages/react/src/hooks/useAuth.ts @@ -67,8 +67,7 @@ export const useAuth: UseAuth = (initialAuthState = {}) => { setAuthState(authContext); }, [authContext]); - const { sessionId, userId, actor, orgId, orgRole, orgSlug, orgPermissions, __experimental_factorVerificationAge } = - authState; + const { sessionId, userId, actor, orgId, orgRole, orgSlug, orgPermissions, factorVerificationAge } = authState; const isomorphicClerk = useIsomorphicClerkContext(); const getToken: GetToken = useCallback(createGetToken(isomorphicClerk), [isomorphicClerk]); @@ -84,7 +83,7 @@ export const useAuth: UseAuth = (initialAuthState = {}) => { getToken, signOut, orgPermissions, - __experimental_factorVerificationAge, + factorVerificationAge, }); }; @@ -100,7 +99,7 @@ export function useDerivedAuth(authObject: any): UseAuthReturn { signOut, getToken, orgPermissions, - __experimental_factorVerificationAge, + factorVerificationAge, } = authObject ?? {}; const derivedHas = useCallback( @@ -113,10 +112,10 @@ export function useDerivedAuth(authObject: any): UseAuthReturn { orgId, orgRole, orgPermissions, - __experimental_factorVerificationAge, + factorVerificationAge, })(params); }, - [userId, __experimental_factorVerificationAge, orgId, orgRole, orgPermissions], + [userId, factorVerificationAge, orgId, orgRole, orgPermissions], ); if (sessionId === undefined && userId === undefined) { diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index cabf975d4c..cd2aba4524 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -3,8 +3,8 @@ import { loadClerkJsScript } from '@clerk/shared/loadClerkJsScript'; import type { TelemetryCollector } from '@clerk/shared/telemetry'; import { handleValueOrFn } from '@clerk/shared/utils'; import type { - __experimental_UserVerificationModalProps, - __experimental_UserVerificationProps, + __internal_UserVerificationModalProps, + __internal_UserVerificationProps, ActiveSessionResource, AuthenticateWithCoinbaseWalletParams, AuthenticateWithGoogleOneTapParams, @@ -178,7 +178,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { private readonly Clerk: ClerkProp; private clerkjs: BrowserClerk | HeadlessBrowserClerk | null = null; private preopenOneTap?: null | GoogleOneTapProps = null; - private preopenUserVerification?: null | __experimental_UserVerificationProps = null; + private preopenUserVerification?: null | __internal_UserVerificationProps = null; private preopenSignIn?: null | SignInProps = null; private preopenSignUp?: null | SignUpProps = null; private preopenUserProfile?: null | UserProfileProps = null; @@ -542,7 +542,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } if (this.preopenUserVerification !== null) { - clerkjs.__experimental_openUserVerification(this.preopenUserVerification); + clerkjs.__internal_openUserVerification(this.preopenUserVerification); } if (this.preopenOneTap !== null) { @@ -688,17 +688,17 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; - __experimental_openUserVerification = (props?: __experimental_UserVerificationModalProps): void => { + __internal_openUserVerification = (props?: __internal_UserVerificationModalProps): void => { if (this.clerkjs && this.#loaded) { - this.clerkjs.__experimental_openUserVerification(props); + this.clerkjs.__internal_openUserVerification(props); } else { this.preopenUserVerification = props; } }; - __experimental_closeUserVerification = (): void => { + __internal_closeUserVerification = (): void => { if (this.clerkjs && this.#loaded) { - this.clerkjs.__experimental_closeUserVerification(); + this.clerkjs.__internal_closeUserVerification(); } else { this.preopenUserVerification = null; } diff --git a/packages/shared/src/authorization-errors.ts b/packages/shared/src/authorization-errors.ts index a94010bebb..bedcf8c386 100644 --- a/packages/shared/src/authorization-errors.ts +++ b/packages/shared/src/authorization-errors.ts @@ -1,4 +1,4 @@ -import type { __experimental_ReverificationConfig } from '@clerk/types'; +import type { ReverificationConfig } from '@clerk/types'; type ClerkError = { clerk_error: T; @@ -13,7 +13,7 @@ type ReverificationError = } & M >; -const __experimental_reverificationError = ( +const reverificationError = ( missingConfig?: MC, ): ReverificationError<{ metadata: { @@ -29,14 +29,12 @@ const __experimental_reverificationError = ) => - new Response(JSON.stringify(__experimental_reverificationError(...args)), { +const reverificationErrorResponse = (...args: Parameters) => + new Response(JSON.stringify(reverificationError(...args)), { status: 403, }); -const __experimental_isReverificationHint = ( - result: any, -): result is ReturnType => { +const isReverificationHint = (result: any): result is ReturnType => { return ( result && typeof result === 'object' && @@ -46,8 +44,4 @@ const __experimental_isReverificationHint = ( ); }; -export { - __experimental_reverificationError, - __experimental_reverificationErrorResponse, - __experimental_isReverificationHint, -}; +export { reverificationError, reverificationErrorResponse, isReverificationHint }; diff --git a/packages/shared/src/authorization.ts b/packages/shared/src/authorization.ts index 489067bbfb..f09d5129fe 100644 --- a/packages/shared/src/authorization.ts +++ b/packages/shared/src/authorization.ts @@ -1,22 +1,19 @@ import type { - __experimental_ReverificationConfig, - __experimental_SessionVerificationLevel, - __experimental_SessionVerificationTypes, CheckAuthorizationWithCustomPermissions, OrganizationCustomPermissionKey, OrganizationCustomRoleKey, + ReverificationConfig, + SessionVerificationLevel, + SessionVerificationTypes, } from '@clerk/types'; -type TypesToConfig = Record< - __experimental_SessionVerificationTypes, - Exclude<__experimental_ReverificationConfig, __experimental_SessionVerificationTypes> ->; +type TypesToConfig = Record>; type AuthorizationOptions = { userId: string | null | undefined; orgId: string | null | undefined; orgRole: string | null | undefined; orgPermissions: string[] | null | undefined; - __experimental_factorVerificationAge: [number, number] | null; + factorVerificationAge: [number, number] | null; }; type CheckOrgAuthorization = ( @@ -26,9 +23,9 @@ type CheckOrgAuthorization = ( type CheckStepUpAuthorization = ( params: { - __experimental_reverification?: __experimental_ReverificationConfig; + reverification?: ReverificationConfig; }, - { __experimental_factorVerificationAge }: AuthorizationOptions, + { factorVerificationAge }: AuthorizationOptions, ) => boolean | null; const TYPES_TO_OBJECTS: TypesToConfig = { @@ -50,13 +47,9 @@ const TYPES_TO_OBJECTS: TypesToConfig = { }, }; -const ALLOWED_LEVELS = new Set<__experimental_SessionVerificationLevel>([ - 'first_factor', - 'second_factor', - 'multi_factor', -]); +const ALLOWED_LEVELS = new Set(['first_factor', 'second_factor', 'multi_factor']); -const ALLOWED_TYPES = new Set<__experimental_SessionVerificationTypes>(['strict_mfa', 'strict', 'moderate', 'lax']); +const ALLOWED_TYPES = new Set(['strict_mfa', 'strict', 'moderate', 'lax']); // Helper functions const isValidMaxAge = (maxAge: any) => typeof maxAge === 'number' && maxAge > 0; @@ -86,8 +79,8 @@ const checkOrgAuthorization: CheckOrgAuthorization = (params, options) => { return null; }; -const validateReverificationConfig = (config: __experimental_ReverificationConfig | undefined) => { - const convertConfigToObject = (config: __experimental_ReverificationConfig) => { +const validateReverificationConfig = (config: ReverificationConfig | undefined) => { + const convertConfigToObject = (config: ReverificationConfig) => { if (typeof config === 'string') { return TYPES_TO_OBJECTS[config]; } @@ -111,18 +104,18 @@ const validateReverificationConfig = (config: __experimental_ReverificationConfi * Handles different verification levels (first factor, second factor, multi-factor). * @returns null, if requirements or verification data are missing. */ -const checkStepUpAuthorization: CheckStepUpAuthorization = (params, { __experimental_factorVerificationAge }) => { - if (!params.__experimental_reverification || !__experimental_factorVerificationAge) { +const checkStepUpAuthorization: CheckStepUpAuthorization = (params, { factorVerificationAge }) => { + if (!params.reverification || !factorVerificationAge) { return null; } - const isValidReverification = validateReverificationConfig(params.__experimental_reverification); + const isValidReverification = validateReverificationConfig(params.reverification); if (!isValidReverification) { return null; } const { level, afterMinutes } = isValidReverification(); - const [factor1Age, factor2Age] = __experimental_factorVerificationAge; + const [factor1Age, factor2Age] = factorVerificationAge; // -1 indicates the factor group (1fa,2fa) is not enabled // -1 for 1fa is not a valid scenario, but we need to make sure we handle it properly diff --git a/packages/shared/src/deriveState.ts b/packages/shared/src/deriveState.ts index 03a51356b6..771c804083 100644 --- a/packages/shared/src/deriveState.ts +++ b/packages/shared/src/deriveState.ts @@ -29,7 +29,7 @@ const deriveFromSsrInitialState = (initialState: InitialState) => { const orgPermissions = initialState.orgPermissions as OrganizationCustomPermissionKey[]; const orgSlug = initialState.orgSlug; const actor = initialState.actor; - const __experimental_factorVerificationAge = initialState.__experimental_factorVerificationAge; + const factorVerificationAge = initialState.factorVerificationAge; return { userId, @@ -42,7 +42,7 @@ const deriveFromSsrInitialState = (initialState: InitialState) => { orgPermissions, orgSlug, actor, - __experimental_factorVerificationAge, + factorVerificationAge, }; }; @@ -51,9 +51,7 @@ const deriveFromClientSideState = (state: Resources) => { const user = state.user; const sessionId: string | null | undefined = state.session ? state.session.id : state.session; const session = state.session; - const __experimental_factorVerificationAge: [number, number] | null = state.session - ? state.session.__experimental_factorVerificationAge - : null; + const factorVerificationAge: [number, number] | null = state.session ? state.session.factorVerificationAge : null; const actor = session?.actor; const organization = state.organization; const orgId: string | null | undefined = state.organization ? state.organization.id : state.organization; @@ -75,6 +73,6 @@ const deriveFromClientSideState = (state: Resources) => { orgSlug, orgPermissions, actor, - __experimental_factorVerificationAge, + factorVerificationAge, }; }; diff --git a/packages/shared/src/react/__tests__/useReverification.test.ts b/packages/shared/src/react/__tests__/useReverification.test.ts index 113ea3ee51..6100b505cf 100644 --- a/packages/shared/src/react/__tests__/useReverification.test.ts +++ b/packages/shared/src/react/__tests__/useReverification.test.ts @@ -1,7 +1,7 @@ import { expectTypeOf } from 'expect-type'; -import { __experimental_reverificationError } from '../../authorization-errors'; -import type { __experimental_useReverification as useReverification } from '../hooks/useReverification'; +import { reverificationError } from '../../authorization-errors'; +import type { useReverification } from '../hooks/useReverification'; type ExcludeClerkError = T extends { clerk_error: any } ? never : T; @@ -14,7 +14,7 @@ const fetcher = async (key: string, options: { id: string }) => { const fetcherWithHelper = async (key: string, options: { id: string }) => { if (key == 'a') { - return __experimental_reverificationError(); + return reverificationError(); } return { diff --git a/packages/shared/src/react/hooks/index.ts b/packages/shared/src/react/hooks/index.ts index 61665439f8..e9d80343a6 100644 --- a/packages/shared/src/react/hooks/index.ts +++ b/packages/shared/src/react/hooks/index.ts @@ -7,4 +7,4 @@ export { useSessionList } from './useSessionList'; export { useUser } from './useUser'; export { useClerk } from './useClerk'; export { useDeepEqualMemo, isDeeplyEqual } from './useDeepEqualMemo'; -export { __experimental_useReverification } from './useReverification'; +export { useReverification } from './useReverification'; diff --git a/packages/shared/src/react/hooks/useReverification.ts b/packages/shared/src/react/hooks/useReverification.ts index 7efb0d844e..61bf6fd3a9 100644 --- a/packages/shared/src/react/hooks/useReverification.ts +++ b/packages/shared/src/react/hooks/useReverification.ts @@ -2,15 +2,13 @@ import type { Clerk } from '@clerk/types'; import { useMemo, useRef } from 'react'; import { validateReverificationConfig } from '../../authorization'; -import { __experimental_isReverificationHint, __experimental_reverificationError } from '../../authorization-errors'; +import { isReverificationHint, reverificationError } from '../../authorization-errors'; import { ClerkRuntimeError, isClerkAPIResponseError, isClerkRuntimeError } from '../../error'; import { createDeferredPromise } from '../../utils/createDeferredPromise'; import { useClerk } from './useClerk'; import { useSafeLayoutEffect } from './useSafeLayoutEffect'; -async function resolveResult( - result: Promise | T, -): Promise> { +async function resolveResult(result: Promise | T): Promise> { try { const r = await result; if (r instanceof Response) { @@ -20,7 +18,7 @@ async function resolveResult( } catch (e) { // Treat fapi assurance as an assurance hint if (isClerkAPIResponseError(e) && e.errors.find(({ code }) => code == 'session_step_up_verification_required')) { - return __experimental_reverificationError(); + return reverificationError(); } // rethrow @@ -36,7 +34,7 @@ type UseReverificationOptions = { }; type CreateReverificationHandlerParams = UseReverificationOptions & { - openUIComponent: Clerk['__experimental_openUserVerification']; + openUIComponent: Clerk['__internal_openUserVerification']; }; function createReverificationHandler(params: CreateReverificationHandlerParams) { @@ -48,7 +46,7 @@ function createReverificationHandler(params: CreateReverificationHandlerParams) return (async (...args: Parameters) => { let result = await resolveResult(fetcher(...args)); - if (__experimental_isReverificationHint(result)) { + if (isReverificationHint(result)) { /** * Create a promise */ @@ -127,21 +125,21 @@ type UseReverificationResult< * return * } */ -function __experimental_useReverification< +function useReverification< Fetcher extends (...args: any[]) => Promise | undefined, Options extends UseReverificationOptions, >(fetcher: Fetcher, options?: Options): UseReverificationResult { - const { __experimental_openUserVerification } = useClerk(); + const { __internal_openUserVerification } = useClerk(); const fetcherRef = useRef(fetcher); const optionsRef = useRef(options); const handleReverification = useMemo(() => { const handler = createReverificationHandler({ - openUIComponent: __experimental_openUserVerification, + openUIComponent: __internal_openUserVerification, ...optionsRef.current, })(fetcherRef.current); return [handler] as const; - }, [__experimental_openUserVerification, fetcherRef.current, optionsRef.current]); + }, [__internal_openUserVerification, fetcherRef.current, optionsRef.current]); // Keep fetcher and options ref in sync useSafeLayoutEffect(() => { @@ -152,4 +150,4 @@ function __experimental_useReverification< return handleReverification; } -export { __experimental_useReverification }; +export { useReverification }; diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index 3450c49b22..eee17db904 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -35,7 +35,7 @@ import type { } from './redirects'; import type { ClerkHostRouter } from './router'; import type { ActiveSessionResource } from './session'; -import type { __experimental_SessionVerificationLevel } from './sessionVerification'; +import type { SessionVerificationLevel } from './sessionVerification'; import type { SignInResource } from './signIn'; import type { SignUpResource } from './signUp'; import type { Web3Strategy } from './strategies'; @@ -165,16 +165,14 @@ export interface Clerk { /** * Opens the Clerk UserVerification component in a modal. - * @experimantal This API is still under active development and may change at any moment. * @param props Optional user verification configuration parameters. */ - __experimental_openUserVerification: (props?: __experimental_UserVerificationModalProps) => void; + __internal_openUserVerification: (props?: __internal_UserVerificationModalProps) => void; /** * Closes the Clerk user verification modal. - * @experimantal This API is still under active development and may change at any moment. */ - __experimental_closeUserVerification: () => void; + __internal_closeUserVerification: () => void; /** * Opens the Google One Tap component. @@ -919,10 +917,7 @@ interface TransferableOption { export type SignInModalProps = WithoutRouting; -/** - * @experimantal - */ -export type __experimental_UserVerificationProps = RoutingOptions & { +export type __internal_UserVerificationProps = RoutingOptions & { /** * Non-awaitable callback for when verification is completed successfully */ @@ -938,7 +933,7 @@ export type __experimental_UserVerificationProps = RoutingOptions & { * When `multiFactor` is used, the user will be prompt for a first factor flow followed by a second factor flow. * @default `'secondFactor'` */ - level?: __experimental_SessionVerificationLevel; + level?: SessionVerificationLevel; /** * Customisation options to fully match the Clerk components to your own brand. @@ -948,7 +943,7 @@ export type __experimental_UserVerificationProps = RoutingOptions & { appearance?: UserVerificationTheme; }; -export type __experimental_UserVerificationModalProps = WithoutRouting<__experimental_UserVerificationProps>; +export type __internal_UserVerificationModalProps = WithoutRouting<__internal_UserVerificationProps>; type GoogleOneTapRedirectUrlProps = SignInForceRedirectUrl & SignUpForceRedirectUrl; diff --git a/packages/types/src/json.ts b/packages/types/src/json.ts index 152ed6dd08..397e5f2ee4 100644 --- a/packages/types/src/json.ts +++ b/packages/types/src/json.ts @@ -13,10 +13,7 @@ import type { OrganizationSettingsJSON } from './organizationSettings'; import type { OrganizationSuggestionStatus } from './organizationSuggestion'; import type { SamlIdpSlug } from './saml'; import type { SessionStatus } from './session'; -import type { - __experimental_SessionVerificationLevel, - __experimental_SessionVerificationStatus, -} from './sessionVerification'; +import type { SessionVerificationLevel, SessionVerificationStatus } from './sessionVerification'; import type { SignInFirstFactor, SignInJSON, SignInSecondFactor } from './signIn'; import type { SignUpField, SignUpIdentificationField, SignUpStatus } from './signUp'; import type { BoxShadow, Color, EmUnit, FontWeight, HexColor } from './theme'; @@ -126,13 +123,13 @@ export interface SessionJSON extends ClerkResourceJSON { updated_at: number; } -export interface __experimental_SessionVerificationJSON extends ClerkResourceJSON { +export interface SessionVerificationJSON extends ClerkResourceJSON { object: 'session_verification'; - status: __experimental_SessionVerificationStatus; + status: SessionVerificationStatus; first_factor_verification: VerificationJSON | null; session: SessionJSON; second_factor_verification: VerificationJSON | null; - level: __experimental_SessionVerificationLevel; + level: SessionVerificationLevel; supported_first_factors: SignInFirstFactorJSON[] | null; supported_second_factors: SignInSecondFactorJSON[] | null; } diff --git a/packages/types/src/localization.ts b/packages/types/src/localization.ts index 14f008942b..6e4708884c 100644 --- a/packages/types/src/localization.ts +++ b/packages/types/src/localization.ts @@ -305,7 +305,7 @@ type _LocalizationResource = { action__signOutAll: LocalizationValue; }; }; - __experimental_userVerification: { + userVerification: { password: { title: LocalizationValue; subtitle: LocalizationValue; diff --git a/packages/types/src/session.ts b/packages/types/src/session.ts index d401e56316..e9635e1912 100644 --- a/packages/types/src/session.ts +++ b/packages/types/src/session.ts @@ -16,9 +16,9 @@ import type { } from './organizationMembership'; import type { ClerkResource } from './resource'; import type { - __experimental_ReverificationConfig, - __experimental_SessionVerificationLevel, - __experimental_SessionVerificationResource, + ReverificationConfig, + SessionVerificationLevel, + SessionVerificationResource, } from './sessionVerification'; import type { TokenResource } from './token'; import type { UserResource } from './user'; @@ -28,7 +28,11 @@ export type CheckAuthorizationFn = (isAuthorizedParams: Params) => boole export type CheckAuthorizationWithCustomPermissions = CheckAuthorizationFn; -export type CheckAuthorizationParamsWithCustomPermissions = ( +type WithReverification = T & { + reverification?: ReverificationConfig; +}; + +export type CheckAuthorizationParamsWithCustomPermissions = WithReverification< | { role: OrganizationCustomRoleKey; permission?: never; @@ -38,13 +42,11 @@ export type CheckAuthorizationParamsWithCustomPermissions = ( permission: OrganizationCustomPermissionKey; } | { role?: never; permission?: never } -) & { - __experimental_reverification?: __experimental_ReverificationConfig; -}; +>; export type CheckAuthorization = CheckAuthorizationFn; -type CheckAuthorizationParams = ( +type CheckAuthorizationParams = WithReverification< | { role: OrganizationCustomRoleKey; permission?: never; @@ -57,9 +59,7 @@ type CheckAuthorizationParams = ( role?: never; permission?: never; } -) & { - __experimental_reverification?: __experimental_ReverificationConfig; -}; +>; export interface SessionResource extends ClerkResource { id: string; @@ -70,9 +70,8 @@ export interface SessionResource extends ClerkResource { * Factor Verification Age * Each item represents the minutes that have passed since the last time a first or second factor were verified. * [fistFactorAge, secondFactorAge] - * @experimental This API is experimental and may change at any moment. */ - __experimental_factorVerificationAge: [number, number] | null; + factorVerificationAge: [number, number] | null; lastActiveToken: TokenResource | null; lastActiveOrganizationId: string | null; lastActiveAt: Date; @@ -88,21 +87,19 @@ export interface SessionResource extends ClerkResource { createdAt: Date; updatedAt: Date; - __experimental_startVerification: ( - params: __experimental_SessionVerifyCreateParams, - ) => Promise<__experimental_SessionVerificationResource>; - __experimental_prepareFirstFactorVerification: ( - factor: __experimental_SessionVerifyPrepareFirstFactorParams, - ) => Promise<__experimental_SessionVerificationResource>; - __experimental_attemptFirstFactorVerification: ( - attemptFactor: __experimental_SessionVerifyAttemptFirstFactorParams, - ) => Promise<__experimental_SessionVerificationResource>; - __experimental_prepareSecondFactorVerification: ( - params: __experimental_SessionVerifyPrepareSecondFactorParams, - ) => Promise<__experimental_SessionVerificationResource>; - __experimental_attemptSecondFactorVerification: ( - params: __experimental_SessionVerifyAttemptSecondFactorParams, - ) => Promise<__experimental_SessionVerificationResource>; + startVerification: (params: SessionVerifyCreateParams) => Promise; + prepareFirstFactorVerification: ( + factor: SessionVerifyPrepareFirstFactorParams, + ) => Promise; + attemptFirstFactorVerification: ( + attemptFactor: SessionVerifyAttemptFirstFactorParams, + ) => Promise; + prepareSecondFactorVerification: ( + params: SessionVerifyPrepareSecondFactorParams, + ) => Promise; + attemptSecondFactorVerification: ( + params: SessionVerifyAttemptSecondFactorParams, + ) => Promise; } export interface ActiveSessionResource extends SessionResource { @@ -152,15 +149,12 @@ export type GetTokenOptions = { }; export type GetToken = (options?: GetTokenOptions) => Promise; -export type __experimental_SessionVerifyCreateParams = { - level: __experimental_SessionVerificationLevel; +export type SessionVerifyCreateParams = { + level: SessionVerificationLevel; }; -export type __experimental_SessionVerifyPrepareFirstFactorParams = EmailCodeConfig | PhoneCodeConfig; -export type __experimental_SessionVerifyAttemptFirstFactorParams = - | EmailCodeAttempt - | PhoneCodeAttempt - | PasswordAttempt; +export type SessionVerifyPrepareFirstFactorParams = EmailCodeConfig | PhoneCodeConfig; +export type SessionVerifyAttemptFirstFactorParams = EmailCodeAttempt | PhoneCodeAttempt | PasswordAttempt; -export type __experimental_SessionVerifyPrepareSecondFactorParams = PhoneCodeSecondFactorConfig; -export type __experimental_SessionVerifyAttemptSecondFactorParams = PhoneCodeAttempt | TOTPAttempt | BackupCodeAttempt; +export type SessionVerifyPrepareSecondFactorParams = PhoneCodeSecondFactorConfig; +export type SessionVerifyAttemptSecondFactorParams = PhoneCodeAttempt | TOTPAttempt | BackupCodeAttempt; diff --git a/packages/types/src/sessionVerification.ts b/packages/types/src/sessionVerification.ts index 71a6b68fb7..c5ebdbaa0b 100644 --- a/packages/types/src/sessionVerification.ts +++ b/packages/types/src/sessionVerification.ts @@ -3,29 +3,29 @@ import type { ClerkResource } from './resource'; import type { SessionResource } from './session'; import type { VerificationResource } from './verification'; -export interface __experimental_SessionVerificationResource extends ClerkResource { - status: __experimental_SessionVerificationStatus; - level: __experimental_SessionVerificationLevel; +export interface SessionVerificationResource extends ClerkResource { + status: SessionVerificationStatus; + level: SessionVerificationLevel; session: SessionResource; firstFactorVerification: VerificationResource; secondFactorVerification: VerificationResource; - supportedFirstFactors: __experimental_SessionVerificationFirstFactor[] | null; - supportedSecondFactors: __experimental_SessionVerificationSecondFactor[] | null; + supportedFirstFactors: SessionVerificationFirstFactor[] | null; + supportedSecondFactors: SessionVerificationSecondFactor[] | null; } -export type __experimental_SessionVerificationStatus = 'needs_first_factor' | 'needs_second_factor' | 'complete'; +export type SessionVerificationStatus = 'needs_first_factor' | 'needs_second_factor' | 'complete'; -export type __experimental_SessionVerificationTypes = 'strict_mfa' | 'strict' | 'moderate' | 'lax'; +export type SessionVerificationTypes = 'strict_mfa' | 'strict' | 'moderate' | 'lax'; -export type __experimental_ReverificationConfig = - | __experimental_SessionVerificationTypes +export type ReverificationConfig = + | SessionVerificationTypes | { - level: __experimental_SessionVerificationLevel; - afterMinutes: __experimental_SessionVerificationAfterMinutes; + level: SessionVerificationLevel; + afterMinutes: SessionVerificationAfterMinutes; }; -export type __experimental_SessionVerificationLevel = 'first_factor' | 'second_factor' | 'multi_factor'; -export type __experimental_SessionVerificationAfterMinutes = number; +export type SessionVerificationLevel = 'first_factor' | 'second_factor' | 'multi_factor'; +export type SessionVerificationAfterMinutes = number; -export type __experimental_SessionVerificationFirstFactor = EmailCodeFactor | PhoneCodeFactor | PasswordFactor; -export type __experimental_SessionVerificationSecondFactor = PhoneCodeFactor | TOTPFactor | BackupCodeFactor; +export type SessionVerificationFirstFactor = EmailCodeFactor | PhoneCodeFactor | PasswordFactor; +export type SessionVerificationSecondFactor = PhoneCodeFactor | TOTPFactor | BackupCodeFactor; diff --git a/packages/types/src/ssr.ts b/packages/types/src/ssr.ts index 0f7773aa08..d9928337b4 100644 --- a/packages/types/src/ssr.ts +++ b/packages/types/src/ssr.ts @@ -20,5 +20,5 @@ export type InitialState = Serializable<{ orgSlug: string | undefined; orgPermissions: OrganizationCustomPermissionKey[] | undefined; organization: OrganizationResource | undefined; - __experimental_factorVerificationAge: [number, number]; + factorVerificationAge: [number, number]; }>; From d84d7e31235c5c7da3415981dc76db4473a71a39 Mon Sep 17 00:00:00 2001 From: panteliselef Date: Fri, 22 Nov 2024 14:14:42 -0500 Subject: [PATCH 14/19] chore(shared): Gracefully handle missing reverification error metadata (#4636) --- .changeset/many-bees-mate.md | 5 +++++ packages/shared/src/authorization-errors.ts | 2 +- packages/shared/src/authorization.ts | 6 +++++- packages/shared/src/react/hooks/useReverification.ts | 2 +- 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .changeset/many-bees-mate.md diff --git a/.changeset/many-bees-mate.md b/.changeset/many-bees-mate.md new file mode 100644 index 0000000000..1ec82dc473 --- /dev/null +++ b/.changeset/many-bees-mate.md @@ -0,0 +1,5 @@ +--- +'@clerk/shared': patch +--- + +Gracefully handle missing reverification error metadata diff --git a/packages/shared/src/authorization-errors.ts b/packages/shared/src/authorization-errors.ts index bedcf8c386..9caa20411d 100644 --- a/packages/shared/src/authorization-errors.ts +++ b/packages/shared/src/authorization-errors.ts @@ -16,7 +16,7 @@ type ReverificationError = const reverificationError = ( missingConfig?: MC, ): ReverificationError<{ - metadata: { + metadata?: { reverification?: MC; }; }> => ({ diff --git a/packages/shared/src/authorization.ts b/packages/shared/src/authorization.ts index f09d5129fe..0e6a7c33da 100644 --- a/packages/shared/src/authorization.ts +++ b/packages/shared/src/authorization.ts @@ -79,7 +79,11 @@ const checkOrgAuthorization: CheckOrgAuthorization = (params, options) => { return null; }; -const validateReverificationConfig = (config: ReverificationConfig | undefined) => { +const validateReverificationConfig = (config: ReverificationConfig | undefined | null) => { + if (!config) { + return false; + } + const convertConfigToObject = (config: ReverificationConfig) => { if (typeof config === 'string') { return TYPES_TO_OBJECTS[config]; diff --git a/packages/shared/src/react/hooks/useReverification.ts b/packages/shared/src/react/hooks/useReverification.ts index 61bf6fd3a9..cbf7a6e160 100644 --- a/packages/shared/src/react/hooks/useReverification.ts +++ b/packages/shared/src/react/hooks/useReverification.ts @@ -52,7 +52,7 @@ function createReverificationHandler(params: CreateReverificationHandlerParams) */ const resolvers = createDeferredPromise(); - const isValidMetadata = validateReverificationConfig(result.clerk_error.metadata.reverification); + const isValidMetadata = validateReverificationConfig(result.clerk_error.metadata?.reverification); /** * On success resolve the pending promise From dce4f7ffca7248c0500f0ec9a978672b1f2fad69 Mon Sep 17 00:00:00 2001 From: Bryce Kalow Date: Fri, 22 Nov 2024 14:20:31 -0600 Subject: [PATCH 15/19] chore(clerk-js): Rename `userVerification` to `reverification` (#4634) --- .changeset/friendly-chairs-tie.md | 10 +++---- .changeset/hungry-beds-prove.md | 8 +++--- .changeset/small-suits-knock.md | 2 +- .changeset/strange-days-kneel.md | 9 +++++++ packages/clerk-js/src/core/clerk.ts | 4 +-- .../UserVerification/AlternativeMethods.tsx | 14 +++++----- .../UserVerification/HavingTrouble.tsx | 4 +-- .../UVFactorOneEmailCodeCard.tsx | 8 +++--- .../UVFactorOnePhoneCodeCard.tsx | 8 +++--- .../UVFactorTwoAlternativeMethods.tsx | 14 +++++----- .../UVFactorTwoBackupCodeCard.tsx | 4 +-- .../UVFactorTwoPhoneCodeCard.tsx | 8 +++--- .../UserVerificationFactorOne.tsx | 6 ++--- .../UserVerificationFactorOnePassword.tsx | 8 +++--- .../UserVerificationFactorTwoTOTP.tsx | 6 ++--- .../__tests__/UVFactorOne.test.tsx | 12 ++++----- .../__tests__/UVFactorTwo.test.tsx | 10 +++---- packages/localizations/src/ar-SA.ts | 2 +- packages/localizations/src/be-BY.ts | 2 +- packages/localizations/src/bg-BG.ts | 2 +- packages/localizations/src/cs-CZ.ts | 2 +- packages/localizations/src/da-DK.ts | 2 +- packages/localizations/src/de-DE.ts | 2 +- packages/localizations/src/el-GR.ts | 2 +- packages/localizations/src/en-US.ts | 26 +++++++++---------- packages/localizations/src/es-ES.ts | 2 +- packages/localizations/src/es-MX.ts | 2 +- packages/localizations/src/fi-FI.ts | 2 +- packages/localizations/src/fr-FR.ts | 2 +- packages/localizations/src/he-IL.ts | 2 +- packages/localizations/src/hr-HR.ts | 2 +- packages/localizations/src/hu-HU.ts | 2 +- packages/localizations/src/is-IS.ts | 2 +- packages/localizations/src/it-IT.ts | 2 +- packages/localizations/src/ja-JP.ts | 2 +- packages/localizations/src/ko-KR.ts | 2 +- packages/localizations/src/mn-MN.ts | 2 +- packages/localizations/src/nb-NO.ts | 2 +- packages/localizations/src/nl-NL.ts | 2 +- packages/localizations/src/pl-PL.ts | 2 +- packages/localizations/src/pt-BR.ts | 2 +- packages/localizations/src/pt-PT.ts | 2 +- packages/localizations/src/ro-RO.ts | 2 +- packages/localizations/src/ru-RU.ts | 2 +- packages/localizations/src/sk-SK.ts | 2 +- packages/localizations/src/sr-RS.ts | 2 +- packages/localizations/src/sv-SE.ts | 2 +- packages/localizations/src/th-TH.ts | 2 +- packages/localizations/src/tr-TR.ts | 2 +- packages/localizations/src/uk-UA.ts | 2 +- packages/localizations/src/vi-VN.ts | 2 +- packages/localizations/src/zh-CN.ts | 2 +- packages/localizations/src/zh-TW.ts | 2 +- packages/react/src/isomorphicClerk.ts | 10 +++---- .../src/react/hooks/useReverification.ts | 8 +++--- packages/types/src/clerk.ts | 4 +-- packages/types/src/localization.ts | 2 +- 57 files changed, 132 insertions(+), 123 deletions(-) create mode 100644 .changeset/strange-days-kneel.md diff --git a/.changeset/friendly-chairs-tie.md b/.changeset/friendly-chairs-tie.md index 8fd318da6b..6ea9ee3852 100644 --- a/.changeset/friendly-chairs-tie.md +++ b/.changeset/friendly-chairs-tie.md @@ -5,10 +5,10 @@ Drop experimental tag related to reverification. Properties of Clerk class: -- `__experimental_openUserVerification` -> `__internal_openUserVerification` -- `__experimental_closeUserVerification` -> `__internal_closeUserVerification` -- `__experimental_UserVerificationProps` -> `__internal_UserVerificationProps` -- `__experimental_UserVerificationModalProps` -> `__internal_UserVerificationModalProps` +- `__experimental_openUserVerification` -> `__internal_openReverification` +- `__experimental_closeUserVerification` -> `__internal_closeReverification` +- `__experimental_UserVerificationProps` -> `__internal_ReverificationProps` +- `__experimental_UserVerificationModalProps` -> `__internal_ReverificationModalProps` Properties of `Session`: - `__experimental_factorVerificationAge` -> `factorVerificationAge` @@ -30,4 +30,4 @@ Properties of `IntialState`: - `__experimental_factorVerificationAge` -> `factorVerificationAge` Localization types: -All properties of `__experimental_userVerification` are moved to `userVerification` +All properties of `__experimental_userVerification` are moved to `reverification` diff --git a/.changeset/hungry-beds-prove.md b/.changeset/hungry-beds-prove.md index 1fdf4ad7c6..d1fc409c1f 100644 --- a/.changeset/hungry-beds-prove.md +++ b/.changeset/hungry-beds-prove.md @@ -5,10 +5,10 @@ Drop experimental tag related to reverification. Properties of Clerk class: -- `__experimental_openUserVerification` -> `__internal_openUserVerification` -- `__experimental_closeUserVerification` -> `__internal_closeUserVerification` -- `__experimental_UserVerificationProps` -> `__internal_UserVerificationProps` -- `__experimental_UserVerificationModalProps` -> `__internal_UserVerificationModalProps` +- `__experimental_openUserVerification` -> `__internal_openReverification` +- `__experimental_closeUserVerification` -> `__internal_closeReverification` +- `__experimental_UserVerificationProps` -> `__internal_ReverificationProps` +- `__experimental_UserVerificationModalProps` -> `__internal_ReverificationModalProps` Properties of `Session`: - `__experimental_factorVerificationAge` -> `factorVerificationAge` diff --git a/.changeset/small-suits-knock.md b/.changeset/small-suits-knock.md index 53c5597333..8225395025 100644 --- a/.changeset/small-suits-knock.md +++ b/.changeset/small-suits-knock.md @@ -2,4 +2,4 @@ '@clerk/localizations': minor --- -Moves all properties under `__experimental_userVerification` to `userVerification`. This affects all languages. +Moves all properties under `__experimental_userVerification` to `reverification`. This affects all languages. diff --git a/.changeset/strange-days-kneel.md b/.changeset/strange-days-kneel.md new file mode 100644 index 0000000000..884b6dccd4 --- /dev/null +++ b/.changeset/strange-days-kneel.md @@ -0,0 +1,9 @@ +--- +'@clerk/localizations': patch +'@clerk/clerk-js': patch +'@clerk/shared': patch +'@clerk/clerk-react': patch +'@clerk/types': patch +--- + +Rename userVerification to reverification to align with the feature name. diff --git a/packages/clerk-js/src/core/clerk.ts b/packages/clerk-js/src/core/clerk.ts index 99b578e14f..8d087aa7e5 100644 --- a/packages/clerk-js/src/core/clerk.ts +++ b/packages/clerk-js/src/core/clerk.ts @@ -425,7 +425,7 @@ export class Clerk implements ClerkInterface { void this.#componentControls.ensureMounted().then(controls => controls.closeModal('signIn')); }; - public __internal_openUserVerification = (props?: __internal_UserVerificationModalProps): void => { + public __internal_openReverification = (props?: __internal_UserVerificationModalProps): void => { this.assertComponentsReady(this.#componentControls); if (noUserExists(this)) { if (this.#instanceType === 'development') { @@ -440,7 +440,7 @@ export class Clerk implements ClerkInterface { .then(controls => controls.openModal('userVerification', props || {})); }; - public __internal_closeUserVerification = (): void => { + public __internal_closeReverification = (): void => { this.assertComponentsReady(this.#componentControls); void this.#componentControls.ensureMounted().then(controls => controls.closeModal('userVerification')); }; diff --git a/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx b/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx index 28e0fabfd8..03a41a3d04 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/AlternativeMethods.tsx @@ -39,8 +39,8 @@ const AlternativeMethodsList = (props: AlternativeMethodListProps) => { - - + + {card.error} {/*TODO: extract main in its own component */} @@ -87,9 +87,9 @@ const AlternativeMethodsList = (props: AlternativeMethodListProps) => { - + @@ -102,15 +102,15 @@ const AlternativeMethodsList = (props: AlternativeMethodListProps) => { export function getButtonLabel(factor: SessionVerificationFirstFactor): LocalizationKey { switch (factor.strategy) { case 'email_code': - return localizationKeys('userVerification.alternativeMethods.blockButton__emailCode', { + return localizationKeys('reverification.alternativeMethods.blockButton__emailCode', { identifier: formatSafeIdentifier(factor.safeIdentifier) || '', }); case 'phone_code': - return localizationKeys('userVerification.alternativeMethods.blockButton__phoneCode', { + return localizationKeys('reverification.alternativeMethods.blockButton__phoneCode', { identifier: formatSafeIdentifier(factor.safeIdentifier) || '', }); case 'password': - return localizationKeys('userVerification.alternativeMethods.blockButton__password'); + return localizationKeys('reverification.alternativeMethods.blockButton__password'); default: throw `Invalid sign in strategy: "${(factor as any).strategy}"`; } diff --git a/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx b/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx index a6c020deba..a4cd742f0b 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/HavingTrouble.tsx @@ -7,8 +7,8 @@ export const HavingTrouble = (props: PropsOfComponent) => { return ( ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx index c1f02b13ca..fb6fc6f7d8 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOneEmailCodeCard.tsx @@ -11,10 +11,10 @@ export const UVFactorOneEmailCodeCard = (props: UVFactorOneEmailCodeCardProps) = ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx index e18ae2b754..a2210f7dd3 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorOnePhoneCodeCard.tsx @@ -11,10 +11,10 @@ export const UVFactorOnePhoneCodeCard = (props: UVFactorOnePhoneCodeCardProps) = ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx index 9c4971ccde..cae82bd140 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoAlternativeMethods.tsx @@ -41,8 +41,8 @@ const AlternativeMethodsList = (props: AlternativeMethodsProps & { onHavingTroub - - + + {card.error} {/*TODO: extract main in its own component */} @@ -76,9 +76,9 @@ const AlternativeMethodsList = (props: AlternativeMethodsProps & { onHavingTroub - + @@ -91,13 +91,13 @@ const AlternativeMethodsList = (props: AlternativeMethodsProps & { onHavingTroub export function getButtonLabel(factor: SessionVerificationSecondFactor): LocalizationKey { switch (factor.strategy) { case 'phone_code': - return localizationKeys('userVerification.alternativeMethods.blockButton__phoneCode', { + return localizationKeys('reverification.alternativeMethods.blockButton__phoneCode', { identifier: formatSafeIdentifier(factor.safeIdentifier) || '', }); case 'totp': - return localizationKeys('userVerification.alternativeMethods.blockButton__totp'); + return localizationKeys('reverification.alternativeMethods.blockButton__totp'); case 'backup_code': - return localizationKeys('userVerification.alternativeMethods.blockButton__backupCode'); + return localizationKeys('reverification.alternativeMethods.blockButton__backupCode'); default: throw `Invalid verification strategy: "${(factor as any).strategy}"`; } diff --git a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx index bfc99a2e77..8d44a0adad 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UVFactorTwoBackupCodeCard.tsx @@ -34,8 +34,8 @@ export const UVFactorTwoBackupCodeCard = (props: UVFactorTwoBackupCodeCardProps) - - + + {card.error} diff --git a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx index 908e5f08cc..5a1aceabd0 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOne.tsx @@ -77,9 +77,9 @@ export function _UserVerificationFactorOne(): JSX.Element | null { if (!currentFactor) { return ( ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx index 667e5fce97..1f7b870a94 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorOnePassword.tsx @@ -47,8 +47,8 @@ export function UserVerificationFactorOnePasswordCard(props: UserVerificationFac - - + + {card.error} diff --git a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx index 0cf2ca1065..238bb50fd1 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/UserVerificationFactorTwoTOTP.tsx @@ -11,9 +11,9 @@ export function UserVerificationFactorTwoTOTP(props: UVFactorTwoTOTPCardProps): ); diff --git a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx index 389f008a17..cd0d21559d 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorOne.test.tsx @@ -27,8 +27,8 @@ describe('UserVerificationFactorOne', () => { const { getByLabelText, getByText } = render(, { wrapper }); await waitFor(() => { - getByText('Enter your password'); - getByText('Enter the password associated with your account'); + getByText('Verification required'); + getByText('Enter your password to continue'); getByLabelText(/^password/i); }); }); @@ -46,7 +46,7 @@ describe('UserVerificationFactorOne', () => { const { getByLabelText, getByText } = render(, { wrapper }); await waitFor(() => { - getByText('Check your email'); + getByText('Verification required'); getByLabelText(/Enter verification code/i); }); @@ -66,7 +66,7 @@ describe('UserVerificationFactorOne', () => { const { getByLabelText, getByText } = render(, { wrapper }); await waitFor(() => { - getByText('Check your phone'); + getByText('Verification required'); getByLabelText(/Enter verification code/i); }); @@ -93,7 +93,7 @@ describe('UserVerificationFactorOne', () => { const { userEvent, getByLabelText, getByText } = render(, { wrapper }); - await waitFor(() => getByText('Enter your password')); + await waitFor(() => getByText('Verification required')); await userEvent.type(getByLabelText(/^password/i), 'testtest'); await userEvent.click(getByText('Continue')); @@ -123,7 +123,7 @@ describe('UserVerificationFactorOne', () => { const { userEvent, getByLabelText, getByText } = render(, { wrapper }); - await waitFor(() => getByText('Enter your password')); + await waitFor(() => getByText('Verification required')); await userEvent.type(getByLabelText(/^password/i), 'testtest'); await userEvent.click(screen.getByText('Continue')); diff --git a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx index 4e6d7ece1e..4ced180458 100644 --- a/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx +++ b/packages/clerk-js/src/ui/components/UserVerification/__tests__/UVFactorTwo.test.tsx @@ -33,7 +33,7 @@ describe('UserVerificationFactorTwo', () => { const { getByText, getAllByLabelText } = render(, { wrapper }); await waitFor(() => { - getByText('Check your phone'); + getByText('Verification required'); const inputs = getAllByLabelText(/digit/i); expect(inputs.length).toBe(6); }); @@ -55,8 +55,8 @@ describe('UserVerificationFactorTwo', () => { const { getByLabelText, getByText } = render(, { wrapper }); await waitFor(() => { - getByText('Two-step verification'); - getByText('To continue, please enter the verification code generated by your authenticator app'); + getByText('Verification required'); + getByText('Enter the code generated by your authenticator app to continue'); getByLabelText(/Enter verification code/i); }); }); @@ -78,7 +78,7 @@ describe('UserVerificationFactorTwo', () => { await waitFor(() => { getByText('Enter a backup code'); - getByText('Your backup code is the one you got when setting up two-step authentication.'); + getByText('Enter the backup code you received when setting up two-step authentication'); getByLabelText(/Backup code/i); }); }); @@ -123,7 +123,7 @@ describe('UserVerificationFactorTwo', () => { await runFakeTimers(async timers => { const { userEvent, getByLabelText, getByText } = render(, { wrapper }); - await waitFor(() => getByText('Check your phone')); + await waitFor(() => getByText('Verification required')); await userEvent.type(getByLabelText(/Enter verification code/i), '123456'); timers.runOnlyPendingTimers(); diff --git a/packages/localizations/src/ar-SA.ts b/packages/localizations/src/ar-SA.ts index 9d9d1dadd2..65413ab0ca 100644 --- a/packages/localizations/src/ar-SA.ts +++ b/packages/localizations/src/ar-SA.ts @@ -846,7 +846,7 @@ export const arSA: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/be-BY.ts b/packages/localizations/src/be-BY.ts index 71a4c2cd87..341724641e 100644 --- a/packages/localizations/src/be-BY.ts +++ b/packages/localizations/src/be-BY.ts @@ -859,7 +859,7 @@ export const beBY: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/bg-BG.ts b/packages/localizations/src/bg-BG.ts index 11a58948ca..8d0f455da9 100644 --- a/packages/localizations/src/bg-BG.ts +++ b/packages/localizations/src/bg-BG.ts @@ -853,7 +853,7 @@ export const bgBG: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/cs-CZ.ts b/packages/localizations/src/cs-CZ.ts index 6e88a20bc6..a21bbc090b 100644 --- a/packages/localizations/src/cs-CZ.ts +++ b/packages/localizations/src/cs-CZ.ts @@ -849,7 +849,7 @@ export const csCZ: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/da-DK.ts b/packages/localizations/src/da-DK.ts index c20c6ae784..eb4320181d 100644 --- a/packages/localizations/src/da-DK.ts +++ b/packages/localizations/src/da-DK.ts @@ -851,7 +851,7 @@ export const daDK: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/de-DE.ts b/packages/localizations/src/de-DE.ts index 25e8c9eba8..901f777349 100644 --- a/packages/localizations/src/de-DE.ts +++ b/packages/localizations/src/de-DE.ts @@ -866,7 +866,7 @@ export const deDE: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/el-GR.ts b/packages/localizations/src/el-GR.ts index 9e72864537..7834baabe9 100644 --- a/packages/localizations/src/el-GR.ts +++ b/packages/localizations/src/el-GR.ts @@ -861,7 +861,7 @@ export const elGR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/en-US.ts b/packages/localizations/src/en-US.ts index c5e383b269..2a9ba51ee1 100644 --- a/packages/localizations/src/en-US.ts +++ b/packages/localizations/src/en-US.ts @@ -846,7 +846,7 @@ export const enUS: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: 'Get help', actionText: 'Don’t have any of these?', @@ -865,41 +865,41 @@ export const enUS: LocalizationResource = { title: 'Use another method', }, backupCodeMfa: { - subtitle: 'Your backup code is the one you got when setting up two-step authentication.', + subtitle: 'Enter the backup code you received when setting up two-step authentication', title: 'Enter a backup code', }, emailCode: { formTitle: 'Verification code', resendButton: "Didn't receive a code? Resend", - subtitle: 'to continue to {{applicationName}}', - title: 'Check your email', + subtitle: 'Enter the code sent to your email to continue', + title: 'Verification required', }, noAvailableMethods: { - message: "Cannot proceed with verification. There's no available authentication factor.", + message: 'Cannot proceed with verification. No suitable authentication factor is configured', subtitle: 'An error occurred', title: 'Cannot verify your account', }, password: { actionLink: 'Use another method', - subtitle: 'Enter the password associated with your account', - title: 'Enter your password', + subtitle: 'Enter your password to continue', + title: 'Verification required', }, phoneCode: { formTitle: 'Verification code', resendButton: "Didn't receive a code? Resend", - subtitle: 'to continue to {{applicationName}}', - title: 'Check your phone', + subtitle: 'Enter the code sent to your phone to continue', + title: 'Verification required', }, phoneCodeMfa: { formTitle: 'Verification code', resendButton: "Didn't receive a code? Resend", - subtitle: 'To continue, please enter the verification code sent to your phone', - title: 'Check your phone', + subtitle: 'Enter the code sent to your phone to continue', + title: 'Verification required', }, totpMfa: { formTitle: 'Verification code', - subtitle: 'To continue, please enter the verification code generated by your authenticator app', - title: 'Two-step verification', + subtitle: 'Enter the code generated by your authenticator app to continue', + title: 'Verification required', }, }, waitlist: { diff --git a/packages/localizations/src/es-ES.ts b/packages/localizations/src/es-ES.ts index ae186a8c00..9ab31051a2 100644 --- a/packages/localizations/src/es-ES.ts +++ b/packages/localizations/src/es-ES.ts @@ -857,7 +857,7 @@ export const esES: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/es-MX.ts b/packages/localizations/src/es-MX.ts index ed57cd161e..f9d09b9a50 100644 --- a/packages/localizations/src/es-MX.ts +++ b/packages/localizations/src/es-MX.ts @@ -859,7 +859,7 @@ export const esMX: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/fi-FI.ts b/packages/localizations/src/fi-FI.ts index e107f1ffe2..19a5bb15f5 100644 --- a/packages/localizations/src/fi-FI.ts +++ b/packages/localizations/src/fi-FI.ts @@ -855,7 +855,7 @@ export const fiFI: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/fr-FR.ts b/packages/localizations/src/fr-FR.ts index 97524a2fe5..19184fe03a 100644 --- a/packages/localizations/src/fr-FR.ts +++ b/packages/localizations/src/fr-FR.ts @@ -859,7 +859,7 @@ export const frFR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/he-IL.ts b/packages/localizations/src/he-IL.ts index fd614dba13..50c7cd6c51 100644 --- a/packages/localizations/src/he-IL.ts +++ b/packages/localizations/src/he-IL.ts @@ -833,7 +833,7 @@ export const heIL: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: 'השג עזרה', actionText: 'אין לך אף אחד מאלה?', diff --git a/packages/localizations/src/hr-HR.ts b/packages/localizations/src/hr-HR.ts index b2f1bfbfa5..5b06390193 100644 --- a/packages/localizations/src/hr-HR.ts +++ b/packages/localizations/src/hr-HR.ts @@ -2,7 +2,7 @@ import type { LocalizationResource } from '@clerk/types'; export const hrHR: LocalizationResource = { locale: 'hr-HR', - userVerification: { + reverification: { alternativeMethods: { actionLink: 'Zatražite pomoć', actionText: 'Nemate ništa od ovoga?', diff --git a/packages/localizations/src/hu-HU.ts b/packages/localizations/src/hu-HU.ts index 62bfff86ac..357f84fdac 100644 --- a/packages/localizations/src/hu-HU.ts +++ b/packages/localizations/src/hu-HU.ts @@ -856,7 +856,7 @@ export const huHU: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/is-IS.ts b/packages/localizations/src/is-IS.ts index a13b8e4937..d0bcfe071a 100644 --- a/packages/localizations/src/is-IS.ts +++ b/packages/localizations/src/is-IS.ts @@ -859,7 +859,7 @@ export const isIS: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/it-IT.ts b/packages/localizations/src/it-IT.ts index 04c893098d..d4b0a51dd7 100644 --- a/packages/localizations/src/it-IT.ts +++ b/packages/localizations/src/it-IT.ts @@ -855,7 +855,7 @@ export const itIT: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/ja-JP.ts b/packages/localizations/src/ja-JP.ts index e21428045e..5be85cea0e 100644 --- a/packages/localizations/src/ja-JP.ts +++ b/packages/localizations/src/ja-JP.ts @@ -848,7 +848,7 @@ export const jaJP: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/ko-KR.ts b/packages/localizations/src/ko-KR.ts index 8284300471..9f9c2ad099 100644 --- a/packages/localizations/src/ko-KR.ts +++ b/packages/localizations/src/ko-KR.ts @@ -839,7 +839,7 @@ export const koKR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/mn-MN.ts b/packages/localizations/src/mn-MN.ts index e3c686dfed..d0f8114423 100644 --- a/packages/localizations/src/mn-MN.ts +++ b/packages/localizations/src/mn-MN.ts @@ -854,7 +854,7 @@ export const mnMN: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/nb-NO.ts b/packages/localizations/src/nb-NO.ts index f9ba465ce6..0c7f61c7e2 100644 --- a/packages/localizations/src/nb-NO.ts +++ b/packages/localizations/src/nb-NO.ts @@ -853,7 +853,7 @@ export const nbNO: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/nl-NL.ts b/packages/localizations/src/nl-NL.ts index 62bc31bd29..0d0c3abd0d 100644 --- a/packages/localizations/src/nl-NL.ts +++ b/packages/localizations/src/nl-NL.ts @@ -849,7 +849,7 @@ export const nlNL: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: 'Krijg hulp', actionText: 'Heb je geen van deze?', diff --git a/packages/localizations/src/pl-PL.ts b/packages/localizations/src/pl-PL.ts index ed8d1a9218..473463fbe9 100644 --- a/packages/localizations/src/pl-PL.ts +++ b/packages/localizations/src/pl-PL.ts @@ -851,7 +851,7 @@ export const plPL: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: 'Uzyskaj pomoc', actionText: 'Nie używasz żadnej z tych metod?', diff --git a/packages/localizations/src/pt-BR.ts b/packages/localizations/src/pt-BR.ts index a60edcd061..eca2005b02 100644 --- a/packages/localizations/src/pt-BR.ts +++ b/packages/localizations/src/pt-BR.ts @@ -857,7 +857,7 @@ export const ptBR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/pt-PT.ts b/packages/localizations/src/pt-PT.ts index 55bc045557..95abaf4425 100644 --- a/packages/localizations/src/pt-PT.ts +++ b/packages/localizations/src/pt-PT.ts @@ -850,7 +850,7 @@ export const ptPT: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/ro-RO.ts b/packages/localizations/src/ro-RO.ts index ec14a0ed84..ad53f53f4b 100644 --- a/packages/localizations/src/ro-RO.ts +++ b/packages/localizations/src/ro-RO.ts @@ -861,7 +861,7 @@ export const roRO: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/ru-RU.ts b/packages/localizations/src/ru-RU.ts index 07564c9a27..dc0cb118c4 100644 --- a/packages/localizations/src/ru-RU.ts +++ b/packages/localizations/src/ru-RU.ts @@ -869,7 +869,7 @@ export const ruRU: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: 'Получить помощь', actionText: 'У вас нет ничего из этого?', diff --git a/packages/localizations/src/sk-SK.ts b/packages/localizations/src/sk-SK.ts index 317f0452f7..e2946a0bfd 100644 --- a/packages/localizations/src/sk-SK.ts +++ b/packages/localizations/src/sk-SK.ts @@ -849,7 +849,7 @@ export const skSK: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/sr-RS.ts b/packages/localizations/src/sr-RS.ts index c72650de0e..aebe7f8609 100644 --- a/packages/localizations/src/sr-RS.ts +++ b/packages/localizations/src/sr-RS.ts @@ -852,7 +852,7 @@ export const srRS: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/sv-SE.ts b/packages/localizations/src/sv-SE.ts index e5e660b1e7..29f359a0e9 100644 --- a/packages/localizations/src/sv-SE.ts +++ b/packages/localizations/src/sv-SE.ts @@ -853,7 +853,7 @@ export const svSE: LocalizationResource = { web3WalletButtonsBlockButton: '{{provider|titleize}}', }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: 'Få hjälp', actionText: 'Har du inget av dessa?', diff --git a/packages/localizations/src/th-TH.ts b/packages/localizations/src/th-TH.ts index 3f4230e502..37220b73d3 100644 --- a/packages/localizations/src/th-TH.ts +++ b/packages/localizations/src/th-TH.ts @@ -844,7 +844,7 @@ export const thTH: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/tr-TR.ts b/packages/localizations/src/tr-TR.ts index 4369d4a5b7..9cffd38926 100644 --- a/packages/localizations/src/tr-TR.ts +++ b/packages/localizations/src/tr-TR.ts @@ -854,7 +854,7 @@ export const trTR: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/uk-UA.ts b/packages/localizations/src/uk-UA.ts index f635b55b8f..0b8e378228 100644 --- a/packages/localizations/src/uk-UA.ts +++ b/packages/localizations/src/uk-UA.ts @@ -850,7 +850,7 @@ export const ukUA: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/vi-VN.ts b/packages/localizations/src/vi-VN.ts index 5291cfcbc8..b8c8d02d53 100644 --- a/packages/localizations/src/vi-VN.ts +++ b/packages/localizations/src/vi-VN.ts @@ -850,7 +850,7 @@ export const viVN: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/zh-CN.ts b/packages/localizations/src/zh-CN.ts index d9286a15c4..136b6e1955 100644 --- a/packages/localizations/src/zh-CN.ts +++ b/packages/localizations/src/zh-CN.ts @@ -824,7 +824,7 @@ export const zhCN: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/localizations/src/zh-TW.ts b/packages/localizations/src/zh-TW.ts index 0161ba13bc..2e3ba091d9 100644 --- a/packages/localizations/src/zh-TW.ts +++ b/packages/localizations/src/zh-TW.ts @@ -834,7 +834,7 @@ export const zhTW: LocalizationResource = { web3WalletButtonsBlockButton: undefined, }, }, - userVerification: { + reverification: { alternativeMethods: { actionLink: undefined, actionText: undefined, diff --git a/packages/react/src/isomorphicClerk.ts b/packages/react/src/isomorphicClerk.ts index cd2aba4524..6ae4033f8b 100644 --- a/packages/react/src/isomorphicClerk.ts +++ b/packages/react/src/isomorphicClerk.ts @@ -542,7 +542,7 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } if (this.preopenUserVerification !== null) { - clerkjs.__internal_openUserVerification(this.preopenUserVerification); + clerkjs.__internal_openReverification(this.preopenUserVerification); } if (this.preopenOneTap !== null) { @@ -688,17 +688,17 @@ export class IsomorphicClerk implements IsomorphicLoadedClerk { } }; - __internal_openUserVerification = (props?: __internal_UserVerificationModalProps): void => { + __internal_openReverification = (props?: __internal_UserVerificationModalProps): void => { if (this.clerkjs && this.#loaded) { - this.clerkjs.__internal_openUserVerification(props); + this.clerkjs.__internal_openReverification(props); } else { this.preopenUserVerification = props; } }; - __internal_closeUserVerification = (): void => { + __internal_closeReverification = (): void => { if (this.clerkjs && this.#loaded) { - this.clerkjs.__internal_closeUserVerification(); + this.clerkjs.__internal_closeReverification(); } else { this.preopenUserVerification = null; } diff --git a/packages/shared/src/react/hooks/useReverification.ts b/packages/shared/src/react/hooks/useReverification.ts index cbf7a6e160..6ea276bf47 100644 --- a/packages/shared/src/react/hooks/useReverification.ts +++ b/packages/shared/src/react/hooks/useReverification.ts @@ -34,7 +34,7 @@ type UseReverificationOptions = { }; type CreateReverificationHandlerParams = UseReverificationOptions & { - openUIComponent: Clerk['__internal_openUserVerification']; + openUIComponent: Clerk['__internal_openReverification']; }; function createReverificationHandler(params: CreateReverificationHandlerParams) { @@ -129,17 +129,17 @@ function useReverification< Fetcher extends (...args: any[]) => Promise | undefined, Options extends UseReverificationOptions, >(fetcher: Fetcher, options?: Options): UseReverificationResult { - const { __internal_openUserVerification } = useClerk(); + const { __internal_openReverification } = useClerk(); const fetcherRef = useRef(fetcher); const optionsRef = useRef(options); const handleReverification = useMemo(() => { const handler = createReverificationHandler({ - openUIComponent: __internal_openUserVerification, + openUIComponent: __internal_openReverification, ...optionsRef.current, })(fetcherRef.current); return [handler] as const; - }, [__internal_openUserVerification, fetcherRef.current, optionsRef.current]); + }, [__internal_openReverification, fetcherRef.current, optionsRef.current]); // Keep fetcher and options ref in sync useSafeLayoutEffect(() => { diff --git a/packages/types/src/clerk.ts b/packages/types/src/clerk.ts index eee17db904..9163ef2ec0 100644 --- a/packages/types/src/clerk.ts +++ b/packages/types/src/clerk.ts @@ -167,12 +167,12 @@ export interface Clerk { * Opens the Clerk UserVerification component in a modal. * @param props Optional user verification configuration parameters. */ - __internal_openUserVerification: (props?: __internal_UserVerificationModalProps) => void; + __internal_openReverification: (props?: __internal_UserVerificationModalProps) => void; /** * Closes the Clerk user verification modal. */ - __internal_closeUserVerification: () => void; + __internal_closeReverification: () => void; /** * Opens the Google One Tap component. diff --git a/packages/types/src/localization.ts b/packages/types/src/localization.ts index 6e4708884c..90693e4330 100644 --- a/packages/types/src/localization.ts +++ b/packages/types/src/localization.ts @@ -305,7 +305,7 @@ type _LocalizationResource = { action__signOutAll: LocalizationValue; }; }; - userVerification: { + reverification: { password: { title: LocalizationValue; subtitle: LocalizationValue; From efde0ef8dd2dcd69efbfb65328e592a4912de291 Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Fri, 22 Nov 2024 15:54:30 -0500 Subject: [PATCH 16/19] ci(repo): Version packages (#4633) Co-authored-by: github-actions[bot] --- .changeset/afraid-cheetahs-smash.md | 9 ---- .changeset/afraid-toes-sin.md | 6 --- .changeset/curly-terms-confess.md | 6 --- .changeset/forty-countries-retire.md | 10 ----- .changeset/friendly-chairs-tie.md | 33 -------------- .changeset/happy-balloons-jog.md | 6 --- .changeset/hungry-beds-prove.md | 19 -------- .changeset/many-bees-mate.md | 5 --- .changeset/small-suits-knock.md | 5 --- .changeset/smart-cooks-drop.md | 8 ---- .changeset/strange-days-kneel.md | 9 ---- .changeset/tidy-garlics-boil.md | 5 --- .changeset/tricky-rings-divide.md | 5 --- .changeset/wise-spiders-play.md | 48 -------------------- packages/astro/CHANGELOG.md | 9 ++++ packages/astro/package.json | 2 +- packages/backend/CHANGELOG.md | 17 +++++++ packages/backend/package.json | 2 +- packages/chrome-extension/CHANGELOG.md | 62 ++++++++++++++++++++++++++ packages/chrome-extension/package.json | 2 +- packages/clerk-js/CHANGELOG.md | 35 +++++++++++++++ packages/clerk-js/package.json | 2 +- packages/elements/CHANGELOG.md | 9 ++++ packages/elements/package.json | 2 +- packages/expo-passkeys/CHANGELOG.md | 8 ++++ packages/expo-passkeys/package.json | 2 +- packages/expo/CHANGELOG.md | 10 +++++ packages/expo/package.json | 2 +- packages/express/CHANGELOG.md | 9 ++++ packages/express/package.json | 2 +- packages/fastify/CHANGELOG.md | 9 ++++ packages/fastify/package.json | 2 +- packages/localizations/CHANGELOG.md | 13 ++++++ packages/localizations/package.json | 2 +- packages/nextjs/CHANGELOG.md | 19 ++++++++ packages/nextjs/package.json | 2 +- packages/nuxt/CHANGELOG.md | 10 +++++ packages/nuxt/package.json | 2 +- packages/react/CHANGELOG.md | 18 ++++++++ packages/react/package.json | 2 +- packages/remix/CHANGELOG.md | 10 +++++ packages/remix/package.json | 2 +- packages/sdk-node/CHANGELOG.md | 9 ++++ packages/sdk-node/package.json | 2 +- packages/shared/CHANGELOG.md | 21 +++++++++ packages/shared/package.json | 2 +- packages/tanstack-start/CHANGELOG.md | 10 +++++ packages/tanstack-start/package.json | 2 +- packages/testing/CHANGELOG.md | 9 ++++ packages/testing/package.json | 2 +- packages/themes/CHANGELOG.md | 7 +++ packages/themes/package.json | 2 +- packages/types/CHANGELOG.md | 42 +++++++++++++++++ packages/types/package.json | 2 +- packages/ui/CHANGELOG.md | 10 +++++ packages/ui/package.json | 2 +- packages/vue/CHANGELOG.md | 8 ++++ packages/vue/package.json | 2 +- 58 files changed, 376 insertions(+), 196 deletions(-) delete mode 100644 .changeset/afraid-cheetahs-smash.md delete mode 100644 .changeset/afraid-toes-sin.md delete mode 100644 .changeset/curly-terms-confess.md delete mode 100644 .changeset/forty-countries-retire.md delete mode 100644 .changeset/friendly-chairs-tie.md delete mode 100644 .changeset/happy-balloons-jog.md delete mode 100644 .changeset/hungry-beds-prove.md delete mode 100644 .changeset/many-bees-mate.md delete mode 100644 .changeset/small-suits-knock.md delete mode 100644 .changeset/smart-cooks-drop.md delete mode 100644 .changeset/strange-days-kneel.md delete mode 100644 .changeset/tidy-garlics-boil.md delete mode 100644 .changeset/tricky-rings-divide.md delete mode 100644 .changeset/wise-spiders-play.md diff --git a/.changeset/afraid-cheetahs-smash.md b/.changeset/afraid-cheetahs-smash.md deleted file mode 100644 index 83f014903d..0000000000 --- a/.changeset/afraid-cheetahs-smash.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@clerk/nextjs': minor ---- - -Introduce the `useReverification()` hook that handles the session reverification flow: -- Replaces `__experimental_useReverification` with `useReverification` -Also replaces the following APIs: -- `____experimental_reverificationError` -> `__reverificationError` -- `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` diff --git a/.changeset/afraid-toes-sin.md b/.changeset/afraid-toes-sin.md deleted file mode 100644 index 20fe12183a..0000000000 --- a/.changeset/afraid-toes-sin.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/clerk-js': patch -'@clerk/clerk-react': patch ---- - -Include **BUILD_DISABLE_RHC** to allow for builds which remove remotely hosted code as it is a requirement for browser extensions. diff --git a/.changeset/curly-terms-confess.md b/.changeset/curly-terms-confess.md deleted file mode 100644 index 7e6441c892..0000000000 --- a/.changeset/curly-terms-confess.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/chrome-extension': patch ---- - -Introduce the `useReverification()` hook that handles the session reverification flow: -- Replaces `__experimental_useReverification` with `useReverification` diff --git a/.changeset/forty-countries-retire.md b/.changeset/forty-countries-retire.md deleted file mode 100644 index 1e22df7165..0000000000 --- a/.changeset/forty-countries-retire.md +++ /dev/null @@ -1,10 +0,0 @@ ---- -'@clerk/shared': minor ---- - -Introduce the `useReverification()` hook that handles the session reverification flow: -- `__experimental_useReverification` -> `useReverification` -Also replaces the following APIs: -- `__experimental_reverificationError` -> `reverificationError` -- `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` -- `__experimental_isReverificationHint` -> `isReverificationHint` diff --git a/.changeset/friendly-chairs-tie.md b/.changeset/friendly-chairs-tie.md deleted file mode 100644 index 6ea9ee3852..0000000000 --- a/.changeset/friendly-chairs-tie.md +++ /dev/null @@ -1,33 +0,0 @@ ---- -'@clerk/types': minor ---- - -Drop experimental tag related to reverification. - -Properties of Clerk class: -- `__experimental_openUserVerification` -> `__internal_openReverification` -- `__experimental_closeUserVerification` -> `__internal_closeReverification` -- `__experimental_UserVerificationProps` -> `__internal_ReverificationProps` -- `__experimental_UserVerificationModalProps` -> `__internal_ReverificationModalProps` - -Properties of `Session`: -- `__experimental_factorVerificationAge` -> `factorVerificationAge` -- `__experimental_startVerification` -> `startVerification` -- `__experimental_prepareFirstFactorVerification` -> `prepareFirstFactorVerification` -- `__experimental_attemptFirstFactorVerification` -> `attemptFirstFactorVerification` -- `__experimental_prepareSecondFactorVerification` -> `prepareSecondFactorVerification` -- `__experimental_attemptSecondFactorVerification` -> `attemptSecondFactorVerification` - -Renaming -- `__experimental_SessionVerificationResource` -> `SessionVerificationResource` -- `__experimental_SessionVerificationStatus` -> `SessionVerificationStatus` -- `__experimental_SessionVerificationLevel` -> `SessionVerificationLevel` -- `__experimental_ReverificationConfig` -> `ReverificationConfig` - -`CheckAuthorizationParamsWithCustomPermissions` and `CheckAuthorizationParams` now include `reverification?: ReverificationConfig;` - -Properties of `IntialState`: -- `__experimental_factorVerificationAge` -> `factorVerificationAge` - -Localization types: -All properties of `__experimental_userVerification` are moved to `reverification` diff --git a/.changeset/happy-balloons-jog.md b/.changeset/happy-balloons-jog.md deleted file mode 100644 index 9384bcdd39..0000000000 --- a/.changeset/happy-balloons-jog.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@clerk/clerk-react': minor ---- - -Introduce the `useReverification()` hook that handles the session reverification flow: -- Replaces `__experimental_useReverification` with `useReverification` diff --git a/.changeset/hungry-beds-prove.md b/.changeset/hungry-beds-prove.md deleted file mode 100644 index d1fc409c1f..0000000000 --- a/.changeset/hungry-beds-prove.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@clerk/clerk-js': minor ---- - -Drop experimental tag related to reverification. - -Properties of Clerk class: -- `__experimental_openUserVerification` -> `__internal_openReverification` -- `__experimental_closeUserVerification` -> `__internal_closeReverification` -- `__experimental_UserVerificationProps` -> `__internal_ReverificationProps` -- `__experimental_UserVerificationModalProps` -> `__internal_ReverificationModalProps` - -Properties of `Session`: -- `__experimental_factorVerificationAge` -> `factorVerificationAge` -- `__experimental_startVerification` -> `startVerification` -- `__experimental_prepareFirstFactorVerification` -> `prepareFirstFactorVerification` -- `__experimental_attemptFirstFactorVerification` -> `attemptFirstFactorVerification` -- `__experimental_prepareSecondFactorVerification` -> `prepareSecondFactorVerification` -- `__experimental_attemptSecondFactorVerification` -> `attemptSecondFactorVerification` diff --git a/.changeset/many-bees-mate.md b/.changeset/many-bees-mate.md deleted file mode 100644 index 1ec82dc473..0000000000 --- a/.changeset/many-bees-mate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/shared': patch ---- - -Gracefully handle missing reverification error metadata diff --git a/.changeset/small-suits-knock.md b/.changeset/small-suits-knock.md deleted file mode 100644 index 8225395025..0000000000 --- a/.changeset/small-suits-knock.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/localizations': minor ---- - -Moves all properties under `__experimental_userVerification` to `reverification`. This affects all languages. diff --git a/.changeset/smart-cooks-drop.md b/.changeset/smart-cooks-drop.md deleted file mode 100644 index f8de748b94..0000000000 --- a/.changeset/smart-cooks-drop.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@clerk/backend': minor ---- - -Update AuthObject property from `__experimental_factorVerificationAge` to `factorVerificationAge`. -Also replaces the following APIs: -- `__experimental_reverificationError` -> `__reverificationError` -- `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` diff --git a/.changeset/strange-days-kneel.md b/.changeset/strange-days-kneel.md deleted file mode 100644 index 884b6dccd4..0000000000 --- a/.changeset/strange-days-kneel.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -'@clerk/localizations': patch -'@clerk/clerk-js': patch -'@clerk/shared': patch -'@clerk/clerk-react': patch -'@clerk/types': patch ---- - -Rename userVerification to reverification to align with the feature name. diff --git a/.changeset/tidy-garlics-boil.md b/.changeset/tidy-garlics-boil.md deleted file mode 100644 index b885d2e860..0000000000 --- a/.changeset/tidy-garlics-boil.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/chrome-extension': major ---- - -Consume packages with remotely hosted code removed as required by Manifest v3. diff --git a/.changeset/tricky-rings-divide.md b/.changeset/tricky-rings-divide.md deleted file mode 100644 index 54d59a565b..0000000000 --- a/.changeset/tricky-rings-divide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@clerk/clerk-js": minor ---- - -If a nonce is provided, it is now made available to Clerk's internal components. This allows the nonce to be passed in to style-src in CSPs and work correctly. diff --git a/.changeset/wise-spiders-play.md b/.changeset/wise-spiders-play.md deleted file mode 100644 index 5bef3e6c0f..0000000000 --- a/.changeset/wise-spiders-play.md +++ /dev/null @@ -1,48 +0,0 @@ ---- -'@clerk/chrome-extension': major ---- - -#### Permission Updates (BREAKING) - -The `storage` entry in `host_permissions` is now required for all extensions. -While it's likely that this is already enabled in your extension, this change is to ensure that Clerk can store the necessary data for the extension to function properly. - -**How to Update:** Add the following to your `manifest.json` file: - -```json -{ - "host_permissions": ["storage"] -} -``` - -#### Introducing `syncHost` (BREAKING) - -In an effort to make the handling of sync hosts more deterministic, we have introduced a new parameter `syncHost` to `` - -**How to Update:** Replace `syncSessionWithTab` with `syncHost` in the `` component and set `syncHost` to the host that you intend to synchronize with. - -#### Service Workers `createClerkClient` - -We've introduced a new method `createClerkClient` to handle background tasks in your extension! - -```ts -import { createClerkClient } from '@clerk/chrome-extension/background'; - -// Create a new Clerk instance and get a fresh token for the user -async function getToken() { - const clerk = await createClerkClient({ - publishableKey: process.env.PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY, - }); - return await clerk.session?.getToken(); -} - -// Create a listener to listen for messages from content scripts -// NOTE: A runtime listener cannot be async. -// It must return true, in order to keep the connection open and send a response later. -chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { - // You can use the token in the listener to perform actions on behalf of the user - // OR send the token back to the content script - getToken().then(token => sendResponse({ token })); - return true; -}); -``` diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 12c99e1982..0f1ba436eb 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/astro +## 1.4.16 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 1.4.15 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 574361eb02..27de3f1495 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "1.4.15", + "version": "1.4.16", "description": "Clerk SDK for Astro", "keywords": [ "auth", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index ce5fa92442..003fa1e994 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,22 @@ # Change Log +## 1.18.0 + +### Minor Changes + +- Update AuthObject property from `__experimental_factorVerificationAge` to `factorVerificationAge`. ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + + Also replaces the following APIs: + + - `__experimental_reverificationError` -> `__reverificationError` + - `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + ## 1.17.2 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 97a64d58cb..bee9248e5b 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/backend", - "version": "1.17.2", + "version": "1.18.0", "description": "Clerk Backend SDK - REST Client for Backend API & JWT verification utilities", "homepage": "https://clerk.com/", "bugs": { diff --git a/packages/chrome-extension/CHANGELOG.md b/packages/chrome-extension/CHANGELOG.md index 4c97fb97f6..9a74106896 100644 --- a/packages/chrome-extension/CHANGELOG.md +++ b/packages/chrome-extension/CHANGELOG.md @@ -1,5 +1,67 @@ # Change Log +## 2.0.0 + +### Major Changes + +- Consume packages with remotely hosted code removed as required by Manifest v3. ([#4133](https://github.com/clerk/javascript/pull/4133)) by [@tmilewski](https://github.com/tmilewski) + +- #### Permission Updates (BREAKING) ([#4133](https://github.com/clerk/javascript/pull/4133)) by [@tmilewski](https://github.com/tmilewski) + + The `storage` entry in `host_permissions` is now required for all extensions. + While it's likely that this is already enabled in your extension, this change is to ensure that Clerk can store the necessary data for the extension to function properly. + + **How to Update:** Add the following to your `manifest.json` file: + + ```json + { + "host_permissions": ["storage"] + } + ``` + + #### Introducing `syncHost` (BREAKING) + + In an effort to make the handling of sync hosts more deterministic, we have introduced a new parameter `syncHost` to `` + + **How to Update:** Replace `syncSessionWithTab` with `syncHost` in the `` component and set `syncHost` to the host that you intend to synchronize with. + + #### Service Workers `createClerkClient` + + We've introduced a new method `createClerkClient` to handle background tasks in your extension! + + ```ts + import { createClerkClient } from '@clerk/chrome-extension/background'; + + // Create a new Clerk instance and get a fresh token for the user + async function getToken() { + const clerk = await createClerkClient({ + publishableKey: process.env.PLASMO_PUBLIC_CLERK_PUBLISHABLE_KEY, + }); + return await clerk.session?.getToken(); + } + + // Create a listener to listen for messages from content scripts + // NOTE: A runtime listener cannot be async. + // It must return true, in order to keep the connection open and send a response later. + chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { + // You can use the token in the listener to perform actions on behalf of the user + // OR send the token back to the content script + getToken().then(token => sendResponse({ token })); + return true; + }); + ``` + +### Patch Changes + +- Introduce the `useReverification()` hook that handles the session reverification flow: ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + + - Replaces `__experimental_useReverification` with `useReverification` + +- Updated dependencies [[`4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d`](https://github.com/clerk/javascript/commit/4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69), [`7c27b0cfda6ace9693e9c184392481b00f24a64d`](https://github.com/clerk/javascript/commit/7c27b0cfda6ace9693e9c184392481b00f24a64d)]: + - @clerk/clerk-js@5.35.0 + - @clerk/clerk-react@5.17.0 + - @clerk/shared@2.17.0 + ## 1.3.40 ### Patch Changes diff --git a/packages/chrome-extension/package.json b/packages/chrome-extension/package.json index 7d9c633817..846b62cfc9 100644 --- a/packages/chrome-extension/package.json +++ b/packages/chrome-extension/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/chrome-extension", - "version": "1.3.40", + "version": "2.0.0", "description": "Clerk SDK for Chrome extensions", "keywords": [ "auth", diff --git a/packages/clerk-js/CHANGELOG.md b/packages/clerk-js/CHANGELOG.md index 1ed62dcca2..917cd05b7a 100644 --- a/packages/clerk-js/CHANGELOG.md +++ b/packages/clerk-js/CHANGELOG.md @@ -1,5 +1,40 @@ # Change Log +## 5.35.0 + +### Minor Changes + +- Drop experimental tag related to reverification. ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + + Properties of Clerk class: + + - `__experimental_openUserVerification` -> `__internal_openReverification` + - `__experimental_closeUserVerification` -> `__internal_closeReverification` + - `__experimental_UserVerificationProps` -> `__internal_ReverificationProps` + - `__experimental_UserVerificationModalProps` -> `__internal_ReverificationModalProps` + + Properties of `Session`: + + - `__experimental_factorVerificationAge` -> `factorVerificationAge` + - `__experimental_startVerification` -> `startVerification` + - `__experimental_prepareFirstFactorVerification` -> `prepareFirstFactorVerification` + - `__experimental_attemptFirstFactorVerification` -> `attemptFirstFactorVerification` + - `__experimental_prepareSecondFactorVerification` -> `prepareSecondFactorVerification` + - `__experimental_attemptSecondFactorVerification` -> `attemptSecondFactorVerification` + +- If a nonce is provided, it is now made available to Clerk's internal components. This allows the nonce to be passed in to style-src in CSPs and work correctly. ([#4509](https://github.com/clerk/javascript/pull/4509)) by [@jescalan](https://github.com/jescalan) + +### Patch Changes + +- Include **BUILD_DISABLE_RHC** to allow for builds which remove remotely hosted code as it is a requirement for browser extensions. ([#4133](https://github.com/clerk/javascript/pull/4133)) by [@tmilewski](https://github.com/tmilewski) + +- Rename userVerification to reverification to align with the feature name. ([#4634](https://github.com/clerk/javascript/pull/4634)) by [@BRKalow](https://github.com/BRKalow) + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/localizations@3.7.0 + ## 5.34.6 ### Patch Changes diff --git a/packages/clerk-js/package.json b/packages/clerk-js/package.json index 1dbcb32ab4..a3c030c6a5 100644 --- a/packages/clerk-js/package.json +++ b/packages/clerk-js/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-js", - "version": "5.34.6", + "version": "5.35.0", "description": "Clerk JS library", "keywords": [ "clerk", diff --git a/packages/elements/CHANGELOG.md b/packages/elements/CHANGELOG.md index 443972a0d6..3fd04da4d7 100644 --- a/packages/elements/CHANGELOG.md +++ b/packages/elements/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/elements +## 0.19.7 + +### Patch Changes + +- Updated dependencies [[`4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d`](https://github.com/clerk/javascript/commit/4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/clerk-react@5.17.0 + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + ## 0.19.6 ### Patch Changes diff --git a/packages/elements/package.json b/packages/elements/package.json index 18da66208a..883676548b 100644 --- a/packages/elements/package.json +++ b/packages/elements/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/elements", - "version": "0.19.6", + "version": "0.19.7", "description": "Clerk Elements", "keywords": [ "clerk", diff --git a/packages/expo-passkeys/CHANGELOG.md b/packages/expo-passkeys/CHANGELOG.md index 06fefecfa6..b61ca07819 100644 --- a/packages/expo-passkeys/CHANGELOG.md +++ b/packages/expo-passkeys/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/expo-passkeys +## 0.0.9 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + ## 0.0.8 ### Patch Changes diff --git a/packages/expo-passkeys/package.json b/packages/expo-passkeys/package.json index 2c1d322a45..4247e1ae8c 100644 --- a/packages/expo-passkeys/package.json +++ b/packages/expo-passkeys/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/expo-passkeys", - "version": "0.0.8", + "version": "0.0.9", "description": "Passkeys library to be used with Clerk for expo", "keywords": [ "react-native", diff --git a/packages/expo/CHANGELOG.md b/packages/expo/CHANGELOG.md index 466ce3cf7e..47486cc5ba 100644 --- a/packages/expo/CHANGELOG.md +++ b/packages/expo/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 2.3.10 + +### Patch Changes + +- Updated dependencies [[`4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d`](https://github.com/clerk/javascript/commit/4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69), [`7c27b0cfda6ace9693e9c184392481b00f24a64d`](https://github.com/clerk/javascript/commit/7c27b0cfda6ace9693e9c184392481b00f24a64d)]: + - @clerk/clerk-js@5.35.0 + - @clerk/clerk-react@5.17.0 + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + ## 2.3.9 ### Patch Changes diff --git a/packages/expo/package.json b/packages/expo/package.json index 7c915d4c40..4ba8a996b9 100644 --- a/packages/expo/package.json +++ b/packages/expo/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-expo", - "version": "2.3.9", + "version": "2.3.10", "description": "Clerk React Native/Expo library", "keywords": [ "react", diff --git a/packages/express/CHANGELOG.md b/packages/express/CHANGELOG.md index 0e0a42affa..d356b8e558 100644 --- a/packages/express/CHANGELOG.md +++ b/packages/express/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 1.3.18 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 1.3.17 ### Patch Changes diff --git a/packages/express/package.json b/packages/express/package.json index a62823b6ef..403bd91edb 100644 --- a/packages/express/package.json +++ b/packages/express/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/express", - "version": "1.3.17", + "version": "1.3.18", "description": "Clerk server SDK for usage with Express", "keywords": [ "clerk", diff --git a/packages/fastify/CHANGELOG.md b/packages/fastify/CHANGELOG.md index 02f8b98a48..dd4f120024 100644 --- a/packages/fastify/CHANGELOG.md +++ b/packages/fastify/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 2.0.20 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 2.0.19 ### Patch Changes diff --git a/packages/fastify/package.json b/packages/fastify/package.json index d1943a92ae..672ba5efff 100644 --- a/packages/fastify/package.json +++ b/packages/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/fastify", - "version": "2.0.19", + "version": "2.0.20", "description": "Clerk SDK for Fastify", "keywords": [ "auth", diff --git a/packages/localizations/CHANGELOG.md b/packages/localizations/CHANGELOG.md index 08e4ed8aef..f2e9d2203f 100644 --- a/packages/localizations/CHANGELOG.md +++ b/packages/localizations/CHANGELOG.md @@ -1,5 +1,18 @@ # Change Log +## 3.7.0 + +### Minor Changes + +- Moves all properties under `__experimental_userVerification` to `reverification`. This affects all languages. ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + +### Patch Changes + +- Rename userVerification to reverification to align with the feature name. ([#4634](https://github.com/clerk/javascript/pull/4634)) by [@BRKalow](https://github.com/BRKalow) + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/types@4.35.0 + ## 3.6.6 ### Patch Changes diff --git a/packages/localizations/package.json b/packages/localizations/package.json index 1b6bf6c16e..e50b8ee4c6 100644 --- a/packages/localizations/package.json +++ b/packages/localizations/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/localizations", - "version": "3.6.6", + "version": "3.7.0", "description": "Localizations for the Clerk components", "keywords": [ "react", diff --git a/packages/nextjs/CHANGELOG.md b/packages/nextjs/CHANGELOG.md index ca75d86e73..08f82ca712 100644 --- a/packages/nextjs/CHANGELOG.md +++ b/packages/nextjs/CHANGELOG.md @@ -1,5 +1,24 @@ # Change Log +## 6.5.0 + +### Minor Changes + +- Introduce the `useReverification()` hook that handles the session reverification flow: ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + + - Replaces `__experimental_useReverification` with `useReverification` + Also replaces the following APIs: + - `____experimental_reverificationError` -> `__reverificationError` + - `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` + +### Patch Changes + +- Updated dependencies [[`4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d`](https://github.com/clerk/javascript/commit/4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/clerk-react@5.17.0 + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 6.4.2 ### Patch Changes diff --git a/packages/nextjs/package.json b/packages/nextjs/package.json index e307f11a70..b7590fb015 100644 --- a/packages/nextjs/package.json +++ b/packages/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nextjs", - "version": "6.4.2", + "version": "6.5.0", "description": "Clerk SDK for NextJS", "keywords": [ "clerk", diff --git a/packages/nuxt/CHANGELOG.md b/packages/nuxt/CHANGELOG.md index 8c267e44be..5c75d1cb21 100644 --- a/packages/nuxt/CHANGELOG.md +++ b/packages/nuxt/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/nuxt +## 0.0.4 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + - @clerk/vue@0.0.8 + ## 0.0.3 ### Patch Changes diff --git a/packages/nuxt/package.json b/packages/nuxt/package.json index 386ad84076..81f0e773bd 100644 --- a/packages/nuxt/package.json +++ b/packages/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/nuxt", - "version": "0.0.3", + "version": "0.0.4", "description": "Clerk SDK for Nuxt", "keywords": [ "clerk", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index f1c87be460..4aaf781726 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,5 +1,23 @@ # Change Log +## 5.17.0 + +### Minor Changes + +- Introduce the `useReverification()` hook that handles the session reverification flow: ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + + - Replaces `__experimental_useReverification` with `useReverification` + +### Patch Changes + +- Include **BUILD_DISABLE_RHC** to allow for builds which remove remotely hosted code as it is a requirement for browser extensions. ([#4133](https://github.com/clerk/javascript/pull/4133)) by [@tmilewski](https://github.com/tmilewski) + +- Rename userVerification to reverification to align with the feature name. ([#4634](https://github.com/clerk/javascript/pull/4634)) by [@BRKalow](https://github.com/BRKalow) + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + ## 5.16.2 ### Patch Changes diff --git a/packages/react/package.json b/packages/react/package.json index 56774eff42..6f7c920733 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-react", - "version": "5.16.2", + "version": "5.17.0", "description": "Clerk React library", "keywords": [ "clerk", diff --git a/packages/remix/CHANGELOG.md b/packages/remix/CHANGELOG.md index 23e7e2a798..772d191a34 100644 --- a/packages/remix/CHANGELOG.md +++ b/packages/remix/CHANGELOG.md @@ -1,5 +1,15 @@ # Change Log +## 4.2.56 + +### Patch Changes + +- Updated dependencies [[`4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d`](https://github.com/clerk/javascript/commit/4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/clerk-react@5.17.0 + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 4.2.55 ### Patch Changes diff --git a/packages/remix/package.json b/packages/remix/package.json index fbdeeb6a22..e15c32976b 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/remix", - "version": "4.2.55", + "version": "4.2.56", "description": "Clerk SDK for Remix", "keywords": [ "clerk", diff --git a/packages/sdk-node/CHANGELOG.md b/packages/sdk-node/CHANGELOG.md index f9dcd0cc96..12d2627ad2 100644 --- a/packages/sdk-node/CHANGELOG.md +++ b/packages/sdk-node/CHANGELOG.md @@ -1,5 +1,14 @@ # Change Log +## 5.0.69 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 5.0.68 ### Patch Changes diff --git a/packages/sdk-node/package.json b/packages/sdk-node/package.json index 173c0735db..3ffda3661c 100644 --- a/packages/sdk-node/package.json +++ b/packages/sdk-node/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/clerk-sdk-node", - "version": "5.0.68", + "version": "5.0.69", "description": "Clerk server SDK for usage with node", "keywords": [ "clerk", diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md index 2424468eed..2508389483 100644 --- a/packages/shared/CHANGELOG.md +++ b/packages/shared/CHANGELOG.md @@ -1,5 +1,26 @@ # Change Log +## 2.17.0 + +### Minor Changes + +- Introduce the `useReverification()` hook that handles the session reverification flow: ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + + - `__experimental_useReverification` -> `useReverification` + Also replaces the following APIs: + - `__experimental_reverificationError` -> `reverificationError` + - `__experimental_reverificationErrorResponse` -> `reverificationErrorResponse` + - `__experimental_isReverificationHint` -> `isReverificationHint` + +### Patch Changes + +- Gracefully handle missing reverification error metadata ([#4636](https://github.com/clerk/javascript/pull/4636)) by [@panteliselef](https://github.com/panteliselef) + +- Rename userVerification to reverification to align with the feature name. ([#4634](https://github.com/clerk/javascript/pull/4634)) by [@BRKalow](https://github.com/BRKalow) + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/types@4.35.0 + ## 2.16.1 ### Patch Changes diff --git a/packages/shared/package.json b/packages/shared/package.json index a9e52aa3e5..556543a510 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/shared", - "version": "2.16.1", + "version": "2.17.0", "description": "Internal package utils used by the Clerk SDKs", "repository": { "type": "git", diff --git a/packages/tanstack-start/CHANGELOG.md b/packages/tanstack-start/CHANGELOG.md index 61ea355889..fdac6b4cc8 100644 --- a/packages/tanstack-start/CHANGELOG.md +++ b/packages/tanstack-start/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/tanstack-start +## 0.5.3 + +### Patch Changes + +- Updated dependencies [[`4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d`](https://github.com/clerk/javascript/commit/4da28fa857d1e5538eb5bbe28ecc4bf9dba1ce7d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/clerk-react@5.17.0 + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 0.5.2 ### Patch Changes diff --git a/packages/tanstack-start/package.json b/packages/tanstack-start/package.json index 1190d54af8..26598c75cd 100644 --- a/packages/tanstack-start/package.json +++ b/packages/tanstack-start/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/tanstack-start", - "version": "0.5.2", + "version": "0.5.3", "description": "Clerk SDK for TanStack Start", "keywords": [ "clerk", diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 8398e0b9e6..662acb0a0b 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -1,5 +1,14 @@ # @clerk/testing +## 1.3.30 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/backend@1.18.0 + ## 1.3.29 ### Patch Changes diff --git a/packages/testing/package.json b/packages/testing/package.json index f500403a4b..4726535aa3 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/testing", - "version": "1.3.29", + "version": "1.3.30", "description": "Utilities to help you create E2E test suites for apps using Clerk", "keywords": [ "auth", diff --git a/packages/themes/CHANGELOG.md b/packages/themes/CHANGELOG.md index 1b2c9231d8..eeab061217 100644 --- a/packages/themes/CHANGELOG.md +++ b/packages/themes/CHANGELOG.md @@ -1,5 +1,12 @@ # Change Log +## 2.1.48 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/types@4.35.0 + ## 2.1.47 ### Patch Changes diff --git a/packages/themes/package.json b/packages/themes/package.json index 97304105cb..a2c9d7d454 100644 --- a/packages/themes/package.json +++ b/packages/themes/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/themes", - "version": "2.1.47", + "version": "2.1.48", "description": "Themes for the Clerk auth components", "keywords": [ "react", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 87d0ebcd52..f04bdfe00f 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,47 @@ # Change Log +## 4.35.0 + +### Minor Changes + +- Drop experimental tag related to reverification. ([#4536](https://github.com/clerk/javascript/pull/4536)) by [@panteliselef](https://github.com/panteliselef) + + Properties of Clerk class: + + - `__experimental_openUserVerification` -> `__internal_openReverification` + - `__experimental_closeUserVerification` -> `__internal_closeReverification` + - `__experimental_UserVerificationProps` -> `__internal_ReverificationProps` + - `__experimental_UserVerificationModalProps` -> `__internal_ReverificationModalProps` + + Properties of `Session`: + + - `__experimental_factorVerificationAge` -> `factorVerificationAge` + - `__experimental_startVerification` -> `startVerification` + - `__experimental_prepareFirstFactorVerification` -> `prepareFirstFactorVerification` + - `__experimental_attemptFirstFactorVerification` -> `attemptFirstFactorVerification` + - `__experimental_prepareSecondFactorVerification` -> `prepareSecondFactorVerification` + - `__experimental_attemptSecondFactorVerification` -> `attemptSecondFactorVerification` + + Renaming + + - `__experimental_SessionVerificationResource` -> `SessionVerificationResource` + - `__experimental_SessionVerificationStatus` -> `SessionVerificationStatus` + - `__experimental_SessionVerificationLevel` -> `SessionVerificationLevel` + - `__experimental_ReverificationConfig` -> `ReverificationConfig` + + `CheckAuthorizationParamsWithCustomPermissions` and `CheckAuthorizationParams` now include `reverification?: ReverificationConfig;` + + Properties of `IntialState`: + + - `__experimental_factorVerificationAge` -> `factorVerificationAge` + + Localization types: + All properties of `__experimental_userVerification` are moved to `reverification` + +### Patch Changes + +- Rename userVerification to reverification to align with the feature name. ([#4634](https://github.com/clerk/javascript/pull/4634)) by [@BRKalow](https://github.com/BRKalow) + ## 4.34.2 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index 93b4091a4c..6a2f6a65d4 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/types", - "version": "4.34.2", + "version": "4.35.0", "description": "Typings for Clerk libraries.", "keywords": [ "clerk", diff --git a/packages/ui/CHANGELOG.md b/packages/ui/CHANGELOG.md index 3ae0de2e3b..9b2e0d63bb 100644 --- a/packages/ui/CHANGELOG.md +++ b/packages/ui/CHANGELOG.md @@ -1,5 +1,15 @@ # @clerk/ui +## 0.1.24 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + - @clerk/localizations@3.7.0 + - @clerk/elements@0.19.7 + ## 0.1.23 ### Patch Changes diff --git a/packages/ui/package.json b/packages/ui/package.json index eb6c5243a5..af55b0df18 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/ui", - "version": "0.1.23", + "version": "0.1.24", "repository": { "type": "git", "url": "git+https://github.com/clerk/javascript.git", diff --git a/packages/vue/CHANGELOG.md b/packages/vue/CHANGELOG.md index 5ba98a51a5..90df2c299d 100644 --- a/packages/vue/CHANGELOG.md +++ b/packages/vue/CHANGELOG.md @@ -1,5 +1,13 @@ # @clerk/vue +## 0.0.8 + +### Patch Changes + +- Updated dependencies [[`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`fe9e147e366153d664af7fc325655ecb299a1f9d`](https://github.com/clerk/javascript/commit/fe9e147e366153d664af7fc325655ecb299a1f9d), [`d84d7e31235c5c7da3415981dc76db4473a71a39`](https://github.com/clerk/javascript/commit/d84d7e31235c5c7da3415981dc76db4473a71a39), [`dce4f7ffca7248c0500f0ec9a978672b1f2fad69`](https://github.com/clerk/javascript/commit/dce4f7ffca7248c0500f0ec9a978672b1f2fad69)]: + - @clerk/shared@2.17.0 + - @clerk/types@4.35.0 + ## 0.0.7 ### Patch Changes diff --git a/packages/vue/package.json b/packages/vue/package.json index 3724a46585..1b5462a4ae 100644 --- a/packages/vue/package.json +++ b/packages/vue/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/vue", - "version": "0.0.7", + "version": "0.0.8", "description": "Clerk SDK for Vue", "keywords": [ "clerk", From 75cb50c56372f42924c34aa991d3646d5d2cac0c Mon Sep 17 00:00:00 2001 From: Jason Lengstorf Date: Sun, 24 Nov 2024 19:50:53 +0100 Subject: [PATCH 17/19] fix(astro): ignore prerendered pages in middleware (#4640) Co-authored-by: Tom Milewski --- .changeset/chilled-zoos-appear.md | 5 +++++ packages/astro/src/server/clerk-middleware.ts | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/chilled-zoos-appear.md diff --git a/.changeset/chilled-zoos-appear.md b/.changeset/chilled-zoos-appear.md new file mode 100644 index 0000000000..ad3db10301 --- /dev/null +++ b/.changeset/chilled-zoos-appear.md @@ -0,0 +1,5 @@ +--- +'@clerk/astro': patch +--- + +Ignore pre-rendered files in Clerk Middleware diff --git a/packages/astro/src/server/clerk-middleware.ts b/packages/astro/src/server/clerk-middleware.ts index 6e6f4d809c..ba1426c7f7 100644 --- a/packages/astro/src/server/clerk-middleware.ts +++ b/packages/astro/src/server/clerk-middleware.ts @@ -61,6 +61,11 @@ export const clerkMiddleware: ClerkMiddleware = (...args: unknown[]): any => { const [handler, options] = parseHandlerAndOptions(args); const astroMiddleware: AstroMiddleware = async (context, next) => { + // if the current page is prerendered, do nothing + if ('isPrerendered' in context && context.isPrerendered) { + return next(); + } + const clerkRequest = createClerkRequest(context.request); clerkClient(context).telemetry.record( From c17e982f6d71591495c34ea0976d7c135ae47c96 Mon Sep 17 00:00:00 2001 From: Tom Milewski Date: Sun, 24 Nov 2024 14:28:13 -0500 Subject: [PATCH 18/19] chore(repo): Disable Cypress binary installation on CI (#4645) --- .github/actions/init-blacksmith/action.yml | 2 ++ .github/actions/init/action.yml | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/actions/init-blacksmith/action.yml b/.github/actions/init-blacksmith/action.yml index 93f0d74add..c89522f16f 100644 --- a/.github/actions/init-blacksmith/action.yml +++ b/.github/actions/init-blacksmith/action.yml @@ -114,6 +114,8 @@ runs: registry-url: ${{ inputs.registry-url }} - name: Install PNPM Dependencies + env: + CYPRESS_INSTALL_BINARY: 0 run: pnpm install shell: bash diff --git a/.github/actions/init/action.yml b/.github/actions/init/action.yml index 0e8c828c2f..8db78850ca 100644 --- a/.github/actions/init/action.yml +++ b/.github/actions/init/action.yml @@ -114,7 +114,9 @@ runs: registry-url: ${{ inputs.registry-url }} - name: Install PNPM Dependencies - run: pnpm install + env: + CYPRESS_INSTALL_BINARY: 0 + run: pnpm install shell: bash - name: Get Playwright Version From c7f509e2b5f5ff5e3779e5a13755dbb32c582557 Mon Sep 17 00:00:00 2001 From: Clerk Cookie <136073014+clerk-cookie@users.noreply.github.com> Date: Sun, 24 Nov 2024 14:57:51 -0500 Subject: [PATCH 19/19] ci(repo): Version packages (#4644) Co-authored-by: github-actions[bot] --- .changeset/chilled-zoos-appear.md | 5 ----- packages/astro/CHANGELOG.md | 6 ++++++ packages/astro/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/chilled-zoos-appear.md diff --git a/.changeset/chilled-zoos-appear.md b/.changeset/chilled-zoos-appear.md deleted file mode 100644 index ad3db10301..0000000000 --- a/.changeset/chilled-zoos-appear.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@clerk/astro': patch ---- - -Ignore pre-rendered files in Clerk Middleware diff --git a/packages/astro/CHANGELOG.md b/packages/astro/CHANGELOG.md index 0f1ba436eb..12777d175d 100644 --- a/packages/astro/CHANGELOG.md +++ b/packages/astro/CHANGELOG.md @@ -1,5 +1,11 @@ # @clerk/astro +## 1.4.17 + +### Patch Changes + +- Ignore pre-rendered files in Clerk Middleware ([#4640](https://github.com/clerk/javascript/pull/4640)) by [@jlengstorf](https://github.com/jlengstorf) + ## 1.4.16 ### Patch Changes diff --git a/packages/astro/package.json b/packages/astro/package.json index 27de3f1495..917c5e1e3b 100644 --- a/packages/astro/package.json +++ b/packages/astro/package.json @@ -1,6 +1,6 @@ { "name": "@clerk/astro", - "version": "1.4.16", + "version": "1.4.17", "description": "Clerk SDK for Astro", "keywords": [ "auth",