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
πŸ€” aube: A New Node.js Package Manager

Yes, another one! What’s noteworthy is it comes from the developer of mise, a tool that makes managing numerous languages so much easier. aube’s selling points are raw performance and being a drop-in replacement. Its defaults are also security-focused.

Jeff Dickey
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘3❀2πŸ”₯2
CHALLENGE


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

class NetworkError extends ValidationError {
constructor(message, field, statusCode) {
super(message, field);
this.name = "NetworkError";
this.statusCode = statusCode;
}
}

const err = new NetworkError("Not Found", "endpoint", 404);

console.log([
err instanceof NetworkError,
err instanceof ValidationError,
err instanceof Error,
err instanceof TypeError,
].join(", "));
❀3πŸ‘2πŸ”₯1
πŸ‘€ Optique 1.0: Type-Safe Combinatorial CLI Parser

Build composable parsers for CLIs with type safety, type inference, and built-in shell completion support, plus config file integration and man page generation from the same definitions. v1.0 is the first stable release and Hong compares it to Commander.js and explains why you'd use Optique.

Hong Minhee
Please open Telegram to view this post
VIEW IN TELEGRAM
❀4πŸ”₯2πŸ‘1
CHALLENGE

function* counter(start, end) {
for (let i = start; i <= end; i++) {
yield i;
}
}

function* pipeline() {
const first = yield* counter(1, 3);
console.log("Counter done:", first);

yield "bridge";

const second = yield* counter(7, 9);
console.log("Counter done:", second);
}

const gen = pipeline();

const results = [];
let next = gen.next();
while (!next.done) {
results.push(next.value);
next = gen.next();
}

console.log(results);
❀7πŸ‘2πŸ”₯1
CHALLENGE


const config = {
host: "localhost",
port: 3000,
db: {
name: "mydb",
maxConnections: 10
}
};

Object.freeze(config);

config.port = 9999;
config.db.maxConnections = 99;
config.newProp = "surprise";
delete config.host;

const sealed = Object.seal({ x: 1, y: 2 });
sealed.x = 100;
sealed.z = 999;
delete sealed.y;

console.log(config.port, config.db.maxConnections, config.host);
console.log(sealed.x, sealed.y, sealed.z);
πŸ‘2
CHALLENGE


async function fetchData(id) {
if (id < 0) throw new Error("Invalid ID");
return { id, value: id * 10 };
}

async function process() {
const results = await Promise.allSettled([
fetchData(1),
fetchData(-1),
fetchData(3),
]);

results.forEach(({ status, value, reason }) => {
if (status === "fulfilled") {
console.log(`fulfilled: ${value.id} -> ${value.value}`);
} else {
console.log(`rejected: ${reason.message}`);
}
});
}

process();
❀5πŸ‘3πŸ€”2
🀟 What’s Actually New in JavaScript (And What’s Coming Next)

If you don’t read the specs or endless posts about new language features, this is a great way to catch up. Most of the features are supported in Node, like Promise.try, Set union/intersection/difference, Array.fromAsync, and using, with others soon to land, like Math.sumPrecise and Map.getOrInsert (in Node 26).

Neciu Dan
Please open Telegram to view this post
VIEW IN TELEGRAM
❀7πŸ”₯3πŸ‘2πŸ€”1🀩1
CHALLENGE


const EventEmitter = (() => {
const listeners = new WeakMap();

return class {
constructor() {
listeners.set(this, {});
}

on(event, fn) {
const map = listeners.get(this);
(map[event] ??= []).push(fn);
return this;
}

emit(event, ...args) {
const map = listeners.get(this);
(map[event] ?? []).forEach(fn => fn(...args));
return this;
}
};
})();

const bus = new EventEmitter();
const log = [];

bus
.on("data", val => log.push(`A:${val}`))
.on("data", val => log.push(`B:${val}`))
.on("done", () => log.push("done"));

bus.emit("data", 1).emit("data", 2).emit("done");

console.log(log.join(" | "));
❀5πŸ”₯1
CHALLENGE


class Vehicle {
#speed = 0;

constructor(brand) {
this.brand = brand;
}

accelerate(amount) {
this.#speed += amount;
return this;
}

getSpeed() {
return this.#speed;
}

toString() {
return `${this.brand} @ ${this.#speed}km/h`;
}
}

class Car extends Vehicle {
#gear = 1;

constructor(brand, model) {
super(brand);
this.model = model;
}

shiftUp() {
this.#gear++;
return this;
}

toString() {
return `${super.toString()} [Gear ${this.#gear}]`;
}
}

const car = new Car("Toyota", "Supra");
car.accelerate(60).accelerate(40).shiftUp().shiftUp();

console.log(car.toString());
console.log(car instanceof Car);
console.log(car instanceof Vehicle);
console.log(Object.getPrototypeOf(Car) === Vehicle);
❀3πŸ‘1
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