Skip to content

Commit 396e964

Browse files
authoredJul 16, 2022
fix: better compatibility on Node 14 (#92)
1 parent 784f249 commit 396e964

File tree

9 files changed

+74
-56
lines changed

9 files changed

+74
-56
lines changed
 

‎.changeset/purple-socks-doubt.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"synckit": patch
3+
---
4+
5+
fix: better compatibility on Node 14

‎.eslintignore

+1
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ coverage
22
dist
33
lib
44
CHANGELOG.md
5+
!/.github
56
!/.*.cjs

‎.eslintrc

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
11
{
2-
"extends": "@1stg"
2+
"extends": "@1stg",
3+
"overrides": [
4+
{
5+
"files": ".github/FUNDING.yml",
6+
"rules": {
7+
"unicorn/filename-case": "off"
8+
}
9+
}
10+
]
311
}

‎.github/workflows/ci.yml

+2-1
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ jobs:
1010
strategy:
1111
matrix:
1212
node:
13+
- 14
1314
- 16
1415
- 18
1516
os:
@@ -31,7 +32,7 @@ jobs:
3132
cache: yarn
3233

3334
- name: Install Dependencies
34-
run: yarn --frozen-lockfile --ignore-engines
35+
run: yarn --frozen-lockfile
3536

3637
- name: Build, Lint and Test
3738
run: yarn run-s build lint test

‎.github/workflows/pkg-size.yml

-6
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,6 @@ jobs:
1414
- name: Checkout
1515
uses: actions/checkout@v3
1616

17-
- name: Setup Node.js
18-
uses: actions/setup-node@v3
19-
with:
20-
node-version: 16
21-
cache: yarn
22-
2317
- name: Package Size Report
2418
uses: pkg-size/action@v1
2519
env:

‎package.json

+1-2
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@
7878
"lint:tsc": "tsc --noEmit",
7979
"prepare": "patch-package && simple-git-hooks && yarn-deduplicate --strategy fewer || exit 0",
8080
"prerelease": "yarn build",
81-
"release": "clean-publish && changeset publish",
81+
"release": "changeset publish",
8282
"test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
8383
"typecov": "type-coverage"
8484
},
@@ -92,7 +92,6 @@
9292
"@changesets/cli": "^2.23.2",
9393
"@types/jest": "^28.1.5",
9494
"@types/node": "^18.0.4",
95-
"clean-publish": "^4.0.1",
9695
"deasync": "^0.1.27",
9796
"esbuild-register": "^3.3.3",
9897
"esbuild-runner": "^2.2.1",

‎src/index.ts

+39-26
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ export const DEFAULT_EXEC_ARGV = SYNCKIT_EXEC_ARV?.split(',') || []
5858
export const DEFAULT_TS_RUNNER = (SYNCKIT_TS_RUNNER ||
5959
TsRunner.TsNode) as TsRunner
6060

61+
export const MTS_SUPPORTED_NODE_VERSION = 16
62+
6163
const syncFnCache = new Map<string, AnyFn>()
6264

6365
export interface SynckitOptions {
@@ -128,7 +130,7 @@ const setupTsRunner = (
128130
workerPath: string,
129131
{ execArgv, tsRunner }: { execArgv: string[]; tsRunner: TsRunner }, // eslint-disable-next-line sonarjs/cognitive-complexity
130132
) => {
131-
const ext = path.extname(workerPath)
133+
let ext = path.extname(workerPath)
132134

133135
if (
134136
!/[/\\]node_modules[/\\]/.test(workerPath) &&
@@ -150,8 +152,12 @@ const setupTsRunner = (
150152
break
151153
}
152154
const found = tryExtensions(workPathWithoutExt, extensions)
153-
if (found && (!ext || found !== workPathWithoutExt)) {
155+
let differentExt: boolean | undefined
156+
if (found && (!ext || (differentExt = found !== workPathWithoutExt))) {
154157
workerPath = found
158+
if (differentExt) {
159+
ext = path.extname(workerPath)
160+
}
155161
}
156162
}
157163

@@ -212,6 +218,7 @@ const setupTsRunner = (
212218
}
213219
}
214220

221+
// eslint-disable-next-line sonarjs/cognitive-complexity
215222
function startWorkerThread<R, T extends AnyAsyncFn<R>>(
216223
workerPath: string,
217224
{
@@ -224,6 +231,7 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
224231
const { port1: mainPort, port2: workerPort } = new MessageChannel()
225232

226233
const {
234+
isTs,
227235
ext,
228236
tsUseEsm,
229237
workerPath: finalWorkerPath,
@@ -232,36 +240,41 @@ function startWorkerThread<R, T extends AnyAsyncFn<R>>(
232240

233241
const workerPathUrl = pathToFileURL(finalWorkerPath)
234242

235-
if (
236-
/\.[cm]ts$/.test(finalWorkerPath) &&
237-
(
238-
[
239-
// https://github.com/egoist/esbuild-register/issues/79
240-
TsRunner.EsbuildRegister,
241-
// https://github.com/folke/esbuild-runner/issues/67
242-
TsRunner.EsbuildRunner,
243-
] as TsRunner[]
244-
).includes(tsRunner)
245-
) {
246-
throw new Error(
247-
`${tsRunner} is not supported for ${ext} files yet, you can try [tsx](https://github.com/esbuild-kit/tsx) instead`,
248-
)
243+
if (/\.[cm]ts$/.test(finalWorkerPath)) {
244+
const isTsxSupported =
245+
!tsUseEsm ||
246+
Number.parseFloat(process.versions.node) >= MTS_SUPPORTED_NODE_VERSION
247+
/* istanbul ignore if */
248+
if (
249+
(
250+
[
251+
// https://github.com/egoist/esbuild-register/issues/79
252+
TsRunner.EsbuildRegister,
253+
// https://github.com/folke/esbuild-runner/issues/67
254+
TsRunner.EsbuildRunner,
255+
.../* istanbul ignore next */ (isTsxSupported ? [] : [TsRunner.TSX]),
256+
] as TsRunner[]
257+
).includes(tsRunner)
258+
) {
259+
throw new Error(
260+
`${tsRunner} is not supported for ${ext} files yet` +
261+
(isTsxSupported
262+
? ', you can try [tsx](https://github.com/esbuild-kit/tsx) instead'
263+
: ''),
264+
)
265+
}
249266
}
250267

268+
const useEval = isTs && !tsUseEsm
269+
251270
const worker = new Worker(
252-
tsUseEsm &&
253-
(
254-
[
255-
TsRunner.TsNode,
256-
// https://github.com/egoist/esbuild-register/issues/79
257-
// TsRunner.EsbuildRegister,
258-
// https://github.com/folke/esbuild-runner/issues/67
259-
// TsRunner.EsbuildRunner
260-
] as TsRunner[]
261-
).includes(tsRunner)
271+
tsUseEsm && tsRunner === TsRunner.TsNode
262272
? dataUrl(`import '${String(workerPathUrl)}'`)
273+
: useEval
274+
? `require('${finalWorkerPath.replace(/\\/g, '\\\\')}')`
263275
: workerPathUrl,
264276
{
277+
eval: useEval,
265278
workerData: { workerPort },
266279
transferList: [workerPort],
267280
execArgv: finalExecArgv,

‎test/ts-runner.spec.ts

+17-10
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { jest } from '@jest/globals'
77
import { _dirname } from './helpers.js'
88
import type { AsyncWorkerFn } from './types.js'
99

10-
import { TsRunner } from 'synckit'
10+
import { MTS_SUPPORTED_NODE_VERSION, TsRunner } from 'synckit'
1111

1212
beforeEach(() => {
1313
jest.resetModules()
@@ -27,14 +27,12 @@ it(TsRunner.EsbuildRegister, async () => {
2727

2828
expect(() =>
2929
createSyncFn<AsyncWorkerFn>(
30-
path.resolve(_dirname, 'esbuild-register-error.worker.mts'),
30+
path.resolve(_dirname, 'esbuild-register-error.worker.mjs'),
3131
{
3232
tsRunner: TsRunner.EsbuildRegister,
3333
},
3434
),
35-
).toThrowErrorMatchingInlineSnapshot(
36-
`"esbuild-register is not supported for .mts files yet, you can try [tsx](https://github.com/esbuild-kit/tsx) instead"`,
37-
)
35+
).toThrowError('esbuild-register is not supported for .mts files yet')
3836
})
3937

4038
it(TsRunner.EsbuildRunner, async () => {
@@ -51,18 +49,27 @@ it(TsRunner.EsbuildRunner, async () => {
5149

5250
expect(() =>
5351
createSyncFn<AsyncWorkerFn>(
54-
path.resolve(_dirname, 'esbuild-runner-error.worker.mts'),
52+
path.resolve(_dirname, 'esbuild-runner-error.worker.mjs'),
5553
{
5654
tsRunner: TsRunner.EsbuildRunner,
5755
},
5856
),
59-
).toThrowErrorMatchingInlineSnapshot(
60-
`"esbuild-runner is not supported for .mts files yet, you can try [tsx](https://github.com/esbuild-kit/tsx) instead"`,
61-
)
57+
).toThrowError('esbuild-runner is not supported for .mts files yet')
6258
})
6359

6460
it(TsRunner.TSX, async () => {
6561
const { createSyncFn } = await import('synckit')
62+
63+
if (Number.parseFloat(process.versions.node) < MTS_SUPPORTED_NODE_VERSION) {
64+
// eslint-disable-next-line jest/no-conditional-expect
65+
expect(() =>
66+
createSyncFn<AsyncWorkerFn>(path.resolve(_dirname, 'tsx.worker.mjs'), {
67+
tsRunner: TsRunner.TSX,
68+
}),
69+
).toThrowError('tsx is not supported for .mts files yet')
70+
return
71+
}
72+
6673
const syncFn = createSyncFn<AsyncWorkerFn>(
6774
path.resolve(_dirname, 'tsx.worker.mjs'),
6875
{
@@ -79,7 +86,7 @@ it('unknown ts runner', async () => {
7986

8087
expect(() =>
8188
// @ts-expect-error
82-
createSyncFn<AsyncWorkerFn>(path.resolve(_dirname, 'worker.ts'), {
89+
createSyncFn<AsyncWorkerFn>(path.resolve(_dirname, 'worker.js'), {
8390
tsRunner: 'unknown',
8491
}),
8592
).toThrowErrorMatchingInlineSnapshot(`"Unknown ts runner: unknown"`)

‎yarn.lock

-10
Original file line numberDiff line numberDiff line change
@@ -3685,16 +3685,6 @@ cjs-module-lexer@^1.0.0:
36853685
resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40"
36863686
integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==
36873687

3688-
clean-publish@^4.0.1:
3689-
version "4.0.1"
3690-
resolved "https://registry.yarnpkg.com/clean-publish/-/clean-publish-4.0.1.tgz#8492fa1ef9b5d5f8e26cbca76c849a2be14543a3"
3691-
integrity sha512-6v0bh5kQD5FDlxBgXDVNNc6KmAB7iIP/GHD91q9xsGVZT5XB9Y8TNqB7dL5u9PTZlBeLpBw+A1AseRlEEJLSWA==
3692-
dependencies:
3693-
cross-spawn "^7.0.3"
3694-
fast-glob "^3.2.11"
3695-
lilconfig "^2.0.5"
3696-
micromatch "^4.0.5"
3697-
36983688
clean-regexp@^1.0.0:
36993689
version "1.0.0"
37003690
resolved "https://registry.yarnpkg.com/clean-regexp/-/clean-regexp-1.0.0.tgz#8df7c7aae51fd36874e8f8d05b9180bc11a3fed7"

0 commit comments

Comments
 (0)
Please sign in to comment.