Research
Security News
Quasar RAT Disguised as an npm Package for Detecting Vulnerabilities in Ethereum Smart Contracts
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Collection of tools to manage control flow of/with Promises - inspired by [caolan/async](https://github.com/caolan/async).
Collection of tools to manage control flow of/with Promises - inspired by caolan/async.
Works with and without async/await. The lib itself only uses promises.
As someone beautifully put it:
this is like caolan/async which is like lodash but async, but awaitful
You can use arrays
, objects
and iterables
as the input for all the collection functions.
Applies iteratee
to each item in coll
, concatenating the results. Returns the concatenated list.
import concat from 'apr-concat'
const readdir = thenify(fs.readdir);
const dirs = [
'dir1',
'dir2',
'dir3'
];
const files = await concat(dirs, async (dir) =>
await readdir(dir)
);
import concatSeries from 'apr-concat/series'
// import { series as concatSeries } from 'apr-concat/series'
import concatLimit from 'apr-concat/limit'
// import { limit as concatLimit } from 'apr-concat/limit'
Returns the first value in coll
that passes an async truth test.
import find from 'apr-find'
const access = thenify(fs.access);
const files = [
'file1',
'file2',
'file3'
];
const first = await find(files, async (file) =>
await access(file)
);
import findSeries from 'apr-find/series'
// import { series as findSeries } from 'apr-find/series'
import findLimit from 'apr-find/limit'
// import { limit as findLimit } from 'apr-find/limit'
Applies the function iteratee
to each item in coll
, in parallel.
import forEach from 'apr-for-each'
const writeFile = thenify(fs.writeFile);
const files = [
'/home/.vimrc',
'/home/.zshrc'
];
await each(files, async (file) =>
await writeFile(file, 'boom')
);
import forEachSeries from 'apr-for-each/series'
// import { series as forEachSeries } from 'apr-for-each/series'
import forEachLimit from 'apr-for-each/limit'
// import { limit as forEachLimit } from 'apr-for-each/limit'
Returns true if every element in coll
satisfies an async test.
import every from 'apr-every'
const access = thenify(fs.access);
const files = [
'file1',
'file2',
'file3'
];
const allExist = await every(files, async (file) =>
await access(file)
);
import everySeries from 'apr-every/series'
// import { series as everySeries } from 'apr-every/series'
import everyLimit from 'apr-every/limit'
// import { limit as everyLimit } from 'apr-every/limit'
Returns a new array of all the values in coll
which pass an async truth test.
import filter from 'apr-filter'
const access = thenify(fs.access);
const files = [
'file1',
'file2',
'file3'
];
var existent = await filter(files, async (file) =>
await access(file)
);
import filterSeries from 'apr-filter/series'
// import { series as filterSeries } from 'apr-filter/series'
import filterLimit from 'apr-filter/limit'
// import { limit as filterLimit } from 'apr-filter/limit'
Produces a new collection of values by mapping each value in coll
through the iteratee
function.
import map from 'apr-map'
const stat = thenify(fs.stat);
const files = [
'file1',
'file2',
'file3'
];
const stats = await map(files, async (file) =>
await stat(file);
);
import mapSeries from 'apr-map/series'
// import { series as mapSeries } from 'apr-map/series'
import mapLimit from 'apr-map/limit'
// import { limit as mapLimit } from 'apr-map/limit'
Reduces coll
into a single value using an async iteratee
to return each successive step.
import reduce from 'apr-reduce'
const sum = await reduce([1, 2, 3], async (sum, item) =>
new Promise((resolve) => resolve(sum + item))
);
The opposite of filter
. Removes values that pass an async truth test.
import reject from 'apr-reject'
const access = thenify(fs.access);
const files = [
'file1',
'file2',
'file3'
];
var missing = await reject(files, async (file) =>
await access(file)
);
import rejectSeries from 'apr-reject/series'
// import { series as rejectSeries } from 'apr-reject/series'
import rejectLimit from 'apr-reject/limit'
// import { limit as rejectLimit } from 'apr-reject/limit'
Returns true if at least one element in the coll
satisfies an async test.
import some from 'apr-some'
const access = thenify(fs.access);
const files = [
'file1',
'file2',
'file3'
];
const oneExist = await some(files, async (file) =>
await access(file)
);
import someSeries from 'apr-some/series'
// import { series as someSeries } from 'apr-some/series'
import someLimit from 'apr-some/limit'
// import { limit as someLimit } from 'apr-some/limit'
Sorts a list by the results of running each coll
value through an async iteratee
.
import sortBy from 'apr-sort-by'
const stat = thenify(fs.stat);
const files = [
'file1',
'file2',
'file3'
];
const sorted = await sortBy(files, await (file) => {
const { mtime } = await stat(file);
return mtime;
});
import sortBySeries from 'apr-sort-by/series'
// import { series as sortBySeries } from 'apr-sort-by/series'
import sortByLimit from 'apr-sort-by/limit'
// import { limit as sortByLimit } from 'apr-sort-by/limit'
Creates a function which is a composition of the passed asynchronous functions. Each function consumes the return value of the function that follows. Composing functions f(), g(), and h() would produce the result of f(g(h())).
import compose from 'apr-compose'
const then = (v) => new Promise((resolve) => resolve(v))
const composed = compose(
async (v) => await then(v + 1),
async (v) => await then(v + 2),
async (v) => await then(v + 3)
);
const output = await composed(1); // 7
Run the tasks collection of functions in parallel, without waiting until the previous function has completed.
import parallel from 'apr-parallel'
const then = (v) => new Promise((resolve) => resolve(v))
const withArray = await parallel([
async () => await then(1),
async () => await then(2)
]);
// withArray = [1, 2]
const withObject = await parallel({
one: async () => await then(1),
two: async () => await then(2)
});
// withObject = { one: 1, two: 2 }
Version of the compose function that is more natural to read. Each function consumes the return value of the previous function. It is the equivalent of compose with the arguments reversed.
import seq from 'apr-seq'
const then = (v) => new Promise((resolve) => resolve(v))
const seq = seq([
async (v) => await then(v + 1),
async (v) => await then(v + 2),
async (v) => await then(v + 3)
]);
const output = await seq(1); // 7
Run the functions in the tasks
in series, each one running once the previous function has completed.
import series from 'apr-series'
const then = (v) => new Promise((resolve) => resolve(v))
const withArray = await series([
async () => await then(1),
async () => await then(2)
]);
// withArray = [1, 2]
const withObject = await series({
one: async () => await then(1),
two: async () => await then(2)
});
// withObject = { one: 1, two: 2 }
Repeatedly call fn
until test
returns true
.
import until from 'apr-until'
const then = (v) => new Promise((resolve) => resolve(v))
const maxCalls = 10;
let calls = 0;
const output = await until(async () => {
await then();
return (calls += 1) >= maxCalls;
}, async () => (
await then(calls)
);
// output = 10
Runs the tasks
array of functions in series, each passing their results to the next in the array.
import waterfall from 'apr-waterfall'
const then = (v) => new Promise((resolve) => resolve(v))
const output = await waterfall([
async () => await then(1),
async (v) => await then(v + 2),
async (v) => await then(v + 3)
]);
// output = 6
Repeatedly call fn
, while test
returns true.
import until from 'apr-until'
const then = (v) => new Promise((resolve) => resolve(v))
const maxCalls = 10;
let calls = 0;
const output = await until(async () => {
await then();
return (calls += 1) < maxCalls;
}, async () => (
await then(calls)
);
// output = 10
Creates a continuation function with some arguments already applied.
import parallel from 'apr-parallel'
import apply from 'apr-apply'
const then = (v) => new Promise((resolve) => resolve(v))
const output = await parallel([
apply(then, 1)
apply(then, 2)
apply(then, 3)
]);
// output = [1, 2, 3]
Take a sync function and make it async. This is useful for plugging sync functions into a waterfall
, series
, or other async functions.
import asyncify from 'apr-asyncify'
import waterfall from 'apr-waterfall'
import apply from 'apr-apply'
const readFile = thenify(require('fs').readFile);
const pkgPath = path.join(__dirname, './package.json');
const pkg = await waterfall([
apply(readFile, pkgPath, 'utf8'),
asyncify(JSON.parse)
]);
Returns a promise that when called, then's with the values provided. Useful as the first function in a waterfall
.
import asyncify from 'apr-asyncify'
import waterfall from 'apr-waterfall'
import constant from 'apr-constant'
const pkg = await waterfall([
constant('{"name": "apr"}'),
asyncify(JSON.parse)
]);
Eventually it should have feature parity with caolan/async.
MIT
FAQs
Collection of tools to manage control flow of/with Promises - inspired by [caolan/async](https://github.com/caolan/async).
The npm package apr receives a total of 1 weekly downloads. As such, apr popularity was classified as not popular.
We found that apr demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket researchers uncover a malicious npm package posing as a tool for detecting vulnerabilities in Etherium smart contracts.
Security News
Research
A supply chain attack on Rspack's npm packages injected cryptomining malware, potentially impacting thousands of developers.
Research
Security News
Socket researchers discovered a malware campaign on npm delivering the Skuld infostealer via typosquatted packages, exposing sensitive data.