fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(vue): Set initial value of clientCtx to undefined - #5324

Merged
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist
Mar 12, 2025
Merged

fix(vue): Set initial value of clientCtx to undefined#5324
nikosdouvlis merged 3 commits into
clerk:mainfrom
Dorilama:fix-vue-usesessionlist

Conversation

@Dorilama

@DorilamaDorilama commented Mar 11, 2025

Copy link
Copy Markdown
Contributor

Description

Fixes UsesessionList bug: when clientCtx is defined clerk can be null and the composable throws when trying to access clerk.value.setActive.
The error can be reproduced in this project on stackblitz
Fixed by adding a condition to return the default values also when clerk.value is null.

Checklist

  • pnpm test runs as expected.
  • pnpm build runs as expected.
  • (If applicable) JSDoc comments have been added or updated for any package exports
  • (If applicable) Documentation has been updated

Type of change

  • 🐛 Bug fix
  • 🌟 New feature
  • 🔨 Breaking change
  • 📖 Refactoring / dependency upgrade / documentation
  • other:

@changeset-bot

changeset-botBot commented Mar 11, 2025

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7517f9c

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 2 packages
NameType
@clerk/vuePatch
@clerk/nuxtPatch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@vercel

vercelBot commented Mar 11, 2025

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for Git ↗︎

NameStatusPreviewCommentsUpdated (UTC)
clerk-js-sandbox✅ Ready (Inspect)Visit Preview💬 Add feedbackMar 11, 2025 8:22pm

Comment thread.changeset/seven-walls-drive.md Outdated
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@wobsoriano Clerk being null while clientCtx is defined seems like an invalid state. I'd expect the existing code to work as expected, which makes me that there is another underlying cause for this issue.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

FYI the issue was client resource was initially set to an empty object. See my comment here.

This one now looks good!

@wobsoriano

wobsoriano commented Mar 11, 2025

Copy link
Copy Markdown
Member

Hi @Dorilama! Thanks for the PR and reproduction.

As @panteliselef mentioned, having clientCtx defined while clerk is null is indeed an invalid state.

While our React useSessionList() hook has the same logic as the Vue one's, it utilizes an extended Clerk class, specifically the IsomorphicClerk, which allows methods to be called lazily even when clerk is null.

In the Vue implementation, we do not use the IsomorphicClerk, so we should avoid rendering clerk.value!.setActive in useSessionList.ts if clerk.value is null. This PR makes sense, but I'll still need to investigate on why there's a possibility of clientCtx having defined while clerk is null and get back to you shortly!


const result = computed<UseSessionListReturn>(() => {
if (!clientCtx.value) {
if (!clientCtx.value || !clerk.value) {

@wobsorianowobsorianoMar 11, 2025

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, the issue is that we have the clientCtx value initially set to an empty object that's why it passes the condition even if clerk is null.

Would you be able to update the initial value to undefined and assert the type for now? (client: undefined as unknown as ClientResource). Then we can merge the PR!

This should be a safe update as we check the value of clerk in all of our composables except useSessionList().

Thanks!

@wobsorianowobsoriano changed the title fix(vue): add check for clerk.value in UseSessionList composablefix(vue): add check for clerk.value in useSessionList() composableMar 11, 2025

@wobsorianowobsoriano left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks so much and very nice catch! 🚀

@Dorilama

Copy link
Copy Markdown
ContributorAuthor

thank you for all the work with the sdk :)

Comment thread.changeset/fuzzy-pillows-doubt.md Outdated
'@clerk/vue': patch
---

updating the initial value of `clientCtx` to `undefined` as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
updating the initial value of `clientCtx` to `undefined`as requested [here](https://github.com/clerk/javascript/pull/5324#discussion_r1989445357)
Bug fix: Update the initial value of `clientCtx` to `undefined`to correctly infer that `clerk` is defined.

Comment thread.changeset/seven-walls-drive.md Outdated
Comment on lines +1 to +5
---
'@clerk/vue': patch
---

fix UsesessionList bug. When `clientCtx` is defined `clerk` can be `null` and throw when trying to access `clerk.value.setActive`. Added a condition to return the default values also when `clerk.value` is `null`.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@Dorilama Can you please remove this changeset, in favour of the new one ? We should only have one changeset file per package

Copy link
Copy Markdown
ContributorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, sorry about that 😅

@panteliselefpanteliselef changed the title fix(vue): add check for clerk.value in useSessionList() composablefix(vue): Set initial value of clientCtx to undefinedMar 11, 2025
@nikosdouvlis
nikosdouvlis merged commit ba2b00c into clerk:mainMar 12, 2025
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants

@Dorilama@wobsoriano@panteliselef@nikosdouvlis@clerk-cookie