
π¦ Extremely Small
𧬠Lifecycle Hooks
π― Concise Signature
π Group Side Effects
β try/catch HELL πΉ
π Better Visibility and Control
π Works in ESM & CJS
β± Minimal Obsessive Disorder
pcall.js
is heavily inspired by
πΉ Lua pcall
status, res
πΉ Elixir/Erlang Result Monad {:ok/:error, reason/value}
πΉ Rust Result<T, E>
πΉ Go []error
with superpowers π¦!
pcall({f}, {arg1}, {...})
[err, res]
pcall()
Calls function {f}
with the given arguments in protected mode.
This means that any error inside {f}
is not propagated;
Instead, pcall
catches the error and returns a tuple.
Its first element is the err
object,
Which is null
if the call succeeds without errors.
And all results from the call, on second element; [null, {res}]
# install
npm install pcall.js
// ESM
import Pcall from 'pcall.js'
// CJS
const Pcall = require('pcall.js')
const [err, res] = await Pcall(asyncFn, a, b, c, /* Β·Β·Β· */)
const pcall = new Pcall({
onSuccess: console.log,
onFailure: console.error,
onFinally: console.info,
timeout: 30_000,
transformOnSuccess: (res) => res,
transformOnFailure: (err) => err,
noTrace: false
})
const [err, res] = await pcall(asyncFn, a, b, c, /* Β·Β·Β· */)
:Fulfill [null, res]
:Reject [err, null]
import { readFile } from 'node:fs/promises'
// π» BEFORE
try {
const res = await readFile('./package.json', { encoding: 'utf8' })
} catch(error) {
console.error(error, 'π₯')
}
// βββββββββββββββββ
// πΉAFTER
import Pcall from 'pcall.js'
const [err, res] = await Pcall(readFile, './package.json', { encoding: 'utf8' })
// πΈTHROW
err && throw new Error("XYZZY", { cause: err });
// βββββββββββββββββ
// πΈ MOCK
// const readJson = new Pcall({
// fn: readFile,
// args: [{ encoding: 'utf8' }],
// transformOnSuccess: (res) => JSON.parse(res),
// transformOnFailure: (err) => err.message,
// })
// const path = 'test/sample-good.json'
//
// const res = await readJson(path)
// log(res.hogo) // fuga
import { readFile } from 'node:fs/promises'
import Pcall from 'pcall.js'
const pcall = new Pcall({
onSuccess: console.log,
onFailure: console.error,
onFinally: (args, func, span) => { /* π£ π£ π₯ */ },
transformOnSuccess: (res) => res,
transformOnFailure: (err) => err,
timeout: 30_000,
noTrace: false,
})
const path = './package.json'
const opts = { encoding: 'utf8' }
const [err, res] = await pcall(readFile, path, opts)
π‘ Check test/ files for more examples
# run test playground in watch mode
npm run dev
# build production
npm run build
# build stub
npm run build:stub
- π Lifecycle Hooks
- [.] π Serializer
- [.] 𧬠Parser
- [.] π JSDoc
- [.] π§ ESLint
- [o] π Docs
- [o]
β οΈ Tests - [o] π‘ Examples