Skip to content

Commit d3da4c3

Browse files
authored
feat: support file url worker path (#208)
close #187
1 parent 3c27570 commit d3da4c3

File tree

3 files changed

+39
-2
lines changed

3 files changed

+39
-2
lines changed

.changeset/rotten-squids-protect.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"synckit": minor
3+
---
4+
5+
feat: support file url worker path

src/index.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,11 +113,15 @@ export function extractProperties<T>(object?: T) {
113113
}
114114

115115
export function createSyncFn<T extends AnyFn>(
116-
workerPath: string,
116+
workerPath: URL | string,
117117
timeoutOrOptions?: SynckitOptions | number,
118118
): Syncify<T> {
119119
syncFnCache ??= new Map()
120120

121+
if (typeof workerPath !== 'string' || workerPath.startsWith('file://')) {
122+
workerPath = fileURLToPath(workerPath)
123+
}
124+
121125
const cachedSyncFn = syncFnCache.get(workerPath)
122126

123127
if (cachedSyncFn) {
@@ -159,7 +163,7 @@ const setupTsRunner = (
159163
let ext = path.extname(workerPath)
160164

161165
if (
162-
!/[/\\]node_modules[/\\]/.test(workerPath) &&
166+
!/([/\\])node_modules\1/.test(workerPath) &&
163167
(!ext || /^\.[cm]?js$/.test(ext))
164168
) {
165169
const workPathWithoutExt = ext

test/fn.spec.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createRequire } from 'node:module'
22
import path from 'node:path'
3+
import { pathToFileURL } from 'node:url'
34

45
import { jest } from '@jest/globals'
56

@@ -244,3 +245,30 @@ test('globalShims options', async () => {
244245
expect(syncFn(2)).toBe(2)
245246
expect(syncFn(5, 0)).toBe(5)
246247
})
248+
249+
test('support file url', async () => {
250+
const { createSyncFn } = await import('synckit')
251+
252+
const syncFn = createSyncFn<AsyncWorkerFn>(pathToFileURL(workerCjsPath), {})
253+
254+
expect(syncFn(1)).toBe(1)
255+
expect(syncFn(2)).toBe(2)
256+
expect(syncFn(5, 0)).toBe(5)
257+
258+
expect(() => createSyncFn(new URL('https://example.com'))).toThrow(
259+
'The URL must be of scheme file',
260+
)
261+
})
262+
263+
test('support file url protocol', async () => {
264+
const { createSyncFn } = await import('synckit')
265+
266+
const syncFn = createSyncFn<AsyncWorkerFn>(
267+
pathToFileURL(workerCjsPath).href,
268+
{},
269+
)
270+
271+
expect(syncFn(1)).toBe(1)
272+
expect(syncFn(2)).toBe(2)
273+
expect(syncFn(5, 0)).toBe(5)
274+
})

0 commit comments

Comments
 (0)