Skip to content

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

@wobsoriano@jacekradko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
fix(nuxt): follow Nuxt module conventions for server-side imports by wobsoriano · Pull Request #8439 · clerk/javascript · GitHub
Skip to content

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

@wobsoriano@jacekradko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(nuxt): follow Nuxt module conventions for server-side imports by wobsoriano · Pull Request #8439 · clerk/javascript · GitHub
Skip to content

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

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

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

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

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

@wobsoriano@jacekradko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(nuxt): follow Nuxt module conventions for server-side imports by wobsoriano · Pull Request #8439 · clerk/javascript · GitHub
Skip to content

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

@wobsoriano@jacekradko
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' fix(nuxt): follow Nuxt module conventions for server-side imports by wobsoriano · Pull Request #8439 · clerk/javascript · GitHub
Skip to content

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

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

fix(nuxt): follow Nuxt module conventions for server-side imports - #8439

Merged
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430
May 4, 2026
Merged

fix(nuxt): follow Nuxt module conventions for server-side imports#8439
wobsoriano merged 9 commits into
mainfrom
rob/fix-8430

Conversation

@wobsoriano

@wobsorianowobsoriano commented May 1, 2026

Copy link
Copy Markdown
Member

Description

All h3 server runtime symbols (createError, eventHandler, setResponseHeader, etc.) are now imported from '#imports' instead of directly from 'h3'. This matches the convention used by the official Nuxt module builder. Nuxt server files are expected to consume auto-import symbols through '#imports', which Nuxt/Nitro resolves at app build time.

useRuntimeConfig was already imported this way. This change extends the same pattern to all remaining h3 value imports across clerkMiddleware.ts, utils.ts, routeMatcher.ts, and webhooks.ts.

Since h3 is no longer a direct runtime import, it has been moved from dependencies to devDependencies. Any Nuxt app already has h3 transitively via Nuxt itself, so this is non-breaking.

Type safety

To keep import { ... } from '#imports' fully typed during module development (without switching from tsup), a local declaration stub at src/runtime/types/nitro-server.d.ts re-exports the relevant h3 symbols and is mapped via paths["#imports"] in tsconfig.json.

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

vercelBot commented May 1, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
clerk-js-sandboxReadyReadyPreview, CommentMay 3, 2026 7:20pm

Request Review

@changeset-bot

changeset-botBot commented May 1, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: aca7fb2

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

This PR includes changesets to release 1 package
NameType
@clerk/nuxtPatch

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

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

@coderabbitai

coderabbitaiBot commented May 1, 2026

Copy link
Copy Markdown
Contributor

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

Adds a Nuxt #imports TypeScript path alias and a new packages/nuxt/src/runtime/types/nitro-server.d.ts that re-exports selected h3 APIs and declares useRuntimeConfig. Adjusts imports across the server runtime and tests to source h3 helpers and useRuntimeConfig via #imports (removing prior // @ts-expect-error`` workarounds) and updates a Vitest #imports mock to async-import and forward `h3` helpers. Changes middleware typing to use `EventHandler` explicitly. Updates `packages/nuxt/package.json` (downgrade to 2.2.10; moves `h3` to devDependencies), adds tsconfig paths, and creates a changeset. No runtime control flow or exported API behavior changed.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check nameStatusExplanation
Title check✅ PassedThe title clearly and concisely describes the main objective: refactoring server imports to follow Nuxt module conventions by using '#imports' instead of direct 'h3' imports.
Linked Issues check✅ PassedThe PR fully addresses issue #8430 by changing all h3 server-runtime symbol imports from direct 'h3' imports to '#imports' pattern, moving h3 to devDependencies, and adding type safety through nitro-server.d.ts declaration stub.
Out of Scope Changes check✅ PassedAll changes are directly scoped to resolving #8430: import reorganization, package.json dependency classification, test mock updates, tsconfig path configuration, and a changeset entry. No unrelated modifications detected.
Docstring Coverage✅ PassedNo functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description check✅ PassedThe pull request description clearly explains the changes: moving h3 imports to '#imports' convention, moving h3 to devDependencies, and adding a type declaration file for type safety.

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

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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

@pkg-pr-new

pkg-pr-newBot commented May 1, 2026

Copy link
Copy Markdown

Open in StackBlitz

@clerk/astro

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

@clerk/backend

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

@clerk/chrome-extension

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

@clerk/clerk-js

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

@clerk/dev-cli

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

@clerk/expo

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

@clerk/expo-passkeys

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

@clerk/express

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

@clerk/fastify

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

@clerk/hono

npm i https://pkg.pr.new/@clerk/hono@8439

@clerk/localizations

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

@clerk/nextjs

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

@clerk/nuxt

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

@clerk/react

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

@clerk/react-router

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

@clerk/shared

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

@clerk/tanstack-react-start

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

@clerk/testing

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

@clerk/ui

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

@clerk/upgrade

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

@clerk/vue

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

commit: aca7fb2

@wobsoriano

Copy link
Copy Markdown
MemberAuthor

!snapshot

@github-actions

Copy link
Copy Markdown
Contributor

Hey @wobsoriano - the snapshot version command generated the following package versions:

PackageVersion
@clerk/astro3.1.1-snapshot.v20260501171802
@clerk/backend3.4.5-snapshot.v20260501171802
@clerk/chrome-extension3.1.22-snapshot.v20260501171802
@clerk/clerk-js6.8.1-snapshot.v20260501171802
@clerk/dev-cli0.1.1-snapshot.v20260501171802
@clerk/expo3.2.8-snapshot.v20260501171802
@clerk/expo-passkeys1.0.21-snapshot.v20260501171802
@clerk/express2.1.13-snapshot.v20260501171802
@clerk/fastify3.1.23-snapshot.v20260501171802
@clerk/hono0.1.23-snapshot.v20260501171802
@clerk/localizations4.5.9-snapshot.v20260501171802
@clerk/msw0.0.21-snapshot.v20260501171802
@clerk/nextjs7.3.1-snapshot.v20260501171802
@clerk/nuxt2.3.1-snapshot.v20260501171802
@clerk/react6.5.1-snapshot.v20260501171802
@clerk/react-router3.2.1-snapshot.v20260501171802
@clerk/shared4.9.1-snapshot.v20260501171802
@clerk/tanstack-react-start1.2.1-snapshot.v20260501171802
@clerk/testing2.0.25-snapshot.v20260501171802
@clerk/ui1.7.1-snapshot.v20260501171802
@clerk/upgrade2.0.3-snapshot.v20260501171802
@clerk/vue2.1.1-snapshot.v20260501171802

Tip: Use the snippet copy button below to quickly install the required packages.
@clerk/astro

npm i @clerk/astro@3.1.1-snapshot.v20260501171802 --save-exact

@clerk/backend

npm i @clerk/backend@3.4.5-snapshot.v20260501171802 --save-exact

@clerk/chrome-extension

npm i @clerk/chrome-extension@3.1.22-snapshot.v20260501171802 --save-exact

@clerk/clerk-js

npm i @clerk/clerk-js@6.8.1-snapshot.v20260501171802 --save-exact

@clerk/dev-cli

npm i @clerk/dev-cli@0.1.1-snapshot.v20260501171802 --save-exact

@clerk/expo

npm i @clerk/expo@3.2.8-snapshot.v20260501171802 --save-exact

@clerk/expo-passkeys

npm i @clerk/expo-passkeys@1.0.21-snapshot.v20260501171802 --save-exact

@clerk/express

npm i @clerk/express@2.1.13-snapshot.v20260501171802 --save-exact

@clerk/fastify

npm i @clerk/fastify@3.1.23-snapshot.v20260501171802 --save-exact

@clerk/hono

npm i @clerk/hono@0.1.23-snapshot.v20260501171802 --save-exact

@clerk/localizations

npm i @clerk/localizations@4.5.9-snapshot.v20260501171802 --save-exact

@clerk/msw

npm i @clerk/msw@0.0.21-snapshot.v20260501171802 --save-exact

@clerk/nextjs

npm i @clerk/nextjs@7.3.1-snapshot.v20260501171802 --save-exact

@clerk/nuxt

npm i @clerk/nuxt@2.3.1-snapshot.v20260501171802 --save-exact

@clerk/react

npm i @clerk/react@6.5.1-snapshot.v20260501171802 --save-exact

@clerk/react-router

npm i @clerk/react-router@3.2.1-snapshot.v20260501171802 --save-exact

@clerk/shared

npm i @clerk/shared@4.9.1-snapshot.v20260501171802 --save-exact

@clerk/tanstack-react-start

npm i @clerk/tanstack-react-start@1.2.1-snapshot.v20260501171802 --save-exact

@clerk/testing

npm i @clerk/testing@2.0.25-snapshot.v20260501171802 --save-exact

@clerk/ui

npm i @clerk/ui@1.7.1-snapshot.v20260501171802 --save-exact

@clerk/upgrade

npm i @clerk/upgrade@2.0.3-snapshot.v20260501171802 --save-exact

@clerk/vue

npm i @clerk/vue@2.1.1-snapshot.v20260501171802 --save-exact

"@nuxt/schema": "^4.1.3"
},
"devDependencies": {
"h3": "^1.15.4",

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.

Codex flagged h3 type imports that still need to come from direct dependencies. Might want to double check this

This package still exposes public declarations that import H3Event/EventHandler from h3 through @clerk/nuxt/server, @clerk/nuxt/webhooks, and helpers like createRouteMatcher. Moving h3 to devDependencies means strict package-manager installs can leave consumers unable to resolve those published declarations from @clerk/nuxt, even if Nuxt has h3 somewhere transitively. The runtime imports can come from #imports, but the package still needs to declare h3 as a dependency or peer dependency for its public type surface.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

valid concern. Tested on a fresh nuxt app with pnpm/npm/yarn using the snapshot - h3 is always resolved transitively via Nuxt so no peer dep prompt or resolution failure.

Moving back to dependencies would imply we ship our own copy, which isn't accurate. Leaving in devDeps.

Fixes#8430
Imports h3 server runtime symbols from '#imports' (the Nuxt virtual module)
instead of directly from 'h3', matching the convention used by the official
Nuxt module builder. This removes a conflict with Nitro's unimport auto-import
injection, which generated a virtual auto-imports module referencing H3Error,
H3Event, etc. without emitting their import statements when @clerk/nuxt server
files were present in the bundle.
A local type stub (src/runtime/types/nitro-server.d.ts) re-exports the h3
symbols from their real package and is wired up via a paths["#imports"] alias
in tsconfig.json, preserving full type safety during module development without
switching from tsup. The stub is not included in the published dist.
Since no @clerk/nuxt server file has a direct runtime import from 'h3' anymore,
h3 is moved from dependencies to devDependencies. Nuxt apps already have h3 as
a transitive dependency, so this is non-breaking.
@wobsoriano
wobsoriano merged commit 7ea8a0b into mainMay 4, 2026
61 of 74 checks passed
@wobsoriano
wobsoriano deleted the rob/fix-8430 branch May 4, 2026 16:26
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.

2 participants

@wobsoriano@jacekradko