JavaScript
31.6K subscribers
1.17K photos
10 videos
33 files
844 links
A resourceful newsletter featuring the latest and most important news, articles, books and updates in the world of #javascript ๐Ÿš€ Don't miss our Quizzes!

Let's chat: @nairihar
Download Telegram
CHALLENGE

const delay = (ms, val) => new Promise(res => setTimeout(res, ms, val));

async function pipeline(...fns) {
return async (input) => {
let result = input;
for (const fn of fns) {
result = await fn(result);
}
return result;
};
}

const double = async (x) => delay(10, x * 2);
const addTen = async (x) => delay(10, x + 10);
const square = async (x) => delay(10, x ** 2);

(async () => {
const process = await pipeline(double, addTen, square);
const output = await process(3);
console.log(output);
})();
โค2๐Ÿ‘1๐Ÿ”ฅ1
What is the output?
Anonymous Quiz
29%
256
49%
1024
16%
196
5%
324
โค2๐Ÿ”ฅ1
CHALLENGE


const inventory = new Map([
["sword", { quantity: 3, weight: 15 }],
["shield", { quantity: 1, weight: 25 }],
["potion", { quantity: 10, weight: 2 }],
]);

inventory.set("bow", { quantity: 2, weight: 8 });
inventory.delete("shield");

const totalWeight = [...inventory.entries()].reduce((acc, [item, { quantity, weight }]) => {
return acc + quantity * weight;
}, 0);

const heaviestItem = [...inventory.entries()].reduce((max, [item, data]) =>
data.weight > max.weight ? { name: item, ...data } : max,
{ name: "", weight: 0 }
);

console.log(inventory.size, totalWeight, heaviestItem.name);
โค3๐Ÿ‘2
โค4๐Ÿ‘2
CHALLENGE

const ops = {
add: (a, b) => a + b,
subtract: (a, b) => a - b,
multiply: (a, b) => a * b,
divide: (a, b) => b !== 0 ? a / b : NaN,
};

const pipeline = (...fns) => (value) => fns.reduce((acc, fn) => fn(acc), value);

const double = (x) => ops.multiply(x, 2);
const addTen = (x) => ops.add(x, 10);
const halve = (x) => ops.divide(x, 2);
const subtractThree = (x) => ops.subtract(x, 3);

const transform = pipeline(double, addTen, halve, subtractThree);

const results = [5, 0, -4].map(transform);
console.log(results);
โค4๐Ÿ‘2๐Ÿ”ฅ1
1โค5๐Ÿ”ฅ2๐Ÿ‘1
CHALLENGE

const values = [0.1 + 0.2, NaN, Infinity, -0, 42.6789];

const results = values.map((v, i) => {
if (i === 0) return Number.isInteger(v) + " | " + v.toFixed(2);
if (i === 1) return Number.isFinite(v) + " | " + Number.isNaN(v);
if (i === 2) return Number.isFinite(v) + " | " + Number.MAX_SAFE_INTEGER;
if (i === 3) return Object.is(v, -0) + " | " + (v === 0);
if (i === 4) return v.toFixed(2) + " | " + v.toPrecision(4);
});

results.forEach(r => console.log(r));
โค4๐Ÿ”ฅ2๐Ÿค”2
๐ŸคŸ Node.js 26.0 (Current) Released

It's here! Complete with the Temporal API enabled by default, V8 14.6 (say hello to map โ€˜upsertโ€™ methods like Map.prototype.getOrInsert() and iterator sequencing with Iterator.concat()), plus Undici 8. v26 is the โ€˜Currentโ€™ cutting-edge release until October when it gets promoted to LTS.

Rafael Gonzaga
Please open Telegram to view this post
VIEW IN TELEGRAM
โค4๐Ÿ”ฅ3๐Ÿ‘2๐Ÿคฉ1
CHALLENGE

const items = [
{ name: "banana", price: 1.5, qty: 10 },
{ name: "apple", price: 1.5, qty: 5 },
{ name: "cherry", price: 3.0, qty: 8 },
{ name: "date", price: 2.0, qty: 8 },
];

const sorted = [...items].sort((a, b) => {
if (a.price !== b.price) return a.price - b.price;
if (a.qty !== b.qty) return b.qty - a.qty;
return a.name.localeCompare(b.name);
});

console.log(sorted.map(i => `${i.name}:${i.qty}`).join(", "));
๐Ÿ”ฅ5โค2
๐Ÿ˜ฎ html-to-text 10.0: Advanced HTML to Text Converter

Uses a variety of techniques to convert even complex HTML into plain text (but with some formatting, such as for tables). v10 brings the project up to modern standards.

KillyMXI
Please open Telegram to view this post
VIEW IN TELEGRAM
โค4๐Ÿ‘1
CHALLENGE


class DatabaseError extends Error {
constructor(message, code) {
super(message);
this.name = "DatabaseError";
this.code = code;
}
}

class ConnectionError extends DatabaseError {
constructor(host) {
super(`Failed to connect to ${host}`, 503);
this.name = "ConnectionError";
this.host = host;
}
}

const err = new ConnectionError("db.server.io");

console.log([
err instanceof ConnectionError,
err instanceof DatabaseError,
err instanceof Error,
err.name,
err.code,
err.message,
].join(" | "));
๐Ÿ”ฅ2
What is the output?
Anonymous Quiz
34%
true | true | true | DatabaseError | 503 | Failed to connect to db.server.io
22%
true | false | true | ConnectionError | 503 | Failed to connect to db.server.io
30%
true | true | true | ConnectionError | 503 | Failed to connect to db.server.io
๐Ÿ‘€ Remix 3 Enters Beta โ€” It's No Longer a React Framework

Remix has quite the back story. Created by the duo behind React Router in 2020 and seen as an alternative to Next.js, Remix was acquired by Shopify in 2022 and its core ideas folded into React Router v7 in 2024. Now, a new direction: a full-stack, web standards-first framework with its own UI component model andโ€ฆ no React.

Michael Jackson (Remix)
Please open Telegram to view this post
VIEW IN TELEGRAM
โค7๐Ÿ‘2๐Ÿ”ฅ2
CHALLENGE

const compose = (...fns) => (x) => fns.reduceRight((acc, fn) => fn(acc), x);
const pipe = (...fns) => (x) => fns.reduce((acc, fn) => fn(acc), x);

const double = (x) => x * 2;
const addTen = (x) => x + 10;
const square = (x) => x ** 2;
const negate = (x) => -x;

const transform1 = compose(negate, square, addTen, double);
const transform2 = pipe(double, addTen, square, negate);

const memoize = (fn) => {
const cache = new Map();
return (x) => {
if (!cache.has(x)) cache.set(x, fn(x));
return cache.get(x);
};
};

const memoTransform1 = memoize(transform1);

console.log(transform1(3));
console.log(transform2(3));
console.log(memoTransform1(3) === transform1(3));
โค2
๐Ÿ‘€ Anime.js 4.4: The Flexible JavaScript Animation Engine

At ten years old, the โ€˜animate anything from JavaScriptโ€™ library continues to get even better with a new scrambleText effect and auto-grid layout mode for stagger grids. The docs for Anime are truly top-tier and packed with examples.

Julian Garnier
Please open Telegram to view this post
VIEW IN TELEGRAM
โค5๐Ÿ‘2๐Ÿ”ฅ1๐Ÿคฉ1
CHALLENGE

function processData(value) {
let result = "start";

try {
result += " -> try";
if (value === null) throw new TypeError("Null value");
if (value < 0) throw new RangeError("Negative value");
result += " -> success";
return result;
} catch (e) {
result += ` -> catch(${e.constructor.name})`;
return result;
} finally {
result += " -> finally";
console.log(result);
}
}

console.log(processData(null));
โค3๐Ÿ‘1๐Ÿ”ฅ1๐Ÿคฉ1