From 3e8576ec635633acb61d72c30b7efbbf637d0f37 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Tue, 25 Feb 2025 18:14:31 -0800 Subject: [PATCH 1/7] feat(vue,nuxt): Introduce utility function to dynamically update Clerk options --- packages/nuxt/src/module.ts | 14 ++++++--- packages/nuxt/src/runtime/client/index.ts | 1 + packages/vue/src/index.ts | 1 + packages/vue/src/utils/index.ts | 1 + packages/vue/src/utils/updateClerkOptions.ts | 31 ++++++++++++++++++++ 5 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 packages/vue/src/utils/updateClerkOptions.ts diff --git a/packages/nuxt/src/module.ts b/packages/nuxt/src/module.ts index a39fb8c8369..8ac87696075 100644 --- a/packages/nuxt/src/module.ts +++ b/packages/nuxt/src/module.ts @@ -99,10 +99,16 @@ export default defineNuxtModule({ // Add auto-imports for Clerk components, composables and client utils addImportsDir(resolver.resolve('./runtime/composables')); - addImports({ - name: 'createRouteMatcher', - from: resolver.resolve('./runtime/client'), - }); + addImports([ + { + name: 'createRouteMatcher', + from: resolver.resolve('./runtime/client'), + }, + { + name: 'updateClerkOptions', + from: resolver.resolve('./runtime/client'), + }, + ]); // eslint-disable-next-line @typescript-eslint/consistent-type-imports const components: Array = [ diff --git a/packages/nuxt/src/runtime/client/index.ts b/packages/nuxt/src/runtime/client/index.ts index 209ae9608dc..631ad5718bf 100644 --- a/packages/nuxt/src/runtime/client/index.ts +++ b/packages/nuxt/src/runtime/client/index.ts @@ -1 +1,2 @@ export { createRouteMatcher } from './routeMatcher'; +export { updateClerkOptions } from '@clerk/vue'; diff --git a/packages/vue/src/index.ts b/packages/vue/src/index.ts index 3c836dbbe50..dc70787fab9 100644 --- a/packages/vue/src/index.ts +++ b/packages/vue/src/index.ts @@ -6,6 +6,7 @@ export * from './components'; export * from './composables'; export { clerkPlugin } from './plugin'; +export { updateClerkOptions } from './utils'; setErrorThrowerOptions({ packageName: PACKAGE_NAME }); setClerkJsLoadingErrorPackageName(PACKAGE_NAME); diff --git a/packages/vue/src/utils/index.ts b/packages/vue/src/utils/index.ts index 3b0a7909589..c4a11a1afd8 100644 --- a/packages/vue/src/utils/index.ts +++ b/packages/vue/src/utils/index.ts @@ -1,3 +1,4 @@ export * from './childrenUtils'; export * from './toComputedRefs'; export * from './useClerkLoaded'; +export * from './updateClerkOptions'; diff --git a/packages/vue/src/utils/updateClerkOptions.ts b/packages/vue/src/utils/updateClerkOptions.ts new file mode 100644 index 00000000000..e6e2c6c495f --- /dev/null +++ b/packages/vue/src/utils/updateClerkOptions.ts @@ -0,0 +1,31 @@ +import type { ClerkOptions } from '@clerk/types'; + +import { useClerk } from '../composables/useClerk'; + +type ClerkUpdateOptions = Pick; + +/** + * Updates Clerk's appearance and localization options at runtime. + * + * @param options - The Clerk options to update + * + * @example + * import { frFR } from '@clerk/localizations'; + * import { dark } from '@clerk/themes'; + * + * updateClerkOptions({ + * appearance: { baseTheme: dark }, + * localization: frFR + * }); + */ +export function updateClerkOptions(options: ClerkUpdateOptions) { + const clerk = useClerk(); + + // @ts-expect-error - `__unstable__updateProps` is not exposed as public API from `@clerk/types` + void clerk.value.__unstable__updateProps({ + options: { + locatization: options.localization, + }, + appearance: options.appearance, + }); +} From 882314c0b28519438a0207206c251a8c85eb2ee7 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Tue, 25 Feb 2025 18:31:29 -0800 Subject: [PATCH 2/7] chore: Use Clerk from window object --- packages/vue/src/utils/updateClerkOptions.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/vue/src/utils/updateClerkOptions.ts b/packages/vue/src/utils/updateClerkOptions.ts index e6e2c6c495f..fe51902b5f9 100644 --- a/packages/vue/src/utils/updateClerkOptions.ts +++ b/packages/vue/src/utils/updateClerkOptions.ts @@ -1,7 +1,5 @@ import type { ClerkOptions } from '@clerk/types'; -import { useClerk } from '../composables/useClerk'; - type ClerkUpdateOptions = Pick; /** @@ -19,10 +17,8 @@ type ClerkUpdateOptions = Pick; * }); */ export function updateClerkOptions(options: ClerkUpdateOptions) { - const clerk = useClerk(); - // @ts-expect-error - `__unstable__updateProps` is not exposed as public API from `@clerk/types` - void clerk.value.__unstable__updateProps({ + void window.Clerk.__unstable__updateProps({ options: { locatization: options.localization, }, From c7f3d694056e00f1806f0c81cd38f3db000250dd Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Tue, 25 Feb 2025 18:36:09 -0800 Subject: [PATCH 3/7] chore: fix typo --- packages/vue/src/utils/updateClerkOptions.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vue/src/utils/updateClerkOptions.ts b/packages/vue/src/utils/updateClerkOptions.ts index fe51902b5f9..ad62a5976e7 100644 --- a/packages/vue/src/utils/updateClerkOptions.ts +++ b/packages/vue/src/utils/updateClerkOptions.ts @@ -20,7 +20,7 @@ export function updateClerkOptions(options: ClerkUpdateOptions) { // @ts-expect-error - `__unstable__updateProps` is not exposed as public API from `@clerk/types` void window.Clerk.__unstable__updateProps({ options: { - locatization: options.localization, + localization: options.localization, }, appearance: options.appearance, }); From eaeadb0f59a840eea3ef965a540d798992cdfc42 Mon Sep 17 00:00:00 2001 From: wobsoriano Date: Wed, 26 Feb 2025 09:12:04 -0800 Subject: [PATCH 4/7] chore: add test --- integration/presets/vue.ts | 3 ++- integration/templates/vue-vite/src/App.vue | 2 ++ .../src/components/LanguagePicker.vue | 25 +++++++++++++++++++ integration/tests/vue/components.test.ts | 19 ++++++++++++++ packages/vue/src/utils/updateClerkOptions.ts | 2 +- 5 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 integration/templates/vue-vite/src/components/LanguagePicker.vue diff --git a/integration/presets/vue.ts b/integration/presets/vue.ts index 1003af19f58..2d6c75a3911 100644 --- a/integration/presets/vue.ts +++ b/integration/presets/vue.ts @@ -10,7 +10,8 @@ const vite = applicationConfig() .addScript('dev', 'pnpm dev') .addScript('build', 'pnpm build') .addScript('serve', 'pnpm preview') - .addDependency('@clerk/vue', linkPackage('vue')); + .addDependency('@clerk/vue', linkPackage('vue')) + .addDependency('@clerk/localizations', linkPackage('localizations')); export const vue = { vite, diff --git a/integration/templates/vue-vite/src/App.vue b/integration/templates/vue-vite/src/App.vue index f913f45b9e4..6477a90213f 100644 --- a/integration/templates/vue-vite/src/App.vue +++ b/integration/templates/vue-vite/src/App.vue @@ -1,6 +1,7 @@