@@ -11,7 +11,7 @@ import {
11
11
parentPort ,
12
12
} from 'node:worker_threads'
13
13
14
- import { findUp , tryExtensions } from '@pkgr/utils'
14
+ import { findUp , isPkgAvailable , tryExtensions } from '@pkgr/utils'
15
15
16
16
import {
17
17
AnyAsyncFn ,
@@ -59,8 +59,7 @@ export const DEFAULT_WORKER_BUFFER_SIZE = DEFAULT_BUFFER_SIZE || 1024
59
59
/* istanbul ignore next */
60
60
export const DEFAULT_EXEC_ARGV = SYNCKIT_EXEC_ARGV ?. split ( ',' ) || [ ]
61
61
62
- export const DEFAULT_TS_RUNNER = ( SYNCKIT_TS_RUNNER ||
63
- TsRunner . TsNode ) as TsRunner
62
+ export const DEFAULT_TS_RUNNER = SYNCKIT_TS_RUNNER as TsRunner | undefined
64
63
65
64
export const MTS_SUPPORTED_NODE_VERSION = 16
66
65
@@ -134,15 +133,15 @@ const dataUrl = (code: string) =>
134
133
135
134
export const isFile = ( path : string ) => {
136
135
try {
137
- return fs . statSync ( path ) . isFile ( )
136
+ return ! ! fs . statSync ( path , { throwIfNoEntry : false } ) ? .isFile ( )
138
137
} catch {
139
138
return false
140
139
}
141
140
}
142
141
143
142
const setupTsRunner = (
144
143
workerPath : string ,
145
- { execArgv, tsRunner } : { execArgv : string [ ] ; tsRunner : TsRunner } , // eslint-disable-next-line sonarjs/cognitive-complexity
144
+ { execArgv, tsRunner } : { execArgv : string [ ] ; tsRunner ? : TsRunner } , // eslint-disable-next-line sonarjs/cognitive-complexity
146
145
) => {
147
146
let ext = path . extname ( workerPath )
148
147
@@ -155,15 +154,18 @@ const setupTsRunner = (
155
154
: workerPath
156
155
let extensions : string [ ]
157
156
switch ( ext ) {
158
- case '.cjs' :
157
+ case '.cjs' : {
159
158
extensions = [ '.cts' , '.cjs' ]
160
159
break
161
- case '.mjs' :
160
+ }
161
+ case '.mjs' : {
162
162
extensions = [ '.mts' , '.mjs' ]
163
163
break
164
- default :
164
+ }
165
+ default : {
165
166
extensions = [ '.ts' , '.js' ]
166
167
break
168
+ }
167
169
}
168
170
const found = tryExtensions ( workPathWithoutExt , extensions )
169
171
let differentExt : boolean | undefined
@@ -188,6 +190,11 @@ const setupTsRunner = (
188
190
'module'
189
191
}
190
192
}
193
+
194
+ if ( tsRunner == null && isPkgAvailable ( TsRunner . TsNode ) ) {
195
+ tsRunner = TsRunner . TsNode
196
+ }
197
+
191
198
switch ( tsRunner ) {
192
199
case TsRunner . TsNode : {
193
200
if ( tsUseEsm ) {
@@ -261,6 +268,7 @@ const setupTsRunner = (
261
268
return {
262
269
ext,
263
270
isTs,
271
+ tsRunner,
264
272
tsUseEsm,
265
273
workerPath,
266
274
execArgv,
@@ -283,6 +291,7 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
283
291
isTs,
284
292
ext,
285
293
tsUseEsm,
294
+ tsRunner : finalTsRunner ,
286
295
workerPath : finalWorkerPath ,
287
296
execArgv : finalExecArgv ,
288
297
} = setupTsRunner ( workerPath , { execArgv, tsRunner } )
@@ -293,8 +302,9 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
293
302
const isTsxSupported =
294
303
! tsUseEsm ||
295
304
Number . parseFloat ( process . versions . node ) >= MTS_SUPPORTED_NODE_VERSION
296
- /* istanbul ignore if */
297
- if (
305
+ if ( ! finalTsRunner ) {
306
+ throw new Error ( 'No ts runner specified, ts worker path is not supported' )
307
+ } /* istanbul ignore if */ else if (
298
308
(
299
309
[
300
310
// https://github.com/egoist/esbuild-register/issues/79
@@ -305,10 +315,10 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
305
315
TsRunner . SWC ,
306
316
.../* istanbul ignore next */ ( isTsxSupported ? [ ] : [ TsRunner . TSX ] ) ,
307
317
] as TsRunner [ ]
308
- ) . includes ( tsRunner )
318
+ ) . includes ( finalTsRunner )
309
319
) {
310
320
throw new Error (
311
- `${ tsRunner } is not supported for ${ ext } files yet` +
321
+ `${ finalTsRunner } is not supported for ${ ext } files yet` +
312
322
( isTsxSupported
313
323
? ', you can try [tsx](https://github.com/esbuild-kit/tsx) instead'
314
324
: '' ) ,
@@ -322,7 +332,8 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
322
332
tsUseEsm && tsRunner === TsRunner . TsNode
323
333
? dataUrl ( `import '${ String ( workerPathUrl ) } '` )
324
334
: useEval
325
- ? `require('${ finalWorkerPath . replace ( / \\ / g, '\\\\' ) } ')`
335
+ ? // eslint-disable-next-line unicorn/prefer-string-replace-all -- compatibility
336
+ `require('${ finalWorkerPath . replace ( / \\ / g, '\\\\' ) } ')`
326
337
: workerPathUrl ,
327
338
{
328
339
eval : useEval ,
@@ -387,46 +398,22 @@ export function runAsWorker<
387
398
388
399
const { workerPort } = workerData as WorkerData
389
400
390
- try {
391
- parentPort ! . on (
392
- 'message' ,
393
- ( { sharedBuffer, id, args } : MainToWorkerMessage < Parameters < T > > ) => {
394
- // eslint-disable-next-line @typescript-eslint/no-floating-promises
395
- ; ( async ( ) => {
396
- const sharedBufferView = new Int32Array ( sharedBuffer )
397
- let msg : WorkerToMainMessage < R >
398
- try {
399
- msg = { id, result : await fn ( ...args ) }
400
- } catch ( error : unknown ) {
401
- msg = { id, error, properties : extractProperties ( error ) }
402
- }
403
- workerPort . postMessage ( msg )
404
- Atomics . add ( sharedBufferView , 0 , 1 )
405
- Atomics . notify ( sharedBufferView , 0 )
406
- } ) ( )
407
- } ,
408
- )
409
-
410
- /**
411
- * @see https://github.com/un-ts/synckit/issues/94
412
- *
413
- * Starting the worker can fail, due to syntax error, for example. In that case
414
- * we just fail all incoming messages with whatever error message we got.
415
- * Otherwise incoming messages will hang forever waiting for a reply.
416
- */
417
- } catch ( error ) {
418
- parentPort ! . on (
419
- 'message' ,
420
- ( { sharedBuffer, id } : MainToWorkerMessage < Parameters < T > > ) => {
401
+ parentPort ! . on (
402
+ 'message' ,
403
+ ( { sharedBuffer, id, args } : MainToWorkerMessage < Parameters < T > > ) => {
404
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
405
+ ; ( async ( ) => {
421
406
const sharedBufferView = new Int32Array ( sharedBuffer )
422
- workerPort . postMessage ( {
423
- id,
424
- error,
425
- properties : extractProperties ( error ) ,
426
- } )
407
+ let msg : WorkerToMainMessage < R >
408
+ try {
409
+ msg = { id, result : await fn ( ...args ) }
410
+ } catch ( error : unknown ) {
411
+ msg = { id, error, properties : extractProperties ( error ) }
412
+ }
413
+ workerPort . postMessage ( msg )
427
414
Atomics . add ( sharedBufferView , 0 , 1 )
428
415
Atomics . notify ( sharedBufferView , 0 )
429
- } ,
430
- )
431
- }
416
+ } ) ( )
417
+ } ,
418
+ )
432
419
}
0 commit comments