Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
🌐 Web query:
What is the correct API signature for Module.registerHooks in Node.js v26? Does it accept URLs/specifiers or function references?💡 Result:
The correct API signature for Module.registerHooks in Node.js v26 is: module.registerHooks(options) where options is an Object with optional properties: - resolve {Function|undefined}: resolve hook function with signature resolve(specifier, context, nextResolve) - load {Function|undefined}: load hook function with signature load(url, context, nextLoad) It accepts direct function references for the hooks (synchronous, in-thread), not URLs or specifiers. URLs/specifiers are used by the deprecated module.register(specifier[, parentURL][, options]) API, which registers a module exporting async hooks run on a separate thread. This API was added in v23.5.0 / v22.15.0, reached release candidate status (1.2) by v25.4.0, and remains at that stability in v26 (still pre-release as of 2026-04-05). module.register is being deprecated in favor of registerHooks.
Citations:
🏁 Script executed:
cat -n packages/@tailwindcss-node/src/index.ts | head -30Repository: tailwindlabs/tailwindcss
Length of output: 1240
🏁 Script executed:
fd -e mts -e mjs "esm-cache" packages/@tailwindcss-node/Repository: tailwindlabs/tailwindcss
Length of output: 119
🏁 Script executed:
cat -n packages/@tailwindcss-node/src/esm-cache.loader.mts | head -50Repository: tailwindlabs/tailwindcss
Length of output: 784
🏁 Script executed:
Repository: tailwindlabs/tailwindcss
Length of output: 94
🏁 Script executed:
Repository: tailwindlabs/tailwindcss
Length of output: 1722
Module.registerHooksdoes not support async hooks; useModule.registerfor both code paths.Module.registerHooks(added in Node v26) accepts synchronous hook functions, whereasModule.registeraccepts a module specifier/URL that exports async hooks. The current code incorrectly passes a URL toregisterHooks, but the actual problem runs deeper: theresolvehook inesm-cache.loader.mtsis async and cannot be registered viaregisterHooksat all.The correct fix is to use
Module.registerfor both cases:✅ Recommended fix: Use Module.register consistently
let loaderUrl = pathToFileURL(localRequire.resolve('@tailwindcss/node/esm-cache-loader')) - if (Module.registerHooks) { - Module.registerHooks({ resolve: loaderUrl }) - } else { - Module.register?.(loaderUrl) - } + Module.register?.(loaderUrl)Module.registerworks in Node v18.19.0+ and remains available in v26 alongside the newregisterHooksAPI, so this approach is forward-compatible.📝 Committable suggestion
🤖 Prompt for AI Agents