Skip to content

Commit fdccada

Browse files
fix(node): prefer Module#registerHooks instead of Module#register
1 parent f9216b2 commit fdccada

4 files changed

Lines changed: 37 additions & 20 deletions

File tree

packages/@tailwindcss-node/package.json

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,6 @@
2929
"./require-cache": {
3030
"types": "./dist/require-cache.d.ts",
3131
"default": "./dist/require-cache.js"
32-
},
33-
"./esm-cache-loader": {
34-
"types": "./dist/esm-cache.loader.d.mts",
35-
"default": "./dist/esm-cache.loader.mjs"
3632
}
3733
}
3834
},
@@ -46,10 +42,6 @@
4642
"types": "./src/require-cache.ts",
4743
"import": "./src/require-cache.ts",
4844
"require": "./src/require-cache.cts"
49-
},
50-
"./esm-cache-loader": {
51-
"types": "./src/esm-cache.loader.mts",
52-
"default": "./src/esm-cache.loader.mts"
5345
}
5446
},
5547
"dependencies": {
Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,36 @@
1-
import { isBuiltin, type ResolveHook } from 'node:module'
1+
import {
2+
isBuiltin,
3+
type ResolveFnOutput,
4+
type ResolveHook,
5+
type ResolveHookContext,
6+
type ResolveHookSync,
7+
} from 'node:module'
28

39
export let resolve: ResolveHook = async (specifier, context, nextResolve) => {
410
let result = await nextResolve(specifier, context)
11+
return processResolve(context, result)
12+
}
13+
14+
export let resolveSync: ResolveHookSync = (specifier, context, nextResolve) => {
15+
let result = nextResolve(specifier, context)
16+
return processResolve(context, result)
17+
}
518

6-
if (result.url === import.meta.url) return result
7-
if (isBuiltin(result.url)) return result
8-
if (!context.parentURL) return result
19+
function processResolve(context: ResolveHookContext, resolve: ResolveFnOutput) {
20+
if (resolve.url === import.meta.url) return resolve
21+
if (isBuiltin(resolve.url)) return resolve
22+
if (!context.parentURL) return resolve
923

1024
let parent = new URL(context.parentURL)
1125

1226
let id = parent.searchParams.get('id')
13-
if (id === null) return result
27+
if (id === null) return resolve
1428

15-
let url = new URL(result.url)
29+
let url = new URL(resolve.url)
1630
url.searchParams.set('id', id)
1731

1832
return {
19-
...result,
33+
...resolve,
2034
url: `${url}`,
2135
}
2236
}

packages/@tailwindcss-node/src/index.cts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as Module from 'node:module'
22
import { pathToFileURL } from 'node:url'
33
import * as env from './env'
4+
import { resolveSync } from './esm-cache.loader.mjs'
45
export * from './compile'
56
export * from './instrumentation'
67
export * from './normalize-path'
@@ -12,8 +13,14 @@ export { env }
1213
// not necessary.
1314
if (!process.versions.bun) {
1415
// `Module#register` was added in Node v18.19.0 and v20.6.0
16+
// `Module#registerHooks` was added in Node v22.15.0 and v23.5.0 and is the preferred API since v25.9.0,
17+
// runtime-deprecating `Module#register` since v26
1518
//
1619
// Not calling it means that while ESM dependencies don't get reloaded, the
1720
// actual included files will because they cache bust directly via `?id=…`
18-
Module.register?.(pathToFileURL(require.resolve('@tailwindcss/node/esm-cache-loader')))
21+
if (Module.registerHooks) {
22+
Module.registerHooks({ resolve: resolveSync })
23+
} else {
24+
Module.register?.('./esm-cache.loader.mjs', pathToFileURL(__filename))
25+
}
1926
}
Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as Module from 'node:module'
2-
import { pathToFileURL } from 'node:url'
32
import * as env from './env'
3+
import { resolveSync } from './esm-cache.loader.mjs'
44
export * from './compile'
55
export * from './instrumentation'
66
export * from './normalize-path'
@@ -11,11 +11,15 @@ export { env }
1111
// In Bun, ESM modules will also populate `require.cache`, so the module hook is
1212
// not necessary.
1313
if (!process.versions.bun) {
14-
let localRequire = Module.createRequire(import.meta.url)
15-
1614
// `Module#register` was added in Node v18.19.0 and v20.6.0
15+
// `Module#registerHooks` was added in Node v22.15.0 and v23.5.0 and is the preferred API since v25.9.0,
16+
// runtime-deprecating `Module#register` since v26
1717
//
1818
// Not calling it means that while ESM dependencies don't get reloaded, the
1919
// actual included files will because they cache bust directly via `?id=…`
20-
Module.register?.(pathToFileURL(localRequire.resolve('@tailwindcss/node/esm-cache-loader')))
20+
if (Module.registerHooks) {
21+
Module.registerHooks({ resolve: resolveSync })
22+
} else {
23+
Module.register?.('./esm-cache.loader.mjs', import.meta.url)
24+
}
2125
}

0 commit comments

Comments
 (0)