Socket
Socket
Sign inDemoInstall

synckit

Package Overview
Dependencies
50
Maintainers
2
Versions
33
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.7.3 to 0.8.0

11

lib/index.d.ts

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc