JavaScript
31.6K subscribers
1.17K photos
10 videos
33 files
842 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


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(" | "));
πŸ”₯1
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
❀6πŸ‘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));
❀1
πŸ‘€ 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));
❀2πŸ‘1πŸ”₯1🀩1
πŸ€” How can you not love a project homepage where you're a cat in a convertible driving through an endless barrage of obstacles? Crashcat is a JavaScript 3D rigid body physics library built for games, simulations, and web experiences, complete with numerous fun examples.
Please open Telegram to view this post
VIEW IN TELEGRAM
❀4πŸ”₯2πŸ‘1
CHALLENGE


function createCounter() {
let count = 0;

return {
increment() { count++; },
decrement() { count--; },
getCount() { return count; },
reset: () => { count = 0; }
};
}

const counter = createCounter();
counter.increment();
counter.increment();
counter.increment();
counter.decrement();

const { getCount, reset } = counter;

console.log(counter.getCount());
reset();
console.log(getCount());
❀2πŸ‘1
What is the output?
Anonymous Quiz
21%
undefined 0
24%
2 1
45%
2 0
10%
3 0
πŸ€”2❀1🀩1
CHALLENGE

class Pipeline {
#value;
#log = [];

constructor(value) {
this.#value = value;
}

map(fn) {
this.#value = fn(this.#value);
this.#log.push(`map:${this.#value}`);
return this;
}

filter(fn) {
if (Array.isArray(this.#value)) {
this.#value = this.#value.filter(fn);
this.#log.push(`filter:${this.#value}`);
}
return this;
}

reduce(fn, init) {
if (Array.isArray(this.#value)) {
this.#value = this.#value.reduce(fn, init);
this.#log.push(`reduce:${this.#value}`);
}
return this;
}

result() {
console.log(this.#log.join(' | '));
return this.#value;
}
}

new Pipeline([1, 2, 3, 4, 5, 6])
.filter(n => n % 2 === 0)
.map(arr => arr.map(n => n ** 2))
.reduce((acc, n) => acc + n, 0)
.result();
❀3πŸ‘3πŸ”₯1
🌲 NodeBook: An Advanced Guide to Node.js Internals

Volume I of this in-depth guide is now complete with eight chapters of advanced material covering topics like event loop internals, what V8 does, buffer allocation, streams, module resolution, async/await, and the process lifecycle.

Ishtmeet Singh
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘5❀2🀩2πŸ”₯1
CHALLENGE

const name = "Taylor";
const age = 28;
const role = "engineer";

const user = {
name,
age,
role,
greet() {
return `Hi, I'm ${this.name}, age ${this.age}`;
},
get info() {
return `${this.role.toUpperCase()} @ ${this.age}`;
}
};

const { name: userName, info, greet } = user;

console.log(userName);
console.log(info);
console.log(greet.call({ name: "Jordan", age: 35 }));
πŸ”₯1
🌟 Bun v1.3.14 Adds Image Processing, HTTP/3, HTTP/2 Fetch and More

Another mammoth Bun release. Bun.Image is a new built-in image processing API which can replace Sharp in many cases. Bun’s package manager has added a global virtual store (akin to pnpm’s), Bun.serve has experimental HTTP/3 over QUIC support, and fetch gets HTTP/2 and HTTP/3 support. Plus the usual raft of Node.js compatibility improvements.

Jarred Sumner
Please open Telegram to view this post
VIEW IN TELEGRAM
❀4πŸ‘4πŸ€”1
CHALLENGE

const handler = {
get(target, prop, receiver) {
if (prop in target) {
const value = Reflect.get(target, prop, receiver);
return typeof value === "number" ? value * 2 : value;
}
return `Property "${prop}" not found`;
},
set(target, prop, value) {
if (typeof value !== "number") {
throw new TypeError("Only numbers allowed");
}
Reflect.set(target, prop, value ** 2);
return true;
},
has(target, prop) {
return prop.startsWith("_") ? false : prop in target;
},
};

const store = new Proxy({ _secret: 99, score: 5 }, handler);

store.level = 3;

console.log(store.score);
console.log(store.level);
console.log("_secret" in store);
console.log("score" in store);
console.log(store._secret);
πŸ”₯1
CHALLENGE


class Range {
constructor(start, end, step = 1) {
this.start = start;
this.end = end;
this.step = step;
}

[Symbol.iterator]() {
let current = this.start;
const { end, step } = this;
return {
next() {
if (current <= end) {
const value = current;
current += step;
return { value, done: false };
}
return { value: undefined, done: true };
}
};
}
}

const range = new Range(1, 10, 3);
const result = [...range].map(n => n ** 2);
console.log(result);
❀3