Skip to content

chore(repo): Upgrade to TypeScript 6.0#8177

Open
dstaley wants to merge 50 commits into
mainfrom
ds.chore/ts-6.0
Open

chore(repo): Upgrade to TypeScript 6.0#8177
dstaley wants to merge 50 commits into
mainfrom
ds.chore/ts-6.0

Conversation

@dstaley
Copy link
Copy Markdown
Member

@dstaley dstaley commented Mar 27, 2026

Description

Updates the repository to TypeScript 6.0, and replaces usage of tsup with tsdown where it was necessary for the packages to build correctly. (There are a few remaining packages using tsup, but those don't break when built with TypeScript 6.0, so I'm saving them for a future PR.)

The majority of this PR was reviewed as individual PRs.

Checklist

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

Type of change

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

@vercel
Copy link
Copy Markdown

vercel Bot commented Mar 27, 2026

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

Project Deployment Actions Updated (UTC)
clerk-js-sandbox Ready Ready Preview, Comment Jun 3, 2026 4:20pm

Request Review

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Mar 27, 2026

🦋 Changeset detected

Latest commit: 9a9760b

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

This PR includes changesets to release 20 packages
Name Type
@clerk/tanstack-react-start Patch
@clerk/chrome-extension Patch
@clerk/expo-passkeys Patch
@clerk/react-router Patch
@clerk/localizations Patch
@clerk/express Patch
@clerk/backend Patch
@clerk/clerk-js Patch
@clerk/testing Patch
@clerk/nextjs Patch
@clerk/shared Patch
@clerk/astro Patch
@clerk/expo Patch
@clerk/hono Patch
@clerk/nuxt Patch
@clerk/react Patch
@clerk/vue Patch
@clerk/ui Patch
@clerk/fastify Patch
@clerk/msw Patch

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

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Mar 27, 2026

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Bumped the pnpm-workspace.yaml TypeScript catalog pin catalogs.repo.typescript from 5.8.3 to 6.0.2. Removed four TypeScript interfaces related to serialized passkey native-module responses and removed two of those names from an import list while runtime references remain. Updated several tsconfig.json files (removed baseUrl, added types: ["node"] and/or rootDir: "./src"). Replaced multiple src/... path-alias imports with relative imports. Changed PEM helper and JWT verification code to use Uint8Array types. Switched several packages’ build tooling/configuration from tsup to tsdown and adjusted related configs and package scripts.

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 50.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'chore(repo): Upgrade to TypeScript 6.0' directly and clearly summarizes the main objective of the changeset—upgrading the repository to TypeScript 6.0, which is reflected across multiple package configurations and type compatibility updates.
Description check ✅ Passed The PR description clearly describes the changes: upgrading to TypeScript 6.0 and replacing tsup with tsdown where necessary, matching the changeset across multiple packages.

✏️ 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.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/expo-passkeys/tsconfig.json`:
- Around line 22-24: The tsconfig.json change (changing "target" to "ES2019" and
other compiler settings) needs accompanying test coverage for
packages/expo-passkeys; add or update tests that perform a package-level
build/typecheck (e.g., a CI job or npm script like "build" / "typecheck" invoked
in the package's test matrix) to ensure TypeScript 6 migration does not regress,
include at least one unit or integration test that imports core modules from
packages/expo-passkeys to exercise compilation, and ensure the package.json
scripts and repository CI workflow reference this new/updated test step so the
typecheck/build runs before merge.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository YAML (base), Organization UI (inherited)

Review profile: ASSERTIVE

Plan: Pro

Run ID: 558d3e54-4d4e-4f5b-b248-839a6d30d198

📥 Commits

Reviewing files that changed from the base of the PR and between 897099c and 8301649.

📒 Files selected for processing (3)
  • packages/expo-passkeys/src/ClerkExpoPasskeys.types.ts
  • packages/expo-passkeys/src/index.ts
  • packages/expo-passkeys/tsconfig.json
💤 Files with no reviewable changes (2)
  • packages/expo-passkeys/src/index.ts
  • packages/expo-passkeys/src/ClerkExpoPasskeys.types.ts

Comment on lines +22 to +24
"target": "ES2019",
"types": ["node"],
"rootDir": "./src"
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

Add migration coverage before merge.

This TypeScript 6 compiler-config change is not accompanied by test updates; please add/modify tests (at minimum package-level build/typecheck coverage for packages/expo-passkeys) to guard against upgrade regressions before merging.

As per coding guidelines, "If there are no tests added or modified as part of the PR, please suggest that tests be added to cover the changes."

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/expo-passkeys/tsconfig.json` around lines 22 - 24, The tsconfig.json
change (changing "target" to "ES2019" and other compiler settings) needs
accompanying test coverage for packages/expo-passkeys; add or update tests that
perform a package-level build/typecheck (e.g., a CI job or npm script like
"build" / "typecheck" invoked in the package's test matrix) to ensure TypeScript
6 migration does not regress, include at least one unit or integration test that
imports core modules from packages/expo-passkeys to exercise compilation, and
ensure the package.json scripts and repository CI workflow reference this
new/updated test step so the typecheck/build runs before merge.

# Conflicts:
#	packages/astro/package.json
#	packages/react/package.json
#	packages/shared/tsdown.config.mts
#	packages/tanstack-react-start/package.json
#	packages/vue/package.json
#	packages/vue/tsdown.config.ts
#	pnpm-lock.yaml
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 3, 2026

API Changes Report

Generated by Break Check on 2026-06-03T16:18:45.231Z

Summary

Metric Count
Packages analyzed 19
Packages with changes 12
🔴 Breaking changes 0
🟡 Non-breaking changes 64
🟢 Additions 5

🤖 This report was reviewed by claude-sonnet-4-6.

Note
Break Check could not snapshot 3 subpaths; the diff below excludes them.

  • @clerk/astro ./env: Internal Error: Unable to determine module for: /home/runner/_work/javascript/javascript/packages/astro/env.d.ts You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/shared ./cookie: Internal Error: Unable to follow symbol for "Cookies" You have encountered a software defect. Please consider reporting the issue to the maintainers of this application.
  • @clerk/testing ./cypress: Symbol not found for identifier: Cypress

@clerk/astro

Current version: 3.3.3
Recommended bump: MINOR → 3.4.0

Subpath ./client

🟡 Non-breaking Changes (3)

Modified: $authStore
- $authStore: nanostores.ReadableAtom<{
-     userId: string | null | undefined;
-     user: _clerk_shared__chunks_index_b0MjRuVo.ps | null | undefined;
-     sessionId: string | null | undefined;
-     session: _clerk_shared__chunks_index_b0MjRuVo.Qo | null | undefined;
-     sessionStatus: "active" | "pending" | undefined;
-     sessionClaims: _clerk_shared__chunks_index_b0MjRuVo.to | null | undefined;
-     organization: _clerk_shared__chunks_index_b0MjRuVo.xo | null | undefined;
-     orgId: string | null | undefined;
-     orgRole: string | null | undefined;
-     orgSlug: string | null | undefined;
-     orgPermissions: _clerk_shared__chunks_index_b0MjRuVo.gm<_clerk_shared__chunks_index_b0MjRuVo.co>[] | null | undefined;
-     actor: _clerk_shared__chunks_index_b0MjRuVo.Xa | null | undefined;
-     factorVerificationAge: [number, number] | null;
+ $authStore: _$nanostores.ReadableAtom<{
+   userId: string | null | undefined;
+   user: _$_clerk_shared_types0.UserResource | null | undefined;
+   sessionId: string | null | undefined;
+   session: SignedInSessionResource | null | undefined;
+   sessionStatus: "active" | "pending" | undefined;
+   sessionClaims: _$_clerk_shared_types0.JwtPayload | null | undefined;
+   organization: _$_clerk_shared_types0.OrganizationResource | null | undefined;
+   orgId: string | null | undefined;
+   orgRole: string | null | undefined;
+   orgSlug: string | null | undefined;
+   orgPermissions: _$_clerk_shared_types0.Autocomplete<_$_clerk_shared_types0.OrganizationSystemPermissionKey>[] | null | undefined;
+   actor: _$_clerk_shared_types0.ActClaim | null | undefined;
+   factorVerificationAge: [number, number] | null;
  }>

Static analyzer: Breaking change in variable $authStore: Type changed: $authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:!_clerk_shared__chunks_index_b0MjRuVo.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (90%): The before/after types for $authStore are structurally identical — the mangled internal chunk aliases (_clerk_shared__chunks_index_b0MjRuVo.*) are simply replaced with their publicly-named equivalents from @clerk/shared (e.g., psUserResource, QoSignedInSessionResource, etc.), and all fields and their optionality are unchanged; this is a type alias re-export rename with no structural impact on consumers.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_b0MjRuVo.xo | null | undefined>
+ $organizationStore: _$nanostores.ReadableAtom<_$_clerk_shared_types0.OrganizationResource | null | undefined>

Static analyzer: Breaking change in variable $organizationStore: Type changed: $organizationStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_b0MjRuVo.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (90%): The type of $organizationStore changed from the internal chunk alias _clerk_shared__chunks_index_b0MjRuVo.xo to the public OrganizationResource from @clerk/shared; these resolve to the same structural type, so no consumer code is affected.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_b0MjRuVo.ps | null | undefined>
+ $userStore: _$nanostores.ReadableAtom<_$_clerk_shared_types0.UserResource | null | undefined>

Static analyzer: Breaking change in variable $userStore: Type changed: $userStore:import("nanostores").ReadableAtom<!_clerk_shared__chunks_index_b0MjRuVo.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (90%): The type of $userStore changed from the internal chunk alias _clerk_shared__chunks_index_b0MjRuVo.ps to the public UserResource from @clerk/shared; these resolve to the same structural type, so no consumer code is affected.


@clerk/backend

Current version: 3.5.0
Recommended bump: MINOR → 3.6.0

Subpath ./jwt

🟡 Non-breaking Changes (2)

Modified: hasValidSignature
- hasValidSignature: (jwt: import("@clerk/shared/types").Jwt, key: string | JsonWebKey) => Promise<NonNullable<boolean | undefined>>
+ hasValidSignature: (jwt: Jwt, key: JsonWebKey | string) => Promise<boolean>

Static analyzer: Breaking change in function hasValidSignature: Return type changed: !Promise:interface<!NonNullable:type<boolean|undefined>>!Promise:interface<boolean>; Parameter key type changed: string|!JsonWebKey:interface!JsonWebKey:interface|string

🤖 AI review (reclassified as non-breaking) (95%): Both the parameter order change (string | JsonWebKeyJsonWebKey | string) and the return type narrowing (Promise<NonNullable<boolean | undefined>>Promise<boolean>) are structurally equivalent — union member reordering has no runtime or type effect, and NonNullable<boolean | undefined> resolves to boolean, making the return type identical.

Modified: verifyJwt
- verifyJwt: (token: string, options: import("./verifyJwt").VerifyJwtOptions) => Promise<NonNullable<import("@clerk/shared/types").JwtPayload | undefined>>
+ verifyJwt: (token: string, options: VerifyJwtOptions) => Promise<JwtPayload>

Static analyzer: Breaking change in function verifyJwt: Return type changed: !Promise:interface<!NonNullable:type<import("@clerk/shared").JwtPayload|undefined>>!Promise:interface<import("@clerk/shared").JwtPayload>

🤖 AI review (reclassified as non-breaking) (95%): Promise<NonNullable<JwtPayload | undefined>> resolves to Promise<JwtPayload>, so the return type is structurally identical to the new signature and no consumer code is affected.


@clerk/express

Current version: 2.1.23
Recommended bump: MINOR → 2.2.0

Subpath .

🟡 Non-breaking Changes (1)

Modified: ClerkMiddlewareOptions
  type ClerkMiddlewareOptions = AuthenticateRequestOptions & {
-     debug?: boolean;
-     clerkClient?: ClerkClient;
-     frontendApiProxy?: FrontendApiProxyOptions;
+   debug?: boolean;
+   clerkClient?: ClerkClient$1;
+   frontendApiProxy?: FrontendApiProxyOptions;
  };

Static analyzer: Breaking change in type alias ClerkMiddlewareOptions: Type changed: import("@clerk/backend").AuthenticateRequestOptions&{debug?:boolean;clerkClient?:import("@clerk/express").~ClerkClient;…import("@clerk/backend").AuthenticateRequestOptions&{debug?:boolean;clerkClient?:import("@clerk/express").~ClerkClient$…

🤖 AI review (reclassified as non-breaking) (95%): The change is purely a rename of the internal alias ClerkClientClerkClient$1; the resolved structural shape of ClerkMiddlewareOptions is identical, and since ClerkMiddlewareOptions is used only in input/parameter positions, consumers are unaffected.

Subpath ./types

🟡 Non-breaking Changes (2)

Modified: AuthenticateRequestParams
  type AuthenticateRequestParams = {
-     clerkClient: ClerkClient;
-     request: Request;
-     options?: ClerkMiddlewareOptions;
+   clerkClient: ClerkClient$1;
+   request: Request;
+   options?: ClerkMiddlewareOptions;
  };

Static analyzer: Breaking change in type alias AuthenticateRequestParams: Type changed: {clerkClient:import("@clerk/express").~ClerkClient;request:import("@types/express").e.Request;options?:import("@clerk/e…{clerkClient:import("@clerk/express").~ClerkClient$1;request:import("@types/express").e.Request;options?:import("@clerk…

🤖 AI review (reclassified as non-breaking) (90%): The change is purely a rename of the internal alias ClerkClient to ClerkClient$1; both refer to the same structural type, so the resolved shape of AuthenticateRequestParams is identical and no well-typed consumer code is affected.

Modified: ClerkMiddlewareOptions
  type ClerkMiddlewareOptions = AuthenticateRequestOptions & {
-     debug?: boolean;
-     clerkClient?: ClerkClient;
-     frontendApiProxy?: FrontendApiProxyOptions;
+   debug?: boolean;
+   clerkClient?: ClerkClient$1;
+   frontendApiProxy?: FrontendApiProxyOptions;
  };

Static analyzer: Breaking change in type alias ClerkMiddlewareOptions: Type changed: import("@clerk/backend").AuthenticateRequestOptions&{debug?:boolean;clerkClient?:import("@clerk/express").~ClerkClient;…import("@clerk/backend").AuthenticateRequestOptions&{debug?:boolean;clerkClient?:import("@clerk/express").~ClerkClient$…

🤖 AI review (reclassified as non-breaking) (90%): The rename from ClerkClient to ClerkClient$1 is an internal module-alias change; the structural type of ClerkMiddlewareOptions is unchanged, so existing consumers who pass or read this type are unaffected.


@clerk/nextjs

Current version: 7.4.3
Recommended bump: MINOR → 7.5.0

Subpath ./internal

🟡 Non-breaking Changes (1)

Modified: OAuthConsent
- OAuthConsent: {
-     (props: import("@clerk/shared/types").Without<import("@clerk/react/types").WithClerkProp<import("@clerk/shared/types").OAuthConsentProps & {
-         fallback?: import("react").ReactNode;
-     }>, "clerk">): React.JSX.Element | null;
-     displayName: string;
- }
+ OAuthConsent: typeof OAuthConsentOriginal

Static analyzer: Breaking change in variable OAuthConsent: Type changed: OAuthConsent:{(props:import("@clerk/shared").Without<import("@clerk/react").WithClerkProp<import("@clerk/shared").OAuth…OAuthConsent:typeof import("@clerk/react").OAuthConsent

🤖 AI review (reclassified as non-breaking) (85%): The change is a re-export alias (typeof import("@clerk/react").OAuthConsent) that resolves to the same callable component shape; the structural signature (props → JSX.Element | null, displayName) is preserved, so no well-typed consumer code is affected.


@clerk/nuxt

Current version: 2.5.3
Recommended bump: MINOR → 2.6.0

Subpath ./server

🟡 Non-breaking Changes (2)

Modified: clerkClient
- declare function clerkClient(event: H3Event): _clerk_backend.ClerkClient;
+ declare function clerkClient(event: H3Event): _$_clerk_backend0.ClerkClient;

Static analyzer: Breaking change in function clerkClient: Parameter event type changed: import("h3").H3Eventimport("@clerk/nuxt").H3Event

🤖 AI review (reclassified as non-breaking) (90%): Both import('h3').H3Event and import('@clerk/nuxt').H3Event refer to the same H3Event type — @clerk/nuxt simply re-exports it from h3, so the resolved structural shape is identical and no well-typed consumer code is affected.

Modified: createRouteMatcher
  createRouteMatcher: (routes: RouteMatcherParam) => (event: H3Event) => boolean

Static analyzer: Breaking change in function createRouteMatcher: Return type changed: (event:import("h3").H3Event)=>boolean(event:import("@clerk/nuxt").H3Event)=>boolean

🤖 AI review (reclassified as non-breaking) (90%): The return type's inner event parameter type changed from import('h3').H3Event to import('@clerk/nuxt').H3Event, which is a re-export of the same type, making the structural shape identical and the change purely nominal.

Subpath ./webhooks

🟡 Non-breaking Changes (1)

Modified: verifyWebhook
- declare function verifyWebhook(event: H3Event, options?: VerifyWebhookOptions): Promise<_clerk_backend_webhooks.WebhookEvent>;
+ declare function verifyWebhook(event: H3Event, options?: VerifyWebhookOptions): Promise<_$_clerk_backend0.WebhookEvent>;

Static analyzer: Breaking change in function verifyWebhook: Parameter event type changed: import("h3").H3Eventimport("@clerk/nuxt").H3Event

🤖 AI review (reclassified as non-breaking) (85%): Both import("h3").H3Event and import("@clerk/nuxt").H3Event almost certainly resolve to the same structural type — @clerk/nuxt re-exports H3Event from h3, so the rename is a module path alias change with identical shape, not a type narrowing or widening. The return type alias change (_clerk_backend_webhooks.WebhookEvent_$_clerk_backend0.WebhookEvent) is similarly a module namespace alias rename with the same underlying type.


@clerk/react

Current version: 6.7.3
Recommended bump: MINOR → 6.8.0

Subpath .

🟡 Non-breaking Changes (2)

Modified: ClerkProviderProps
  type ClerkProviderProps<TUi extends Ui = Ui> = Omit<IsomorphicClerkOptions, 'appearance' | keyof InternalClerkScriptProps> & {
-     children: React.ReactNode;
-     initialState?: InitialState;
-     __internal_bypassMissingPublishableKey?: boolean;
-     appearance?: ExtractAppearanceType<TUi, Appearance>;
-     ui?: TUi;
+   children: React$1.ReactNode;
+   initialState?: InitialState;
+   __internal_bypassMissingPublishableKey?: boolean;
+   appearance?: ExtractAppearanceType<TUi, Appearance>;
+   ui?: TUi;
  };

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/shared").IsomorphicClerkOptions,'appearance'|keyof import("@clerk/shared").InternalClerkScrip…!Omit:type<import("@clerk/shared").IsomorphicClerkOptions,'appearance'|keyof import("@clerk/shared").InternalClerkScrip…

🤖 AI review (reclassified as non-breaking) (95%): The only difference between before and after is React.ReactNode vs React$1.ReactNode — both resolve to the same React.ReactNode type; the structural shape of ClerkProviderProps is identical.

Modified: SignInWithMetamaskButton
  SignInWithMetamaskButton: {
-     (props: _clerk_shared_types.Without<WithClerkProp<SignInWithMetamaskButtonProps>, "clerk">): React.JSX.Element | null;
-     displayName: string;
+   (props: _$_clerk_shared__chunks_index_BLglehfM0.jm<WithClerkProp<SignInWithMetamaskButtonProps>, "clerk">): React.JSX.Element | null;
+   displayName: string;
  }

Static analyzer: Breaking change in variable SignInWithMetamaskButton: Type changed: SignInWithMetamaskButton:{(props:import("@clerk/shared").Without<import("@clerk/react").~WithClerkProp<import("@clerk/r…SignInWithMetamaskButton:{(props:!_$_clerk_shared__chunks_index_BLglehfM0.jm:type<import("@clerk/react").~WithClerkProp…

🤖 AI review (reclassified as non-breaking) (90%): The change is from Without<..., 'clerk'> to _$_clerk_shared__chunks_index_BLglehfM0.jm<..., 'clerk'> which is simply a renamed/re-exported alias for the same Without utility type from @clerk/shared; the structural shape of the props parameter is identical, so no well-typed consumer code is affected.

Subpath ./internal

🟡 Non-breaking Changes (1)

Modified: InternalClerkProvider
- InternalClerkProvider: (<TUi extends Ui = Ui>(props: ClerkProviderProps<TUi> & InternalClerkScriptProps) => React.JSX.Element) & {
-     displayName: string;
+ InternalClerkProvider: (<TUi extends Ui = Ui>(props: ClerkProviderProps<TUi> & InternalClerkScriptProps$1) => React.JSX.Element) & {
+   displayName: string;
  }

Static analyzer: Breaking change in variable InternalClerkProvider: Type changed: InternalClerkProvider:(<TUi extends import("@clerk/ui").Ui = import("@clerk/ui").Ui>(props:import("@clerk/react").~Cler…InternalClerkProvider:(<TUi extends import("@clerk/react").Ui = import("@clerk/react").Ui>(props:import("@clerk/react")…

🤖 AI review (reclassified as non-breaking) (85%): The change re-exports Ui and InternalClerkScriptProps from @clerk/react instead of @clerk/ui, but the structural shape of both Ui (as shown in the referenced type definitions) and the function signature remain identical — only the import source of the type alias changed, not the resolved shape.

🟢 Additions (5)

Added: Ui
+ interface Ui<A = any>

Added interface Ui

Added: Ui.__appearanceType
+ __appearanceType?: A;

Added property Ui.__appearanceType

Added: Ui.__brand
+ __brand?: '__clerkUI';

Added property Ui.__brand

Added: Ui.ClerkUI
+ ClerkUI?: ClerkUIConstructor | Promise<ClerkUIConstructor>;

Added property Ui.ClerkUI

Added: Ui.version
+ version?: string;

Added property Ui.version

Subpath ./types

🟡 Non-breaking Changes (1)

Modified: ClerkProviderProps
  type ClerkProviderProps<TUi extends Ui = Ui> = Omit<IsomorphicClerkOptions, 'appearance' | keyof InternalClerkScriptProps> & {
-     children: React.ReactNode;
-     initialState?: InitialState;
-     __internal_bypassMissingPublishableKey?: boolean;
-     appearance?: ExtractAppearanceType<TUi, Appearance>;
-     ui?: TUi;
+   children: React$1.ReactNode;
+   initialState?: InitialState;
+   __internal_bypassMissingPublishableKey?: boolean;
+   appearance?: ExtractAppearanceType<TUi, Appearance>;
+   ui?: TUi;
  };

Static analyzer: Breaking change in type alias ClerkProviderProps: Type changed: !Omit:type<import("@clerk/shared").IsomorphicClerkOptions,'appearance'|keyof import("@clerk/shared").InternalClerkScrip…!Omit:type<import("@clerk/shared").IsomorphicClerkOptions,'appearance'|keyof import("@clerk/shared").InternalClerkScrip…

🤖 AI review (reclassified as non-breaking) (97%): The only textual difference is React.ReactNodeReact$1.ReactNode, which is a module alias rename for the same react package type; the resolved structural shape of ClerkProviderProps is identical for consumers.


@clerk/react-router

Current version: 3.3.3
Recommended bump: MINOR → 3.4.0

🟡 Non-breaking Changes (2)

Modified: OrganizationProfile

- OrganizationProfile: typeof OrganizationProfile$1
+ OrganizationProfile$1: typeof OrganizationProfile

Static analyzer: Breaking change in variable OrganizationProfile: Type changed: OrganizationProfile:typeof import("@clerk/react").OrganizationProfileOrganizationProfile$1:typeof import("@clerk/react").OrganizationProfile

🤖 AI review (reclassified as non-breaking) (95%): This is a purely internal identifier rename (OrganizationProfile vs OrganizationProfile$1) where both aliases resolve to the same type typeof import("@clerk/react").OrganizationProfile; the exported shape and value are structurally identical, so no consumer code is affected.

Modified: UserProfile

- UserProfile: typeof UserProfile$1
+ UserProfile$1: typeof UserProfile

Static analyzer: Breaking change in variable UserProfile: Type changed: UserProfile:typeof import("@clerk/react").UserProfileUserProfile$1:typeof import("@clerk/react").UserProfile

🤖 AI review (reclassified as non-breaking) (95%): This is a purely internal identifier rename (UserProfile vs UserProfile$1) where both aliases resolve to the same type typeof import("@clerk/react").UserProfile; the exported shape and value are structurally identical, so no consumer code is affected.


Note
Report truncated to fit GitHub's comment size limit. 5 more packages (46 changes) omitted from this comment. See the full JSON report (--format json) or the uploaded run artifact for the complete diff.


Report generated by Break Check

Last ran on bca0001. Pushes that change no tracked declarations (no API surface change vs. base) are skipped and don't update this comment.

…shared/types

decodeJwt, verifyJwt, and hasValidSignature wrap their implementations through
withLegacyReturn, leaving an inferred return type. tsc's declaration emit then
resolved Jwt/JwtPayload to their declaration site inside @clerk/shared's bundled,
export-blocked _chunks/* output, so consumers on node16/nodenext/bundler resolution
got an unresolvable module specifier (TS2307) or a silent any. Explicit annotations
pin the emitted reference to the public @clerk/shared/types entrypoint.
Sign up for free to 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.

3 participants