synckit
Advanced tools
Comparing version 0.7.3 to 0.8.0
@@ -1,3 +0,10 @@ | ||
import { AnyAsyncFn, Syncify } from './types.js'; | ||
import { AnyAsyncFn, Syncify, ValueOf } from './types.js'; | ||
export * from './types.js'; | ||
export declare const TsRunner: { | ||
readonly TsNode: "ts-node"; | ||
readonly EsbuildRegister: "esbuild-register"; | ||
readonly EsbuildRunner: "esbuild-runner"; | ||
readonly TSX: "tsx"; | ||
}; | ||
export declare type TsRunner = ValueOf<typeof TsRunner>; | ||
export declare const DEFAULT_BUFFER_SIZE: number | undefined; | ||
@@ -7,2 +14,3 @@ export declare const DEFAULT_TIMEOUT: number | undefined; | ||
export declare const DEFAULT_EXEC_ARGV: string[]; | ||
export declare const DEFAULT_TS_RUNNER: TsRunner; | ||
export interface SynckitOptions { | ||
@@ -12,2 +20,3 @@ bufferSize?: number; | ||
execArgv?: string[]; | ||
tsRunner?: TsRunner; | ||
} | ||
@@ -14,0 +23,0 @@ export declare const extractProperties: <T>(object?: T | undefined) => T | undefined; |
129
lib/index.js
@@ -1,2 +0,1 @@ | ||
var _a; | ||
import { __awaiter } from "tslib"; | ||
@@ -11,3 +10,13 @@ import { createRequire } from 'node:module'; | ||
export * from './types.js'; | ||
const { SYNCKIT_BUFFER_SIZE, SYNCKIT_TIMEOUT, SYNCKIT_EXEC_ARV } = process.env; | ||
export const TsRunner = { | ||
// https://github.com/TypeStrong/ts-node | ||
TsNode: 'ts-node', | ||
// https://github.com/egoist/esbuild-register | ||
EsbuildRegister: 'esbuild-register', | ||
// https://github.com/folke/esbuild-runner | ||
EsbuildRunner: 'esbuild-runner', | ||
// https://github.com/esbuild-kit/tsx | ||
TSX: 'tsx', | ||
}; | ||
const { SYNCKIT_BUFFER_SIZE, SYNCKIT_TIMEOUT, SYNCKIT_EXEC_ARV, SYNCKIT_TS_RUNNER, } = process.env; | ||
export const DEFAULT_BUFFER_SIZE = SYNCKIT_BUFFER_SIZE | ||
@@ -19,3 +28,5 @@ ? +SYNCKIT_BUFFER_SIZE | ||
/* istanbul ignore next */ | ||
export const DEFAULT_EXEC_ARGV = (_a = SYNCKIT_EXEC_ARV === null || SYNCKIT_EXEC_ARV === void 0 ? void 0 : SYNCKIT_EXEC_ARV.split(',')) !== null && _a !== void 0 ? _a : []; | ||
export const DEFAULT_EXEC_ARGV = (SYNCKIT_EXEC_ARV === null || SYNCKIT_EXEC_ARV === void 0 ? void 0 : SYNCKIT_EXEC_ARV.split(',')) || []; | ||
export const DEFAULT_TS_RUNNER = (SYNCKIT_TS_RUNNER || | ||
TsRunner.TsNode); | ||
const syncFnCache = new Map(); | ||
@@ -53,27 +64,25 @@ // MessagePort doesn't copy the properties of Error objects. We still want | ||
const dataUrl = (code) => new URL(`data:text/javascript,${encodeURIComponent(code)}`); | ||
// eslint-disable-next-line sonarjs/cognitive-complexity | ||
const setupTsNode = (workerPath, execArgv) => { | ||
if (!/[/\\]node_modules[/\\]/.test(workerPath)) { | ||
const ext = path.extname(workerPath); | ||
if (!ext || /\.[cm]?js$/.test(ext)) { | ||
const workPathWithoutExt = ext | ||
? workerPath.slice(0, -ext.length) | ||
: workerPath; | ||
let extensions; | ||
switch (ext) { | ||
case '.cjs': | ||
extensions = ['cts', 'cjs']; | ||
break; | ||
case '.mjs': | ||
extensions = ['mts', 'mjs']; | ||
break; | ||
default: | ||
extensions = ['.ts', '.js']; | ||
break; | ||
} | ||
const found = tryExtensions(workPathWithoutExt, extensions); | ||
if (found && (!ext || found !== workPathWithoutExt)) { | ||
workerPath = found; | ||
} | ||
const setupTsRunner = (workerPath, { execArgv, tsRunner }) => { | ||
const ext = path.extname(workerPath); | ||
if (!/[/\\]node_modules[/\\]/.test(workerPath) && | ||
(!ext || /^\.[cm]?js$/.test(ext))) { | ||
const workPathWithoutExt = ext | ||
? workerPath.slice(0, -ext.length) | ||
: workerPath; | ||
let extensions; | ||
switch (ext) { | ||
case '.cjs': | ||
extensions = ['.cts', '.cjs']; | ||
break; | ||
case '.mjs': | ||
extensions = ['.mts', '.mjs']; | ||
break; | ||
default: | ||
extensions = ['.ts', '.js']; | ||
break; | ||
} | ||
const found = tryExtensions(workPathWithoutExt, extensions); | ||
if (found && (!ext || found !== workPathWithoutExt)) { | ||
workerPath = found; | ||
} | ||
} | ||
@@ -91,7 +100,39 @@ const isTs = /\.[cm]?ts$/.test(workerPath); | ||
} | ||
if (tsUseEsm && !execArgv.includes('--loader')) { | ||
execArgv = ['--loader', 'ts-node/esm', ...execArgv]; | ||
switch (tsRunner) { | ||
case TsRunner.TsNode: { | ||
if (tsUseEsm) { | ||
if (!execArgv.includes('--loader')) { | ||
execArgv = ['--loader', `${TsRunner.TsNode}/esm`, ...execArgv]; | ||
} | ||
} | ||
else if (!execArgv.includes('-r')) { | ||
execArgv = ['-r', `${TsRunner.TsNode}/register`, ...execArgv]; | ||
} | ||
break; | ||
} | ||
case TsRunner.EsbuildRegister: { | ||
if (!execArgv.includes('-r')) { | ||
execArgv = ['-r', TsRunner.EsbuildRegister, ...execArgv]; | ||
} | ||
break; | ||
} | ||
case TsRunner.EsbuildRunner: { | ||
if (!execArgv.includes('-r')) { | ||
execArgv = ['-r', `${TsRunner.EsbuildRunner}/register`, ...execArgv]; | ||
} | ||
break; | ||
} | ||
case TsRunner.TSX: { | ||
if (!execArgv.includes('--loader')) { | ||
execArgv = ['--loader', TsRunner.TSX, ...execArgv]; | ||
} | ||
break; | ||
} | ||
default: { | ||
throw new Error(`Unknown ts runner: ${String(tsRunner)}`); | ||
} | ||
} | ||
} | ||
return { | ||
ext, | ||
isTs, | ||
@@ -103,11 +144,25 @@ tsUseEsm, | ||
}; | ||
function startWorkerThread(workerPath, { bufferSize = DEFAULT_WORKER_BUFFER_SIZE, timeout = DEFAULT_TIMEOUT, execArgv = DEFAULT_EXEC_ARGV, } = {}) { | ||
function startWorkerThread(workerPath, { bufferSize = DEFAULT_WORKER_BUFFER_SIZE, timeout = DEFAULT_TIMEOUT, execArgv = DEFAULT_EXEC_ARGV, tsRunner = DEFAULT_TS_RUNNER, } = {}) { | ||
const { port1: mainPort, port2: workerPort } = new MessageChannel(); | ||
const { isTs, tsUseEsm, workerPath: finalWorkerPath, execArgv: finalExecArgv, } = setupTsNode(workerPath, execArgv); | ||
const worker = new Worker(isTs | ||
? tsUseEsm | ||
? dataUrl(`import '${String(pathToFileURL(finalWorkerPath))}'`) | ||
: `require('ts-node/register');require('${finalWorkerPath.replace(/\\/g, '\\\\')}')` | ||
: pathToFileURL(finalWorkerPath), { | ||
eval: isTs && !tsUseEsm, | ||
const { ext, tsUseEsm, workerPath: finalWorkerPath, execArgv: finalExecArgv, } = setupTsRunner(workerPath, { execArgv, tsRunner }); | ||
const workerPathUrl = pathToFileURL(finalWorkerPath); | ||
if (/\.[cm]ts$/.test(finalWorkerPath) && | ||
[ | ||
// https://github.com/egoist/esbuild-register/issues/79 | ||
TsRunner.EsbuildRegister, | ||
// https://github.com/folke/esbuild-runner/issues/67 | ||
TsRunner.EsbuildRunner, | ||
].includes(tsRunner)) { | ||
throw new Error(`${tsRunner} is not supported for ${ext} files yet, you can try [tsx](https://github.com/esbuild-kit/tsx) instead`); | ||
} | ||
const worker = new Worker(tsUseEsm && | ||
[ | ||
TsRunner.TsNode, | ||
// https://github.com/egoist/esbuild-register/issues/79 | ||
// TsRunner.EsbuildRegister, | ||
// https://github.com/folke/esbuild-runner/issues/67 | ||
// TsRunner.EsbuildRunner | ||
].includes(tsRunner) | ||
? dataUrl(`import '${String(workerPathUrl)}'`) | ||
: workerPathUrl, { | ||
workerData: { workerPort }, | ||
@@ -114,0 +169,0 @@ transferList: [workerPort], |
@@ -8,2 +8,3 @@ /// <reference types="node" /> | ||
export declare type PromiseType<T extends AnyPromise> = T extends Promise<infer R> ? R : never; | ||
export declare type ValueOf<T> = T[keyof T]; | ||
export interface MainToWorkerMessage<T extends unknown[]> { | ||
@@ -10,0 +11,0 @@ sharedBuffer: SharedArrayBuffer; |
{ | ||
"name": "synckit", | ||
"version": "0.7.3", | ||
"version": "0.8.0", | ||
"type": "module", | ||
@@ -42,3 +42,3 @@ "description": "Perform async work synchronously in Node.js using `worker_threads` with first-class TypeScript support.", | ||
"engines": { | ||
"node": "^12.20.0 || ^14.18.0 || >=16.0.0" | ||
"node": "^14.18.0 || >=16.0.0" | ||
}, | ||
@@ -45,0 +45,0 @@ "main": "./lib/index.cjs", |
@@ -24,2 +24,6 @@ # synckit | ||
- [TypeScript](#typescript) | ||
- [`ts-node`](#ts-node) | ||
- [`esbuild-register`](#esbuild-register) | ||
- [`esbuild-runner`](#esbuild-runner) | ||
- [`tsx`](#tsx) | ||
- [Benchmark](#benchmark) | ||
@@ -73,5 +77,8 @@ - [Sponsors](#sponsors) | ||
3. `SYNCKIT_EXEC_ARGV`: List of node CLI options passed to the worker, split with comma `,`. (default as `[]`), see also [`node` docs](https://nodejs.org/api/worker_threads.html) | ||
4. `SYNCKIT_TS_RUNNER`: Which TypeScript runner to be used, it could be very useful for development, could be `'ts-node' | 'esbuild-register' | 'esbuild-runner' | 'tsx'`, `'ts-node'` is used by default, make sure you have installed them already | ||
### TypeScript | ||
#### `ts-node` | ||
If you want to use `ts-node` for worker file (a `.ts` file), it is supported out of box! | ||
@@ -83,2 +90,14 @@ | ||
#### `esbuild-register` | ||
Please view <https://github.com/egoist/esbuild-register> for its document | ||
#### `esbuild-runner` | ||
Please view <https://github.com/folke/esbuild-runner> for its document | ||
#### `tsx` | ||
Please view <https://github.com/esbuild-kit/tsx> for its document | ||
## Benchmark | ||
@@ -85,0 +104,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Uses eval
Supply chain riskPackage uses eval() which is a dangerous function. This prevents the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
35379
501
133
0