Skip to content
Projects

quansync-dev/quansync has 718 GitHub stars and 6 forks. GitHot measured 0 stars in 24 hours. Last checked 2026-11-15 18:38 UTC. Last push 2026-09-18.

How these counts are measured

Measured star growth

in 24h
0
in 7 days
Collecting history
in 15 days
Collecting history
in 1 month
Collecting history

Net star changes over overlapping periods, not daily totals. Missing measurements are left blank. Stars measure attention, not software quality.

About

"Superposition" between sync and async

Developer Tools

README.md

Original

quansync

npm version npm downloads bundle JSDocs License

Create sync/async APIs with usable logic.

Quantum + Sync - "Superposition" between sync and async.

  • Typesafe
  • ESM, modern JavaScript
  • Zero dependencies

Heavily inspired by genasync by @loganfsmyth.

Why & How

Please refer to Anthony's blog post: Async, Sync, in Between.

Usage

pnpm i quansync
import fs from 'node:fs'
import { quansync } from 'quansync'

// Create a quansync function by providing `sync` and `async` implementations
const readFile = quansync({
  sync: (path: string) => fs.readFileSync(path),
  async: (path: string) => fs.promises.readFile(path),
})

// Create a quansync function by providing a generator function
const myFunction = quansync(function* (filename) {
  // Use `yield*` to call another quansync function
  const code = yield* readFile(filename, 'utf8')

  return `// some custom prefix\n${code}`
})

// Use it as a sync function
const result = myFunction.sync('./some-file.js')

// Use it as an async function
const asyncResult = await myFunction.async('./some-file.js')

getIsAsync

Returns a boolean indicating whether the current execution is in async mode.

import { getIsAsync, quansync } from 'quansync'

const fn = quansync(function* () {
  const isAsync: boolean = yield* getIsAsync()
  console.log(isAsync)
})

fn.sync() // false
await fn() // true
await fn.async() // true

all

import { all, quansync } from 'quansync'

const loadFiles = quansync(function* () {
  return yield* all([
    readFile('./one.js'),
    readFile('./two.js'),
    readFile('./three.js'),
  ])
})

const results = loadFiles.sync()
const asyncResults = await loadFiles.async()

Build-time Macro

If you don't like the function* and yield* syntax, we also provide a build-time macro via unplugin-quansync allowing you use quansync with async/await syntax, while still able to get the sync version out of that.

Here is an example:

import fs from 'node:fs'
import { quansync } from 'quansync/macro'

// Create a quansync function by providing `sync` and `async` implementations
const readFile = quansync({
  sync: (path: string) => fs.readFileSync(path),
  async: (path: string) => fs.promises.readFile(path),
})

// Create a quansync function by providing an **async** function
const myFunction = quansync(async (filename) => {
  // Use `await` to call another quansync function
  const code = await readFile(filename, 'utf8')

  return `// some custom prefix\n${code}`
})

// Use it as a sync function
const result = myFunction.sync('./some-file.js')

// Use it as an async function
const asyncResult = await myFunction.async('./some-file.js')

For more details on usage, refer to unplugin-quansync's docs.

Benchmark

Run the following command to benchmark the performance of quansync:

pnpm run build && pnpm run benchmark

Benchmark results indicate that each yield incurs an overhead of approximately 150 ns, comparable to that of await sync(). (On Apple M1 Max)

Sponsors

License

MIT License © Anthony Fu and Kevin Deng