feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko
, '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

feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko
, '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

feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko
, '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

feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko
, '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

feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko
, '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

feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko
, '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

feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko
, '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

feat(*): Rename setActive to setSelected - #7645

Closed
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected
Closed

feat(*): Rename setActive to setSelected#7645
jacekradko wants to merge 6 commits into
mainfrom
jacek/user-4041-rename-setactive-to-setselected

Conversation

@jacekradko

@jacekradkojacekradko commented Jan 22, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Renames setActive method to setSelected across the entire monorepo
  • Renames all related types (SetActive, SetActiveParams, SetActiveNavigate, SetActiveHook)
  • Renames internal flags (__internal_setActiveInProgress, __internal_onBeforeSetActive, __internal_onAfterSetActive)
  • Adds codemod support for automatic migration
  • Updates documentation

This is a breaking change for Core 3 that better reflects the method's behavior with pending sessions.

Changes

Method Rename

  • clerk.setActive()clerk.setSelected()
  • Hooks now return setSelected instead of setActive:
    • useSignIn()
    • useSignUp()
    • useSessionList()
    • useOrganizationList()

Type Renames

  • SetActiveSetSelected
  • SetActiveParamsSetSelectedParams
  • SetActiveNavigateSetSelectedNavigate
  • SetActiveHookSetSelectedHook

Internal Flag Renames

  • __internal_setActiveInProgress__internal_setSelectedInProgress
  • __internal_onBeforeSetActive__internal_onBeforeSetSelected
  • __internal_onAfterSetActive__internal_onAfterSetSelected

Packages Updated

  • @clerk/shared
  • @clerk/clerk-js
  • @clerk/react
  • @clerk/nextjs
  • @clerk/vue
  • @clerk/expo
  • @clerk/ui
  • @clerk/testing
  • @clerk/upgrade

Codemod

Extended transform-remove-deprecated-props.cjs to automatically migrate:

  • Method calls: clerk.setActive(...)clerk.setSelected(...)
  • Destructuring: const { setActive } = useSignIn()const { setSelected } = useSignIn()
  • Type references
  • Import specifiers

Test plan

  • Build passes for all 20 packages
  • All existing tests updated to use new names
  • Run full test suite
  • Test codemod on sample user code

Closes USER-4041

Summary by CodeRabbit

  • Breaking Changes

    • Public API renamed: setActive() → setSelected(); callback param beforeEmit → navigate (signature updated). Update integrations.
  • Documentation

    • Migration guidance and upgrade notes added.
  • Chores

    • Codemod provided to automate the rename across codebases.
  • Tests

    • Test suites, fixtures, and examples updated to use the new setSelected naming.

✏️ Tip: You can customize this high-level summary in your review settings.

…e setActive to setSelected
BREAKING CHANGE: The `setActive` method has been renamed to `setSelected` to better reflect its behavior with pending sessions.
## Method Rename
- `clerk.setActive()` → `clerk.setSelected()`
- Hooks now return `setSelected` instead of `setActive`:
- `useSignIn()`
- `useSignUp()`
- `useSessionList()`
- `useOrganizationList()`
## Type Renames
- `SetActive` → `SetSelected`
- `SetActiveParams` → `SetSelectedParams`
- `SetActiveNavigate` → `SetSelectedNavigate`
- `SetActiveHook` → `SetSelectedHook`
## Internal Flag Renames
- `__internal_setActiveInProgress` → `__internal_setSelectedInProgress`
- `__internal_onBeforeSetActive` → `__internal_onBeforeSetSelected`
- `__internal_onAfterSetActive` → `__internal_onAfterSetSelected`
Includes codemod support for automatic migration.
@changeset-bot

changeset-botBot commented Jan 22, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 1c39685

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

This PR includes changesets to release 21 packages
NameType
@clerk/clerk-jsMajor
@clerk/sharedMajor
@clerk/reactMajor
@clerk/nextjsMajor
@clerk/vueMajor
@clerk/expoMajor
@clerk/uiMajor
@clerk/testingMajor
@clerk/upgradePatch
@clerk/chrome-extensionPatch
@clerk/agent-toolkitPatch
@clerk/astroPatch
@clerk/backendPatch
@clerk/expo-passkeysPatch
@clerk/expressPatch
@clerk/fastifyPatch
@clerk/localizationsPatch
@clerk/mswPatch
@clerk/nuxtPatch
@clerk/react-routerPatch
@clerk/tanstack-react-startPatch

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 Jan 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

ProjectDeploymentReviewUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentJan 22, 2026 4:49pm

Request Review

@pkg-pr-new

pkg-pr-newBot commented Jan 22, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/agent-toolkit

npm i https://pkg.pr.new/@clerk/agent-toolkit@7645

@clerk/astro

npm i https://pkg.pr.new/@clerk/astro@7645

@clerk/backend

npm i https://pkg.pr.new/@clerk/backend@7645

@clerk/chrome-extension

npm i https://pkg.pr.new/@clerk/chrome-extension@7645

@clerk/clerk-js

npm i https://pkg.pr.new/@clerk/clerk-js@7645

@clerk/dev-cli

npm i https://pkg.pr.new/@clerk/dev-cli@7645

@clerk/expo

npm i https://pkg.pr.new/@clerk/expo@7645

@clerk/expo-passkeys

npm i https://pkg.pr.new/@clerk/expo-passkeys@7645

@clerk/express

npm i https://pkg.pr.new/@clerk/express@7645

@clerk/fastify

npm i https://pkg.pr.new/@clerk/fastify@7645

@clerk/localizations

npm i https://pkg.pr.new/@clerk/localizations@7645

@clerk/nextjs

npm i https://pkg.pr.new/@clerk/nextjs@7645

@clerk/nuxt

npm i https://pkg.pr.new/@clerk/nuxt@7645

@clerk/react

npm i https://pkg.pr.new/@clerk/react@7645

@clerk/react-router

npm i https://pkg.pr.new/@clerk/react-router@7645

@clerk/shared

npm i https://pkg.pr.new/@clerk/shared@7645

@clerk/tanstack-react-start

npm i https://pkg.pr.new/@clerk/tanstack-react-start@7645

@clerk/testing

npm i https://pkg.pr.new/@clerk/testing@7645

@clerk/ui

npm i https://pkg.pr.new/@clerk/ui@7645

@clerk/upgrade

npm i https://pkg.pr.new/@clerk/upgrade@7645

@clerk/vue

npm i https://pkg.pr.new/@clerk/vue@7645

commit: 1c39685

@jacekradkojacekradko changed the title feat(core-3): Rename setActive to setSelectedfeat(*): Rename setActive to setSelectedJan 22, 2026
@coderabbitai

coderabbitaiBot commented Jan 22, 2026

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Walkthrough

Renames public API and related types/identifiers from "Active" to "Selected": setActivesetSelected, SetActive*SetSelected*, __internal_setActiveInProgress__internal_setSelectedInProgress, and window hooks __internal_onBeforeSetActive/__internal_onAfterSetActive__internal_onBeforeSetSelected/__internal_onAfterSetSelected. Changes touch core clerk-js, shared types, React/Vue/Expo hooks, Next.js providers, UI components, tests, docs, a changeset, and an upgrade codemod that automates the rename. No runtime behavior changes beyond identifier/type renames and updated signatures.

🚥 Pre-merge checks | ✅ 4 | ❌ 1
❌ Failed checks (1 warning)
Check nameStatusExplanationResolution
Docstring Coverage⚠️ WarningDocstring coverage is 31.58% which is insufficient. The required threshold is 80.00%.Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check nameStatusExplanation
Description Check✅ PassedCheck skipped - CodeRabbit’s high-level summary is enabled.
Title check✅ PassedThe title 'feat(*): Rename setActive to setSelected' clearly and concisely describes the main change - renaming an API method across the codebase.
Linked Issues check✅ PassedThe PR comprehensively addresses USER-4041 by renaming setActive to setSelected across all packages, types, hooks, internal flags, and includes a codemod for migration.
Out of Scope Changes check✅ PassedAll changes are directly related to the renaming objective. No out-of-scope modifications were introduced; the scope remains focused on the setActive → setSelected migration.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.


Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/clerk-js/src/core/__tests__/clerk.test.ts (1)

2353-2406: Rename window hook stubs to __internal_onBefore/AfterSetSelected.

The test still stubs __internal_onBeforeSetActive / __internal_onAfterSetActive, but core now invokes the *Selected hooks. This can make the updateClient assertion fail and leaves the new hooks uncleared between tests. Please rename these stubs and cleanups (and apply the same rename across this file).

🛠️ Proposed fix (apply similarly to other occurrences in this file)
- (window as any).__internal_onBeforeSetActive = mockOnBeforeSetActive;- (window as any).__internal_onAfterSetActive = mockOnAfterSetActive;+ (window as any).__internal_onBeforeSetSelected = mockOnBeforeSetActive;+ (window as any).__internal_onAfterSetSelected = mockOnAfterSetActive;- (window as any).__internal_onBeforeSetActive = null;- (window as any).__internal_onAfterSetActive = null;+ (window as any).__internal_onBeforeSetSelected = null;+ (window as any).__internal_onAfterSetSelected = null;

@coderabbitaicoderabbitaiBot left a comment

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.

Actionable comments posted: 1

🤖 Fix all issues with AI agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs`:
- Around line 456-473: The current unconditional rename of Identifier
'setActive' to 'setSelected' is too broad; restrict it to only bindings created
by Clerk hooks/instances by checking the identifier's binding origin before
renaming. In the root.find(j.Identifier, { name: 'setActive' }) loop, skip
identifiers unless their binding (via path.scope.getBinding(path.node.name))
exists and its declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

Comment on lines +456 to +473
// Rename setActive identifier (e.g., standalone call or destructured)
root.find(j.Identifier, { name: 'setActive' }).forEach(path => {
// Skip if it's part of a member expression property (already handled above)
if (
path.parent &&
(path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&
path.parent.node.property === path.node
) {
return;
}
// Skip if it's part of an import specifier (handled separately)
if (path.parent && path.parent.node.type === 'ImportSpecifier') {
return;
}
path.node.name = 'setSelected';
changed = true;
stats('setActiveRenamed');
});

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.

⚠️ Potential issue | 🟠 Major

Scope the setActive identifier rename to Clerk bindings only.

The current Identifier-wide rename will also rewrite unrelated identifiers (e.g., const [x, setActive] = useState(...)), which is a breaking codemod bug. Please restrict renames to bindings that originate from Clerk hooks or Clerk instances.

🐛 Proposed fix (scope rename to Clerk hook destructuring)
- // Rename setActive identifier (e.g., standalone call or destructured)- root.find(j.Identifier, { name: 'setActive' }).forEach(path => {- // Skip if it's part of a member expression property (already handled above)- if (- path.parent &&- (path.parent.node.type === 'MemberExpression' || path.parent.node.type === 'OptionalMemberExpression') &&- path.parent.node.property === path.node- ) {- return;- }- // Skip if it's part of an import specifier (handled separately)- if (path.parent && path.parent.node.type === 'ImportSpecifier') {- return;- }- path.node.name = 'setSelected';- changed = true;- stats('setActiveRenamed');- });+ // Rename bindings originating from Clerk hook destructuring only+ root+ .find(j.VariableDeclarator, { id: { type: 'ObjectPattern' } })+ .filter(path => isClerkHookCall(path.node.init))+ .forEach(path => {+ const hasSetActive = path.node.id.properties?.some(+ prop => prop.type === 'ObjectProperty' && isPropertyKeyNamed(prop.key, 'setActive'),+ );+ if (hasSetActive) {+ path.scope.rename('setActive', 'setSelected');+ changed = true;+ stats('setActiveRenamed');+ }+ });

If you want, I can draft isClerkHookCall and tests for common cases.

🤖 Prompt for AI Agents
In `@packages/upgrade/src/codemods/transform-remove-deprecated-props.cjs` around
lines 456 - 473, The current unconditional rename of Identifier 'setActive' to
'setSelected' is too broad; restrict it to only bindings created by Clerk
hooks/instances by checking the identifier's binding origin before renaming. In
the root.find(j.Identifier, { name: 'setActive' }) loop, skip identifiers unless
their binding (via path.scope.getBinding(path.node.name)) exists and its
declaration/init is a Clerk hook call or Clerk instance (e.g.,
VariableDeclarator where init is a CallExpression that satisfies an
isClerkHookCall helper or an Object/MemberExpression originating from a 'clerk'
object); only then change path.node.name to 'setSelected' and mark
changed/stats. Add or use an isClerkHookCall utility to encapsulate hook
detection so unrelated patterns like useState destructuring are not renamed.

@jacekradko

Copy link
Copy Markdown
ContributorAuthor

Superseded by #7646 which takes a different approach - splitting setActive into purpose-specific methods (selectSession and selectOrganization) rather than a simple rename.

@jacekradko
jacekradko deleted the jacek/user-4041-rename-setactive-to-setselected branch January 22, 2026 16:53
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@jacekradko