Skip to content

chore(repo): Upgrade to TypeScript 6.0#8177

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

chore(repo): Upgrade to TypeScript 6.0#8177
dstaley wants to merge 52 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 5:04pm

Request Review

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Mar 27, 2026

🦋 Changeset detected

Latest commit: 771f885

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-03T17:08:23.559Z

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_CE5uejGj.ps | null | undefined;
-     sessionId: string | null | undefined;
-     session: _clerk_shared__chunks_index_CE5uejGj.Qo | null | undefined;
-     sessionStatus: "active" | "pending" | undefined;
-     sessionClaims: _clerk_shared__chunks_index_CE5uejGj.to | null | undefined;
-     organization: _clerk_shared__chunks_index_CE5uejGj.xo | null | undefined;
-     orgId: string | null | undefined;
-     orgRole: string | null | undefined;
-     orgSlug: string | null | undefined;
-     orgPermissions: _clerk_shared__chunks_index_CE5uejGj.gm<_clerk_shared__chunks_index_CE5uejGj.co>[] | null | undefined;
-     actor: _clerk_shared__chunks_index_CE5uejGj.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_CE5uejGj.p…$authStore:import("nanostores").ReadableAtom<{userId:string|null|undefined;user:import("@clerk/shared").UserResource|nu…

🤖 AI review (reclassified as non-breaking) (92%): The before/after types are structurally identical — the change is purely a re-export alias rename (private chunk alias _clerk_shared__chunks_index_CE5uejGj.* replaced by public @clerk/shared named exports like UserResource, OrganizationResource, etc.); the resolved shapes are the same, so no well-typed consumer code is affected.

Modified: $organizationStore
- $organizationStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_CE5uejGj.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_CE5uejGj.xo:type|null|undefined>$organizationStore:import("nanostores").ReadableAtom<import("@clerk/shared").OrganizationResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The wrapped type changed only from an internal chunk alias (_clerk_shared__chunks_index_CE5uejGj.xo) to the public @clerk/shared.OrganizationResource; both resolve to the same structural type, so consumers reading the store value are unaffected.

Modified: $userStore
- $userStore: nanostores.ReadableAtom<_clerk_shared__chunks_index_CE5uejGj.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_CE5uejGj.ps:type|null|undefined>$userStore:import("nanostores").ReadableAtom<import("@clerk/shared").UserResource|null|undefined>

🤖 AI review (reclassified as non-breaking) (92%): The wrapped type changed only from an internal chunk alias (_clerk_shared__chunks_index_CE5uejGj.ps) to the public @clerk/shared.UserResource; both resolve to the same structural type, so consumers reading the store value are unaffected.


@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 non-breaking: union member reordering is structurally identical, and NonNullable<boolean | undefined> resolves to boolean, making the return type change purely cosmetic.

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%): NonNullable<JwtPayload | undefined> resolves to JwtPayload, so the return type of verifyJwt is structurally unchanged — the new signature is identical to the old one in terms of the resolved type.


@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 only change is a rename from ClerkClient to ClerkClient$1, which is an internal module alias disambiguation; the resolved structural shape of the type is identical, and clerkClient remains an optional field in an input position.

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 from ClerkClient to ClerkClient$1 is an internal alias rename; the referenced type definition block shows ClerkMiddlewareOptions uses ClerkClient$1 in the current version, and the structural shape of the ClerkClient type is unchanged — only the internal alias name differs. AuthenticateRequestParams is an internal/output-facing type (used as a field in internal processing), so no consumer-authored values are broken.

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 change from clerkClient?: ClerkClient to clerkClient?: ClerkClient$1 is a rename of an internal alias; the structural shape of the underlying ClerkClient type is identical, and since clerkClient remains optional in both versions, no existing consumer code that omits this field is affected, and consumers passing a value would see the same structural type requirement.


@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 type changed from an explicit structural signature to typeof import("@clerk/react").OAuthConsent, but both resolve to the same callable React component shape — a function accepting the same props and returning React.JSX.Element | null with a displayName property — so existing consumer call sites remain valid.


@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) (95%): Both import('h3').H3Event and import('@clerk/nuxt').H3Event refer to the same H3Event type (the nuxt package re-exports it from h3), so the resolved structural shape is identical and no 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) (95%): The H3Event in the return type's function parameter is structurally identical between import('h3').H3Event and import('@clerk/nuxt').H3Event since @clerk/nuxt re-exports H3Event from h3, so no consumer calling the returned function is affected.

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 underlying H3Event type from the h3 package — @clerk/nuxt likely re-exports it — so the structural shape of the parameter is identical and existing callers passing an H3Event are unaffected.


@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) (90%): The only textual difference is React.ReactNode vs React$1.ReactNode, which are aliases for the same type — the structural shape of ClerkProviderProps is identical, so no well-typed consumer code is affected.

Modified: SignInWithMetamaskButton
  SignInWithMetamaskButton: {
-     (props: _clerk_shared_types.Without<WithClerkProp<SignInWithMetamaskButtonProps>, "clerk">): React.JSX.Element | null;
-     displayName: string;
+   (props: _$_clerk_shared__chunks_index_TNda25cs0.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_TNda25cs0.jm:type<import("@clerk/react").~WithClerkProp…

🤖 AI review (reclassified as non-breaking) (85%): _$_clerk_shared__chunks_index_TNda25cs0.jm is a renamed/re-exported alias for the same Without utility type from @clerk/shared; the resolved structural shape of the props parameter is identical, so callers passing Without<WithClerkProp<SignInWithMetamaskButtonProps>, 'clerk'> are unaffected.

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 structural shape of Ui is identical between @clerk/ui and @clerk/react (same interface definition provided), and InternalClerkScriptProps$1 is a renamed alias for InternalClerkScriptProps with the same underlying shape — the change is a module source relocation, not a structural API difference.

🟢 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 difference between the before and after snippets is React.ReactNode vs React$1.ReactNode, which is a module alias rename for the same React 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 rename of an internal alias (OrganizationProfile$1OrganizationProfile) used in the .d.ts bundle; the resolved type typeof import("@clerk/react").OrganizationProfile is structurally identical before and after, so no consumer-observable type change occurs.

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 rename of an internal alias (UserProfile$1UserProfile) used in the .d.ts bundle; the resolved type typeof import("@clerk/react").UserProfile is structurally identical before and after, so no consumer-observable type change occurs.


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 771f885. 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.
Copy link
Copy Markdown
Member

@jacekradko jacekradko left a comment

Choose a reason for hiding this comment

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

:shipit:

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