From 92ca5ac2435aaf3f69002089072f2f0b40b76816 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 00:59:50 +0100 Subject: [PATCH 01/26] feat: add support for node type stripping --- src/index.ts | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/src/index.ts b/src/index.ts index 9b991f700..ae655f054 100644 --- a/src/index.ts +++ b/src/index.ts @@ -33,6 +33,8 @@ const INT32_BYTES = 4 export * from './types.js' export const TsRunner = { + // https://nodejs.org/docs/latest/api/typescript.html#type-stripping + Node: 'node', // https://github.com/TypeStrong/ts-node TsNode: 'ts-node', // https://github.com/egoist/esbuild-register @@ -55,7 +57,8 @@ const { SYNCKIT_TS_RUNNER, } = process.env -const IS_NODE_20 = Number(process.versions.node.split('.')[0]) >= 20 +const NODE_VERSION = parseFloat(process.versions.node); +const IS_TYPE_STRIPPING_ENABLED = (NODE_VERSION >= 23 && !NODE_OPTIONS?.includes('--no-experimental-strip-types')) || (NODE_VERSION >= 22 && NODE_OPTIONS?.includes('--experimental-strip-types')); export const DEFAULT_TIMEOUT = SYNCKIT_TIMEOUT ? +SYNCKIT_TIMEOUT : undefined @@ -80,8 +83,6 @@ export const DEFAULT_GLOBAL_SHIMS_PRESET: GlobalShim[] = [ }, ] -export const MTS_SUPPORTED_NODE_VERSION = 16 - let syncFnCache: Map | undefined export interface SynckitOptions { @@ -205,11 +206,17 @@ const setupTsRunner = ( } } - if (tsRunner == null && isPkgAvailable(TsRunner.TsNode)) { - tsRunner = TsRunner.TsNode + if (tsRunner == null && IS_TYPE_STRIPPING_ENABLED) { + tsRunner = TsRunner.Node; + } + else if (tsRunner == null && isPkgAvailable(TsRunner.TsNode)) { + tsRunner = TsRunner.TsNode; } switch (tsRunner) { + case TsRunner.Node: { + break; + } case TsRunner.TsNode: { if (tsUseEsm) { if (!execArgv.includes('--loader')) { @@ -245,7 +252,7 @@ const setupTsRunner = ( break } default: { - throw new Error(`Unknown ts runner: ${String(tsRunner)}`) + if (!)throw new Error(`Unknown ts runner: ${String(tsRunner)}`) } } } else if (!jsUseEsm) { @@ -283,7 +290,7 @@ const setupTsRunner = ( // https://github.com/un-ts/synckit/issues/123 resolvedPnpLoaderPath = pathToFileURL(pnpLoaderPath).toString() - if (!IS_NODE_20) { + if (!NODE_VERSION >= 20) { execArgv = [ '--experimental-loader', resolvedPnpLoaderPath, @@ -453,7 +460,7 @@ function startWorkerThread>( if (/\.[cm]ts$/.test(finalWorkerPath)) { const isTsxSupported = !tsUseEsm || - Number.parseFloat(process.versions.node) >= MTS_SUPPORTED_NODE_VERSION + Number.parseFloat(process.versions.node) >= 16 /* istanbul ignore if */ if (!finalTsRunner) { throw new Error('No ts runner specified, ts worker path is not supported') @@ -604,7 +611,7 @@ export function runAsWorker< const { workerPort, sharedBuffer, pnpLoaderPath } = workerData as WorkerData - if (pnpLoaderPath && IS_NODE_20) { + if (pnpLoaderPath && NODE_VERSION >= 20) { module.register(pnpLoaderPath) } From 8ce69cc320cc0985f7d6cb3f35ac6952b6b11acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 01:01:11 +0100 Subject: [PATCH 02/26] fix: remove typo --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index ae655f054..1dce810c0 100644 --- a/src/index.ts +++ b/src/index.ts @@ -252,7 +252,7 @@ const setupTsRunner = ( break } default: { - if (!)throw new Error(`Unknown ts runner: ${String(tsRunner)}`) + throw new Error(`Unknown ts runner: ${String(tsRunner)}`) } } } else if (!jsUseEsm) { From 01b4813ce7f9d66087070835899a15378ed21475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 01:09:02 +0100 Subject: [PATCH 03/26] fix: type error --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 1dce810c0..6f84e9e13 100644 --- a/src/index.ts +++ b/src/index.ts @@ -290,7 +290,7 @@ const setupTsRunner = ( // https://github.com/un-ts/synckit/issues/123 resolvedPnpLoaderPath = pathToFileURL(pnpLoaderPath).toString() - if (!NODE_VERSION >= 20) { + if (!(NODE_VERSION >= 20)) { execArgv = [ '--experimental-loader', resolvedPnpLoaderPath, From c9558fec3697afb16a806cfa7a5f72f93cf0ad22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 11:09:50 +0100 Subject: [PATCH 04/26] chore: review comments [no ci] Co-authored-by: JounQin --- src/index.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/index.ts b/src/index.ts index 6f84e9e13..b53958d2c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -206,11 +206,12 @@ const setupTsRunner = ( } } - if (tsRunner == null && IS_TYPE_STRIPPING_ENABLED) { + if (tsRunner == null) { + if (IS_TYPE_STRIPPING_ENABLED) { tsRunner = TsRunner.Node; - } - else if (tsRunner == null && isPkgAvailable(TsRunner.TsNode)) { + } else if (isPkgAvailable(TsRunner.TsNode)) { tsRunner = TsRunner.TsNode; + } } switch (tsRunner) { From e84bfbdc604a36d188bdbcfb4462d057fa92d5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 11:11:36 +0100 Subject: [PATCH 05/26] chore: review comments [no ci] Co-authored-by: JounQin --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index b53958d2c..a85b82ec5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -57,7 +57,7 @@ const { SYNCKIT_TS_RUNNER, } = process.env -const NODE_VERSION = parseFloat(process.versions.node); +const NODE_VERSION = Number.parseFloat(process.versions.node); const IS_TYPE_STRIPPING_ENABLED = (NODE_VERSION >= 23 && !NODE_OPTIONS?.includes('--no-experimental-strip-types')) || (NODE_VERSION >= 22 && NODE_OPTIONS?.includes('--experimental-strip-types')); export const DEFAULT_TIMEOUT = SYNCKIT_TIMEOUT ? +SYNCKIT_TIMEOUT : undefined From 9955f1daa2d50f6277df006e0867a54fd6ee9aa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:59:17 +0100 Subject: [PATCH 06/26] chore: review comments --- src/index.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/index.ts b/src/index.ts index a85b82ec5..994eb734d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -83,6 +83,9 @@ export const DEFAULT_GLOBAL_SHIMS_PRESET: GlobalShim[] = [ }, ] +export const MTS_SUPPORTED_NODE_VERSION = 16 +export const LOADER_SUPPORTED_NODE_VERSION = 20 + let syncFnCache: Map | undefined export interface SynckitOptions { @@ -291,7 +294,7 @@ const setupTsRunner = ( // https://github.com/un-ts/synckit/issues/123 resolvedPnpLoaderPath = pathToFileURL(pnpLoaderPath).toString() - if (!(NODE_VERSION >= 20)) { + if (!(NODE_VERSION >= LOADER_SUPPORTED_NODE_VERSION)) { execArgv = [ '--experimental-loader', resolvedPnpLoaderPath, @@ -459,9 +462,7 @@ function startWorkerThread>( const workerPathUrl = pathToFileURL(finalWorkerPath) if (/\.[cm]ts$/.test(finalWorkerPath)) { - const isTsxSupported = - !tsUseEsm || - Number.parseFloat(process.versions.node) >= 16 + const isTsxSupported = !tsUseEsm || NODE_VERSION >= MTS_SUPPORTED_NODE_VERSION /* istanbul ignore if */ if (!finalTsRunner) { throw new Error('No ts runner specified, ts worker path is not supported') @@ -612,7 +613,7 @@ export function runAsWorker< const { workerPort, sharedBuffer, pnpLoaderPath } = workerData as WorkerData - if (pnpLoaderPath && NODE_VERSION >= 20) { + if (pnpLoaderPath && NODE_VERSION >= LOADER_SUPPORTED_NODE_VERSION) { module.register(pnpLoaderPath) } From 15daf6f91c6f1b81caccca44cfe607360e162204 Mon Sep 17 00:00:00 2001 From: JounQin Date: Wed, 19 Mar 2025 22:17:03 +0800 Subject: [PATCH 07/26] Update src/index.ts --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 994eb734d..592595a88 100644 --- a/src/index.ts +++ b/src/index.ts @@ -294,7 +294,7 @@ const setupTsRunner = ( // https://github.com/un-ts/synckit/issues/123 resolvedPnpLoaderPath = pathToFileURL(pnpLoaderPath).toString() - if (!(NODE_VERSION >= LOADER_SUPPORTED_NODE_VERSION)) { + if (NODE_VERSION < LOADER_SUPPORTED_NODE_VERSION) { execArgv = [ '--experimental-loader', resolvedPnpLoaderPath, From 644ff4f4a8db62bcd4d7cb49fc04f96b76f496e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:08:01 +0100 Subject: [PATCH 08/26] chore: review comments & argv detection --- src/index.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 592595a88..aca119b08 100644 --- a/src/index.ts +++ b/src/index.ts @@ -58,7 +58,11 @@ const { } = process.env const NODE_VERSION = Number.parseFloat(process.versions.node); -const IS_TYPE_STRIPPING_ENABLED = (NODE_VERSION >= 23 && !NODE_OPTIONS?.includes('--no-experimental-strip-types')) || (NODE_VERSION >= 22 && NODE_OPTIONS?.includes('--experimental-strip-types')); +const IS_TYPE_STRIPPING_ENABLED = ( + NODE_VERSION >= 23 && !(NODE_OPTIONS?.includes('--no-experimental-strip-types') || process.argv.includes('--no-experimental-strip-types')) +) || ( + NODE_VERSION >= 22 && (NODE_OPTIONS?.includes('--experimental-strip-types') || process.argv.includes('--experimental-strip-types')) +); export const DEFAULT_TIMEOUT = SYNCKIT_TIMEOUT ? +SYNCKIT_TIMEOUT : undefined @@ -219,6 +223,7 @@ const setupTsRunner = ( switch (tsRunner) { case TsRunner.Node: { + execArgv = ['--experimental-strip-types', ...execArgv.filter(arg => arg !== '--no-experimental-strip-types')] break; } case TsRunner.TsNode: { From a49d3672bb2da409566f6e0abedc6f7b3e894a3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:12:28 +0100 Subject: [PATCH 09/26] chore: prettier formatting --- src/index.ts | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/index.ts b/src/index.ts index aca119b08..cd256520f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -57,12 +57,17 @@ const { SYNCKIT_TS_RUNNER, } = process.env -const NODE_VERSION = Number.parseFloat(process.versions.node); +export const MTS_SUPPORTED_NODE_VERSION = 16 +export const LOADER_SUPPORTED_NODE_VERSION = 20 +export const STRIP_TYPES_DEFAULT_NODE_VERSION = 23 +export const STRIP_TYPES_SUPPORTED_NODE_VERSION = 22 + +const NODE_VERSION = Number.parseFloat(process.versions.node) const IS_TYPE_STRIPPING_ENABLED = ( - NODE_VERSION >= 23 && !(NODE_OPTIONS?.includes('--no-experimental-strip-types') || process.argv.includes('--no-experimental-strip-types')) + NODE_VERSION >= STRIP_TYPES_DEFAULT_NODE_VERSION && !(NODE_OPTIONS?.includes('--no-experimental-strip-types') || process.argv.includes('--no-experimental-strip-types')) ) || ( - NODE_VERSION >= 22 && (NODE_OPTIONS?.includes('--experimental-strip-types') || process.argv.includes('--experimental-strip-types')) -); + NODE_VERSION >= STRIP_TYPES_SUPPORTED_NODE_VERSION && (NODE_OPTIONS?.includes('--experimental-strip-types') || process.argv.includes('--experimental-strip-types')) +) export const DEFAULT_TIMEOUT = SYNCKIT_TIMEOUT ? +SYNCKIT_TIMEOUT : undefined @@ -87,9 +92,6 @@ export const DEFAULT_GLOBAL_SHIMS_PRESET: GlobalShim[] = [ }, ] -export const MTS_SUPPORTED_NODE_VERSION = 16 -export const LOADER_SUPPORTED_NODE_VERSION = 20 - let syncFnCache: Map | undefined export interface SynckitOptions { @@ -217,14 +219,14 @@ const setupTsRunner = ( if (IS_TYPE_STRIPPING_ENABLED) { tsRunner = TsRunner.Node; } else if (isPkgAvailable(TsRunner.TsNode)) { - tsRunner = TsRunner.TsNode; + tsRunner = TsRunner.TsNode } } switch (tsRunner) { case TsRunner.Node: { execArgv = ['--experimental-strip-types', ...execArgv.filter(arg => arg !== '--no-experimental-strip-types')] - break; + break } case TsRunner.TsNode: { if (tsUseEsm) { @@ -467,7 +469,8 @@ function startWorkerThread>( const workerPathUrl = pathToFileURL(finalWorkerPath) if (/\.[cm]ts$/.test(finalWorkerPath)) { - const isTsxSupported = !tsUseEsm || NODE_VERSION >= MTS_SUPPORTED_NODE_VERSION + const isTsxSupported = + !tsUseEsm || NODE_VERSION >= MTS_SUPPORTED_NODE_VERSION /* istanbul ignore if */ if (!finalTsRunner) { throw new Error('No ts runner specified, ts worker path is not supported') From 8ad85edafce72704cb20965104b7c331643d6ced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 16:37:48 +0100 Subject: [PATCH 10/26] chore: prettier formatting --- src/index.ts | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/index.ts b/src/index.ts index cd256520f..00a97b90b 100644 --- a/src/index.ts +++ b/src/index.ts @@ -63,11 +63,17 @@ export const STRIP_TYPES_DEFAULT_NODE_VERSION = 23 export const STRIP_TYPES_SUPPORTED_NODE_VERSION = 22 const NODE_VERSION = Number.parseFloat(process.versions.node) -const IS_TYPE_STRIPPING_ENABLED = ( - NODE_VERSION >= STRIP_TYPES_DEFAULT_NODE_VERSION && !(NODE_OPTIONS?.includes('--no-experimental-strip-types') || process.argv.includes('--no-experimental-strip-types')) -) || ( - NODE_VERSION >= STRIP_TYPES_SUPPORTED_NODE_VERSION && (NODE_OPTIONS?.includes('--experimental-strip-types') || process.argv.includes('--experimental-strip-types')) -) +const STRIP_TYPES_FLAG = '--experimental-strip-types' +const NO_STRIP_TYPES_FLAG = '--no-experimental-strip-types' +const IS_TYPE_STRIPPING_ENABLED = + (NODE_VERSION >= STRIP_TYPES_DEFAULT_NODE_VERSION && + !( + NODE_OPTIONS?.includes(NO_STRIP_TYPES_FLAG) || + process.argv.includes(NO_STRIP_TYPES_FLAG) + )) || + (NODE_VERSION >= STRIP_TYPES_SUPPORTED_NODE_VERSION && + (NODE_OPTIONS?.includes(STRIP_TYPES_FLAG) || + process.argv.includes(STRIP_TYPES_FLAG))) export const DEFAULT_TIMEOUT = SYNCKIT_TIMEOUT ? +SYNCKIT_TIMEOUT : undefined @@ -217,7 +223,7 @@ const setupTsRunner = ( if (tsRunner == null) { if (IS_TYPE_STRIPPING_ENABLED) { - tsRunner = TsRunner.Node; + tsRunner = TsRunner.Node } else if (isPkgAvailable(TsRunner.TsNode)) { tsRunner = TsRunner.TsNode } @@ -225,7 +231,10 @@ const setupTsRunner = ( switch (tsRunner) { case TsRunner.Node: { - execArgv = ['--experimental-strip-types', ...execArgv.filter(arg => arg !== '--no-experimental-strip-types')] + execArgv = [ + STRIP_TYPES_FLAG, + ...execArgv.filter(arg => arg !== NO_STRIP_TYPES_FLAG), + ] break } case TsRunner.TsNode: { @@ -469,7 +478,7 @@ function startWorkerThread>( const workerPathUrl = pathToFileURL(finalWorkerPath) if (/\.[cm]ts$/.test(finalWorkerPath)) { - const isTsxSupported = + const isTsxSupported = !tsUseEsm || NODE_VERSION >= MTS_SUPPORTED_NODE_VERSION /* istanbul ignore if */ if (!finalTsRunner) { From 0c32d5106ddbf122de368dd8fca1bcf20b994318 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 17:30:27 +0100 Subject: [PATCH 11/26] chore: prettier formatting --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 00a97b90b..8108f373f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -232,7 +232,7 @@ const setupTsRunner = ( switch (tsRunner) { case TsRunner.Node: { execArgv = [ - STRIP_TYPES_FLAG, + STRIP_TYPES_FLAG, ...execArgv.filter(arg => arg !== NO_STRIP_TYPES_FLAG), ] break From 2651e6424d0f19a34ce0d25122a0eb74ee6a3f8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 17:47:22 +0100 Subject: [PATCH 12/26] feat: add test case --- test/ts-runner.spec.ts | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/test/ts-runner.spec.ts b/test/ts-runner.spec.ts index 813fe5b02..9f9391fd6 100644 --- a/test/ts-runner.spec.ts +++ b/test/ts-runner.spec.ts @@ -7,7 +7,11 @@ import { jest } from '@jest/globals' import { _dirname, nodeVersion, tsUseEsmSupported } from './helpers.js' import type { AsyncWorkerFn } from './types.js' -import { MTS_SUPPORTED_NODE_VERSION, TsRunner } from 'synckit' +import { + MTS_SUPPORTED_NODE_VERSION, + STRIP_TYPES_SUPPORTED_NODE_VERSION, + TsRunner, +} from 'synckit' beforeEach(() => { jest.resetModules() @@ -130,6 +134,38 @@ test(TsRunner.TSX, async () => { expect(syncFn(5)).toBe(5) }) +test(TsRunner.Node, async () => { + const { createSyncFn } = await import('synckit') + + let syncFn = createSyncFn(workerJsPath, { + tsRunner: TsRunner.Node, + }) + expect(syncFn(1)).toBe(1) + expect(syncFn(2)).toBe(2) + expect(syncFn(5)).toBe(5) + + if (nodeVersion < STRIP_TYPES_SUPPORTED_NODE_VERSION) { + // eslint-disable-next-line jest/no-conditional-expect + expect(() => + createSyncFn(workerMtsPath, { + tsRunner: TsRunner.Node, + }), + ).toThrow('type stripping is not supported in this node version') + return + } + + if (!tsUseEsmSupported) { + return + } + + syncFn = createSyncFn(workerMtsPath, { + tsRunner: TsRunner.Node, + }) + expect(syncFn(1)).toBe(1) + expect(syncFn(2)).toBe(2) + expect(syncFn(5)).toBe(5) +}) + test('unknown ts runner', async () => { const { createSyncFn } = await import('synckit') From 246809df1b06254b53dbf0e11619d6879329505d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 17:50:21 +0100 Subject: [PATCH 13/26] feat: add node version safeguard --- src/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/index.ts b/src/index.ts index 8108f373f..f6e722ec2 100644 --- a/src/index.ts +++ b/src/index.ts @@ -231,6 +231,9 @@ const setupTsRunner = ( switch (tsRunner) { case TsRunner.Node: { + if (NODE_VERSION < STRIP_TYPES_SUPPORTED_NODE_VERSION) { + throw new Error(`type stripping is not supported in this node version`) + } execArgv = [ STRIP_TYPES_FLAG, ...execArgv.filter(arg => arg !== NO_STRIP_TYPES_FLAG), From f1b817535c63820131f54e4e8e4fd02730780429 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 17:58:04 +0100 Subject: [PATCH 14/26] chore: prettier formatting --- src/index.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index f6e722ec2..f91680ca7 100644 --- a/src/index.ts +++ b/src/index.ts @@ -232,7 +232,9 @@ const setupTsRunner = ( switch (tsRunner) { case TsRunner.Node: { if (NODE_VERSION < STRIP_TYPES_SUPPORTED_NODE_VERSION) { - throw new Error(`type stripping is not supported in this node version`) + throw new Error( + 'type stripping is not supported in this node version', + ) } execArgv = [ STRIP_TYPES_FLAG, From 3614dd3a32236d02306bacd637dbfabf6a3ba627 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:24:26 +0100 Subject: [PATCH 15/26] fix: apply flag conditionally --- src/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/index.ts b/src/index.ts index f91680ca7..2c1e0d0ce 100644 --- a/src/index.ts +++ b/src/index.ts @@ -236,10 +236,10 @@ const setupTsRunner = ( 'type stripping is not supported in this node version', ) } - execArgv = [ - STRIP_TYPES_FLAG, - ...execArgv.filter(arg => arg !== NO_STRIP_TYPES_FLAG), - ] + execArgv = + NODE_VERSION >= STRIP_TYPES_DEFAULT_NODE_VERSION + ? execArgv.filter((arg) => arg !== NO_STRIP_TYPES_FLAG) + : [STRIP_TYPES_FLAG, ...execArgv] break } case TsRunner.TsNode: { From aa8f01c4b6532f31639b1a991ae7cc0fd317fe83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:31:07 +0100 Subject: [PATCH 16/26] fix: runner test case --- test/ts-runner.spec.ts | 24 +++++++++--------------- 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/test/ts-runner.spec.ts b/test/ts-runner.spec.ts index 9f9391fd6..31d69c9f0 100644 --- a/test/ts-runner.spec.ts +++ b/test/ts-runner.spec.ts @@ -137,30 +137,24 @@ test(TsRunner.TSX, async () => { test(TsRunner.Node, async () => { const { createSyncFn } = await import('synckit') - let syncFn = createSyncFn(workerJsPath, { - tsRunner: TsRunner.Node, - }) - expect(syncFn(1)).toBe(1) - expect(syncFn(2)).toBe(2) - expect(syncFn(5)).toBe(5) - if (nodeVersion < STRIP_TYPES_SUPPORTED_NODE_VERSION) { // eslint-disable-next-line jest/no-conditional-expect - expect(() => - createSyncFn(workerMtsPath, { - tsRunner: TsRunner.Node, - }), - ).toThrow('type stripping is not supported in this node version') + expect(() => createSyncFn(workerMtsPath)).toThrow( + 'type stripping is not supported in this node version', + ) return } + let syncFn = createSyncFn(workerJsPath) + expect(syncFn(1)).toBe(1) + expect(syncFn(2)).toBe(2) + expect(syncFn(5)).toBe(5) + if (!tsUseEsmSupported) { return } - syncFn = createSyncFn(workerMtsPath, { - tsRunner: TsRunner.Node, - }) + syncFn = createSyncFn(workerMtsPath) expect(syncFn(1)).toBe(1) expect(syncFn(2)).toBe(2) expect(syncFn(5)).toBe(5) From a7f2a2e1654fa8be79967826d48732b1df900947 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:33:10 +0100 Subject: [PATCH 17/26] fix: node test runner test case --- test/ts-runner.spec.ts | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/test/ts-runner.spec.ts b/test/ts-runner.spec.ts index 31d69c9f0..2d1b26aca 100644 --- a/test/ts-runner.spec.ts +++ b/test/ts-runner.spec.ts @@ -139,9 +139,11 @@ test(TsRunner.Node, async () => { if (nodeVersion < STRIP_TYPES_SUPPORTED_NODE_VERSION) { // eslint-disable-next-line jest/no-conditional-expect - expect(() => createSyncFn(workerMtsPath)).toThrow( - 'type stripping is not supported in this node version', - ) + expect(() => + createSyncFn(workerMtsPath, { + tsRunner: TsRunner.Node, + }), + ).toThrow('type stripping is not supported in this node version') return } From 87a01775aafe7bbd86e9c79efdccb03ec4faf154 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 18:35:59 +0100 Subject: [PATCH 18/26] chore: prettier formatting --- src/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/index.ts b/src/index.ts index 2c1e0d0ce..e0035c6cf 100644 --- a/src/index.ts +++ b/src/index.ts @@ -238,7 +238,7 @@ const setupTsRunner = ( } execArgv = NODE_VERSION >= STRIP_TYPES_DEFAULT_NODE_VERSION - ? execArgv.filter((arg) => arg !== NO_STRIP_TYPES_FLAG) + ? execArgv.filter(arg => arg !== NO_STRIP_TYPES_FLAG) : [STRIP_TYPES_FLAG, ...execArgv] break } From 0cf4a10212dab0bdcccb057d0c82e0d2e47618e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 19:00:43 +0100 Subject: [PATCH 19/26] chore: remove codecov limitation --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5ecccf61d..b7b5ca277 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -57,6 +57,5 @@ jobs: - name: Codecov uses: codecov/codecov-action@v5 - if: ${{ matrix.node == 18 || matrix.node == 18.18 }} with: token: ${{ secrets.CODECOV_TOKEN }} From 515779c18ad0ec9ad927607089355604ccf34321 Mon Sep 17 00:00:00 2001 From: JounQin Date: Thu, 20 Mar 2025 02:56:03 +0800 Subject: [PATCH 20/26] Create good-walls-brush.md --- .changeset/good-walls-brush.md | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .changeset/good-walls-brush.md diff --git a/.changeset/good-walls-brush.md b/.changeset/good-walls-brush.md new file mode 100644 index 000000000..d1f4ef5d3 --- /dev/null +++ b/.changeset/good-walls-brush.md @@ -0,0 +1,18 @@ +--- +"synckit": minor +--- + +feat: add support for `--experimental-strip-types` + +A new ts runner `node`is added: + +- when running on Node 22 with `--experimental-strip-types` +flag enabled via `NODE_OPTIPNS` env or cli args +- or when running on Node 23+ without `--no-experimental-strip-types` +flag enabled via `NODE_OPTIPNS` env or cli args + +The default ts runner will be `node`. + +When enable `node` runner on unsupported versions (<22), an error will be thrown. + +On unsupported node versions, the default runner is still be `ts-node` when it's available. From e569c75f4c672d972a14d6763e00684454d1b3da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:34:04 +0100 Subject: [PATCH 21/26] fix: changeset review --- .changeset/good-walls-brush.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/.changeset/good-walls-brush.md b/.changeset/good-walls-brush.md index d1f4ef5d3..01c53647a 100644 --- a/.changeset/good-walls-brush.md +++ b/.changeset/good-walls-brush.md @@ -1,18 +1,18 @@ --- -"synckit": minor +'synckit': minor --- feat: add support for `--experimental-strip-types` -A new ts runner `node`is added: +Introducing the `node` runner, which will replace `ts-node` as the new default: -- when running on Node 22 with `--experimental-strip-types` -flag enabled via `NODE_OPTIPNS` env or cli args +- when running on Node 22 with the `--experimental-strip-types` + flag enabled via `NODE_OPTIONS` env or cli args +- when running on Node 22 with the `--experimental-strip-types` + flag enabled via `NODE_OPTIONS` env or cli args - or when running on Node 23+ without `--no-experimental-strip-types` -flag enabled via `NODE_OPTIPNS` env or cli args + flag enabled via `NODE_OPTIONS` env or cli args -The default ts runner will be `node`. +An error will be thrown when attempting to run `node` on unsupported versions (<22). -When enable `node` runner on unsupported versions (<22), an error will be thrown. - -On unsupported node versions, the default runner is still be `ts-node` when it's available. +On unsupported node versions, the default runner remains `ts-node` if available. From 66da8b51f262bcd5e52a797b1c081ed40a5bd83b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:42:59 +0100 Subject: [PATCH 22/26] chore: prettier formatting --- .changeset/good-walls-brush.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.changeset/good-walls-brush.md b/.changeset/good-walls-brush.md index 01c53647a..a762a3fb9 100644 --- a/.changeset/good-walls-brush.md +++ b/.changeset/good-walls-brush.md @@ -1,5 +1,5 @@ --- -'synckit': minor +"synckit": minor --- feat: add support for `--experimental-strip-types` @@ -13,6 +13,5 @@ Introducing the `node` runner, which will replace `ts-node` as the new default: - or when running on Node 23+ without `--no-experimental-strip-types` flag enabled via `NODE_OPTIONS` env or cli args -An error will be thrown when attempting to run `node` on unsupported versions (<22). - -On unsupported node versions, the default runner remains `ts-node` if available. +An error will be thrown when attempting to run with `node` on unsupported versions (<22). +On these versions, the default runner remains `ts-node` when available. From 04a24702f156fa7afc06d88f7d32626d87325def Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 20:44:11 +0100 Subject: [PATCH 23/26] fix: duplicate --- .changeset/good-walls-brush.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/.changeset/good-walls-brush.md b/.changeset/good-walls-brush.md index a762a3fb9..df38d26ca 100644 --- a/.changeset/good-walls-brush.md +++ b/.changeset/good-walls-brush.md @@ -6,8 +6,6 @@ feat: add support for `--experimental-strip-types` Introducing the `node` runner, which will replace `ts-node` as the new default: -- when running on Node 22 with the `--experimental-strip-types` - flag enabled via `NODE_OPTIONS` env or cli args - when running on Node 22 with the `--experimental-strip-types` flag enabled via `NODE_OPTIONS` env or cli args - or when running on Node 23+ without `--no-experimental-strip-types` From 6ed663edd4114febc006f129c2dccc38b81a682d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Wed, 19 Mar 2025 21:17:00 +0100 Subject: [PATCH 24/26] chore: update readme --- README.md | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 153ae783b..6b9839387 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ import { createSyncFn } from 'synckit' // the worker path must be absolute const syncFn = createSyncFn(require.resolve('./worker'), { - tsRunner: 'tsx', // optional, can be `'ts-node' | 'esbuild-register' | 'esbuild-runner' | 'tsx'` + tsRunner: 'tsx', // optional, can be `'node' | 'ts-node' | 'esbuild-register' | 'esbuild-runner' | 'tsx'` }) // do whatever you want, you will get the result synchronously! @@ -126,9 +126,17 @@ export interface GlobalShim { ### TypeScript -#### `ts-node` +#### `node` (Default, Node 23+) -If you want to use `ts-node` for worker file (a `.ts` file), it is supported out of box! +On recent Node versions, you may select this runner to execute your worker file (a `.ts` file) in the native runtime. + +As of Node v23, this feature is supported out of the box. To enable it in the current LTS, you can pass the [`--experimental-strip-types`](https://nodejs.org/docs/latest-v22.x/api/typescript.html#type-stripping) flag to the process. Visit the [documentation](https://nodejs.org/docs/latest/api/typescript.html#type-stripping) to learn more. + +When `synckit` detects the process to be running with this flag, it will execute the worker file with the `node` runner by default. + +#### `ts-node` (Default) + +Prior to Node v23, you may want to use `ts-node` to execute your worker file (a `.ts` file). If you want to use a custom tsconfig as project instead of default `tsconfig.json`, use `TS_NODE_PROJECT` env. Please view [ts-node](https://github.com/TypeStrong/ts-node#tsconfig) for more details. From 7fcfd208cf5a7f5a0bc5e23fb2fed76bcc6fee34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nikolas=20Schr=C3=B6ter?= <25958801+nwidynski@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:37:11 +0100 Subject: [PATCH 25/26] fix: conditionally apply default in test case --- test/ts-runner.spec.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/test/ts-runner.spec.ts b/test/ts-runner.spec.ts index 2d1b26aca..5c206a5e1 100644 --- a/test/ts-runner.spec.ts +++ b/test/ts-runner.spec.ts @@ -147,7 +147,9 @@ test(TsRunner.Node, async () => { return } - let syncFn = createSyncFn(workerJsPath) + let syncFn = createSyncFn(workerJsPath, { + tsRunner: nodeVersion >= 23 ? undefined : TSRunner.Node, + }) expect(syncFn(1)).toBe(1) expect(syncFn(2)).toBe(2) expect(syncFn(5)).toBe(5) @@ -156,7 +158,9 @@ test(TsRunner.Node, async () => { return } - syncFn = createSyncFn(workerMtsPath) + syncFn = createSyncFn(workerMtsPath, { + tsRunner: nodeVersion >= 23 ? undefined : TSRunner.Node, + }) expect(syncFn(1)).toBe(1) expect(syncFn(2)).toBe(2) expect(syncFn(5)).toBe(5) From 0542defed46ff1370217e164c81b54a142cd8962 Mon Sep 17 00:00:00 2001 From: JounQin Date: Thu, 20 Mar 2025 17:50:01 +0800 Subject: [PATCH 26/26] chore: test fix and docment update --- README.md | 3 ++- test/ts-runner.spec.ts | 11 +++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6b9839387..d3766fe5d 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,8 @@ Perform async work synchronously in Node.js using `worker_threads` with first-cl - [Options](#options) - [Envs](#envs) - [TypeScript](#typescript) - - [`ts-node`](#ts-node) + - [`node` (Default, Node 23+)](#node-default-node-23) + - [`ts-node` (Default)](#ts-node-default) - [`esbuild-register`](#esbuild-register) - [`esbuild-runner`](#esbuild-runner) - [`swc`](#swc) diff --git a/test/ts-runner.spec.ts b/test/ts-runner.spec.ts index 5c206a5e1..97de79771 100644 --- a/test/ts-runner.spec.ts +++ b/test/ts-runner.spec.ts @@ -9,6 +9,7 @@ import type { AsyncWorkerFn } from './types.js' import { MTS_SUPPORTED_NODE_VERSION, + STRIP_TYPES_DEFAULT_NODE_VERSION, STRIP_TYPES_SUPPORTED_NODE_VERSION, TsRunner, } from 'synckit' @@ -148,7 +149,10 @@ test(TsRunner.Node, async () => { } let syncFn = createSyncFn(workerJsPath, { - tsRunner: nodeVersion >= 23 ? undefined : TSRunner.Node, + tsRunner: + nodeVersion >= STRIP_TYPES_DEFAULT_NODE_VERSION + ? undefined + : TsRunner.Node, }) expect(syncFn(1)).toBe(1) expect(syncFn(2)).toBe(2) @@ -159,7 +163,10 @@ test(TsRunner.Node, async () => { } syncFn = createSyncFn(workerMtsPath, { - tsRunner: nodeVersion >= 23 ? undefined : TSRunner.Node, + tsRunner: + nodeVersion >= STRIP_TYPES_DEFAULT_NODE_VERSION + ? undefined + : TsRunner.Node, }) expect(syncFn(1)).toBe(1) expect(syncFn(2)).toBe(2)