Skip to content

Commit e99bf89

Browse files
fmalJounQin
andauthored
fix: support yarn pnp with node 20 (#175)
Co-authored-by: JounQin <admin@1stg.me>
1 parent e45bfaf commit e99bf89

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

.changeset/polite-rice-fold.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"synckit": patch
3+
---
4+
5+
fix: support yarn pnp with node 20

src/index.ts

+23-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { createHash } from 'node:crypto'
22
import fs from 'node:fs'
3-
import { createRequire } from 'node:module'
3+
import module from 'node:module'
44
import path from 'node:path'
55
import { fileURLToPath, pathToFileURL } from 'node:url'
66
import {
@@ -53,6 +53,8 @@ const {
5353
SYNCKIT_TS_RUNNER,
5454
} = process.env
5555

56+
const IS_NODE_20 = Number(process.versions.node.split('.')[0]) >= 20
57+
5658
export const DEFAULT_TIMEOUT = SYNCKIT_TIMEOUT ? +SYNCKIT_TIMEOUT : undefined
5759

5860
/* istanbul ignore next */
@@ -133,7 +135,7 @@ export function createSyncFn<T extends AnyAsyncFn<R>, R = unknown>(
133135

134136
const cjsRequire =
135137
typeof require === 'undefined'
136-
? createRequire(import.meta.url)
138+
? module.createRequire(import.meta.url)
137139
: /* istanbul ignore next */ require
138140

139141
const dataUrl = (code: string) =>
@@ -252,6 +254,8 @@ const setupTsRunner = (
252254
}
253255
}
254256

257+
let resolvedPnpLoaderPath: string | undefined
258+
255259
/* istanbul ignore if -- https://github.com/facebook/jest/issues/5274 */
256260
if (process.versions.pnp) {
257261
const nodeOptions = NODE_OPTIONS?.split(/\s+/)
@@ -275,8 +279,15 @@ const setupTsRunner = (
275279
// Transform path to file URL because nodejs does not accept
276280
// absolute Windows paths in the --experimental-loader option.
277281
// https://github.com/un-ts/synckit/issues/123
278-
const experimentalLoader = pathToFileURL(pnpLoaderPath).toString()
279-
execArgv = ['--experimental-loader', experimentalLoader, ...execArgv]
282+
resolvedPnpLoaderPath = pathToFileURL(pnpLoaderPath).toString()
283+
284+
if (!IS_NODE_20) {
285+
execArgv = [
286+
'--experimental-loader',
287+
resolvedPnpLoaderPath,
288+
...execArgv,
289+
]
290+
}
280291
}
281292
}
282293
}
@@ -288,6 +299,7 @@ const setupTsRunner = (
288299
tsRunner,
289300
tsUseEsm,
290301
workerPath,
302+
pnpLoaderPath: resolvedPnpLoaderPath,
291303
execArgv,
292304
}
293305
}
@@ -428,6 +440,7 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
428440
tsUseEsm,
429441
tsRunner: finalTsRunner,
430442
workerPath: finalWorkerPath,
443+
pnpLoaderPath,
431444
execArgv: finalExecArgv,
432445
} = setupTsRunner(workerPath, { execArgv, tsRunner })
433446

@@ -501,7 +514,7 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
501514
: workerPathUrl,
502515
{
503516
eval: useEval,
504-
workerData: { sharedBuffer, workerPort },
517+
workerData: { sharedBuffer, workerPort, pnpLoaderPath },
505518
transferList: [workerPort, ...transferList],
506519
execArgv: finalExecArgv,
507520
},
@@ -561,7 +574,11 @@ export function runAsWorker<
561574
return
562575
}
563576

564-
const { workerPort, sharedBuffer } = workerData as WorkerData
577+
const { workerPort, sharedBuffer, pnpLoaderPath } = workerData as WorkerData
578+
579+
if (pnpLoaderPath && IS_NODE_20) {
580+
module.register(pnpLoaderPath)
581+
}
565582

566583
const sharedBufferView = new Int32Array(sharedBuffer, 0, 1)
567584

src/types.ts

+1
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ export interface MainToWorkerMessage<T extends unknown[]> {
2828
export interface WorkerData {
2929
sharedBuffer: SharedArrayBuffer
3030
workerPort: MessagePort
31+
pnpLoaderPath: string | undefined
3132
}
3233

3334
export interface DataMessage<T> {

0 commit comments

Comments
 (0)