Map over promises with concurrency control. Same API as p-map, but ships both ESM and CJS with zero dependencies.
import { pMap } from "tiny-pmap";
const pages = await pMap(urls, (url) => fetch(url).then((r) => r.text()), {
concurrency: 5,
});~1.2 KB gzipped. Zero dependencies. Replaces p-map without the ESM-only headache.
Demo built with remotion-readme-kit
npm install tiny-pmapimport { pMap } from "tiny-pmap";
const users = await pMap([1, 2, 3, 4, 5], (id) => fetchUser(id), {
concurrency: 3,
});import { pMap, pMapSkip } from "tiny-pmap";
const adults = await pMap(users, (user) => {
if (user.age < 18) return new pMapSkip();
return user;
});async function* generateIds() {
for (let i = 0; i < 100; i++) yield i;
}
const results = await pMap(generateIds(), (id) => process(id), {
concurrency: 10,
});try {
await pMap(items, riskyOperation, { stopOnError: false, concurrency: 5 });
} catch (error) {
// AggregateError with all failures
console.log(error.errors);
}const controller = new AbortController();
setTimeout(() => controller.abort(), 5000);
await pMap(urls, fetchPage, {
concurrency: 3,
signal: controller.signal,
});p-map v7+ is ESM-only. If you require("p-map") in a CommonJS project, you get ERR_REQUIRE_ESM. tiny-map works with both import and require().
p-map |
tiny-map |
|
|---|---|---|
| CJS support | v5 only (v6+ ESM-only) | ESM + CJS |
| Dependencies | none | 0 |
| TypeScript | separate @types | native |
| Export | default | named |
- import pMap from "p-map";
+ import { pMap } from "tiny-pmap";One line. Everything else stays the same.
Maps over input with the mapper function, limiting concurrency.
input-IterableorAsyncIterablemapper(element, index)- function returning a value or promiseoptions.concurrency- max parallel executions (default:Infinity)options.stopOnError- throw on first error or collect all (default:true)options.signal-AbortSignalfor cancellation
Returns Promise<NewElement[]> with results in input order.
Return new pMapSkip() from the mapper to exclude that element from results.
Drop-in replacements for sindresorhus async utilities. All ship ESM + CJS with zero dependencies.
| Package | Replaces | What it does |
|---|---|---|
| tiny-limit | p-limit | Concurrency limiter |
| tiny-map | p-map | Concurrent map with order |
| tiny-retry | p-retry | Retry with exponential backoff |
| tiny-queue | p-queue | Priority task queue |
| tiny-ms | ms | Parse/format durations |
| tiny-escape | escape-string-regexp | Escape regex chars |
Want all async utilities in one import? Use tiny-pasync.
If this saved you from ERR_REQUIRE_ESM, star the repo or open an issue if something breaks.
