You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Mark the Domains step complete when any organization domain is verified via the new `hasAnyOrganizationDomainsVerified` helper, and require all domains to be verified before the Connection, Test, and Activate steps become reachable.
The PR adds a helper for detecting whether any organization domain is verified, updates ConfigureSSOWizard to mark the verify-domain step complete on that condition, and revises later step gating to keep requiring full domain verification.
Uses the new helper for verify-domain completion and adjusts configure/test/activate reachability and completion checks plus memo dependencies.
Estimated code review effort
🎯 2 (Simple) | ⏱️ ~10 minutes
Possibly related PRs
clerk/javascript#8799 — Also touches ConfigureSSOWizard and organizationEnterpriseConnection.ts, with related SSO wizard and domain-flow changes.
clerk/javascript#8864 — Overlaps with the same wizard state and step-navigation flow affected by the updated gating logic here.
Suggested reviewers
LauraBeatris
Poem
I hopped by moonlight through the gate,
One verified domain said, “You’re great!”
The wizard twitched and gave a cheer,
While farther steps stayed neatly near. 🐰
Static analyzer: Breaking change in property OrganizationDomainOwnershipVerification.status: Type changed: import("@clerk/shared").OrganizationDomainOwnershipVerificationStatus → import("@clerk/shared").OrganizationDomainVerificationStatus
🤖 AI review (confirmed) (85%): The status property of OrganizationDomainOwnershipVerification changed from OrganizationDomainOwnershipVerificationStatus ('expired'|'unverified'|'verified') to OrganizationDomainVerificationStatus ('unverified'|'verified'), removing the 'expired' variant; consumers who switch/match on 'expired' will have type errors.
Migration: Remove or remap any code that handles the 'expired' status value on OrganizationDomainOwnershipVerification.status, as it is no longer part of the type.
Static analyzer: Breaking change in property OrganizationDomainOwnershipVerificationJSON.status: Type changed: import("@clerk/shared").OrganizationDomainOwnershipVerificationStatus → import("@clerk/shared").OrganizationDomainVerificationStatus
🤖 AI review (confirmed) (85%): Same narrowing as b73ffcd5d145 but on the JSON variant; OrganizationDomainOwnershipVerificationJSON.status loses the 'expired' variant, breaking consumers who pattern-match on it.
Migration: Remove or remap any code that handles the 'expired' status value on OrganizationDomainOwnershipVerificationJSON.status, as it is no longer part of the type.
- type OrganizationDomainOwnershipVerificationStatus = 'unverified' | 'verified' | 'expired';
Static analyzer: Removed type alias OrganizationDomainOwnershipVerificationStatus
🤖 AI review (confirmed) (95%): OrganizationDomainOwnershipVerificationStatus is a fully removed export; any consumer that imported or referenced this type alias will fail to compile.
Migration: Replace usages of OrganizationDomainOwnershipVerificationStatus with OrganizationDomainVerificationStatus, and remove handling for the 'expired' value if present.
- type OrganizationDomainOwnershipVerificationStrategy = 'txt' | 'legacy' | 'manual_override' | 'parent_domain';+ type OrganizationDomainOwnershipVerificationStrategy = 'txt' | 'legacy' | 'manual_override';
Static analyzer: Breaking change in type alias OrganizationDomainOwnershipVerificationStrategy: Type changed: 'legacy'|'manual_override'|'parent_domain'|'txt' → 'legacy'|'manual_override'|'txt'
🤖 AI review (confirmed) (90%): OrganizationDomainOwnershipVerificationStrategy lost the 'parent_domain' member; consumers who assign or compare against 'parent_domain' will encounter type errors.
Migration: Remove any code that references or handles the 'parent_domain' strategy value in OrganizationDomainOwnershipVerificationStrategy.
Changed: OrganizationDomainVerificationStatus
- type OrganizationDomainVerificationStatus = 'unverified' | 'verified' | 'failed' | 'expired';+ type OrganizationDomainVerificationStatus = 'unverified' | 'verified';
Static analyzer: Breaking change in type alias OrganizationDomainVerificationStatus: Type changed: 'expired'|'failed'|'unverified'|'verified' → 'unverified'|'verified'
🤖 AI review (confirmed) (90%): OrganizationDomainVerificationStatus was narrowed from 'expired'|'failed'|'unverified'|'verified' to 'unverified'|'verified', removing 'expired' and 'failed'; consumers who handle those variants will have type errors.
Migration: Remove or remap any code that handles 'expired' or 'failed' values for OrganizationDomainVerificationStatus.
Static analyzer: Breaking change in type alias __internal_LocalizationResource: Type changed: {locale:string;maintenanceMode:import("@clerk/shared").LocalizationValue;roles:{[r:string]:import("@clerk/shared").Loca… → {locale:string;maintenanceMode:import("@clerk/shared").LocalizationValue;roles:{[r:string]:import("@clerk/shared").Loca…
🤖 AI review (reclassified as non-breaking) (55%): The before/after snippets differ by only 4 elided lines (1867 vs 1863), indicating minor removals/additions within the localization resource; __internal_LocalizationResource is used only as the source for LocalizationResource which extends DeepPartial<DeepLocalizationWithoutObjects<...>>, making consumers read optional fields from it (output/partial direction), so removing a few optional keys is unlikely to break well-typed consumers — however without seeing exactly which keys changed, confidence is moderate.
Static analyzer: Breaking change in type alias ElementsConfig: Type changed: {button:import("@clerk/ui").~WithOptions<string>;input:import("@clerk/ui").~WithOptions;checkbox:import("@clerk/ui").~W… → {button:import("@clerk/ui").~WithOptions<string>;input:import("@clerk/ui").~WithOptions;checkbox:import("@clerk/ui").~W…
🤖 AI review (reclassified as non-breaking) (70%): The diff shows one fewer elided line (473→472) in the middle section but all visible keys and value types are identical; ElementsConfig is consumed only via the Elements mapped type which is an output type, so no well-typed consumer constructs an ElementsConfig object directly.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Checklist
pnpm testruns as expected.pnpm buildruns as expected.Type of change
Summary by CodeRabbit
New Features
Bug Fixes