A sophisticated and widespread supply chain attack has struck the NPM ecosystem, compromising the popular @ctrl/tinycolor package, which is downloaded over 2 million times per week.
Guru Baran
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥3👍1
CHALLENGE
const sym1 = Symbol('test');
const sym2 = Symbol('test');
const obj = {
[sym1]: 'value1',
[sym2]: 'value2',
regular: 'value3'
};
const sym3 = Symbol.for('global');
const sym4 = Symbol.for('global');
console.log(sym1 === sym2);
console.log(sym3 === sym4);
console.log(Object.keys(obj).length);
console.log(Object.getOwnPropertySymbols(obj).length);
What is the output?
Anonymous Quiz
25%
false false 3 0
33%
true false 1 2
30%
false true 1 2
12%
true true 0 2
❤3👍1🔥1
CHALLENGE
const pattern = /(?<=\d)(?=(?:\d{3})+(?!\d))/g;
const str = '1234567890';
const result = str.replace(pattern, ',');
console.log(result);
const regex = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/;
const tests = ['Password1', 'password', 'PASSWORD1', 'Pass1'];
tests.forEach(test => {
console.log(`${test}: ${regex.test(test)}`);
});
const capture = /([a-z]+)(\d+)/g;
const text = 'item123 product456';
const matches = [...text.matchAll(capture)];
console.log(matches[1][1]);
🤩4❤2👍1
That is, as opposed to the specified versions. Includes a handy -i interactive mode so you can look at potential upgrades and then opt in to them one by one. v18.2 adds a ‘cooldown’ feature to help protect against supply chain attacks by requiring package versions to be published at least the given number of days before considering them for upgrade.
Raine Revere
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍2🔥1
CHALLENGE
let cache = new Map();
let obj = { name: 'Emma', age: 28 };
function memoize(fn) {
return function(...args) {
const key = JSON.stringify(args);
if (cache.has(key)) {
console.log('Cache hit');
return cache.get(key);
}
const result = fn.apply(this, args);
cache.set(key, result);
return result;
};
}
const process = memoize((data) => {
console.log('Processing:', data.name);
return data.age * 2;
});
process(obj);
process(obj);
obj.age = 30;
process(obj);
console.log('Cache size:', cache.size);
❤3
CHALLENGE
class CustomError extends Error {
constructor(message, code) {
super(message);
this.name = 'CustomError';
this.code = code;
}
}
try {
throw new CustomError('Something went wrong', 500);
} catch (error) {
console.log(error instanceof Error);
console.log(error instanceof CustomError);
console.log(error.name);
console.log(typeof error.code);
}
❤4
What is the output?
Anonymous Quiz
50%
true, true, CustomError, number
36%
false, false, CustomError, number
7%
true, true, Error, number
7%
true, false, Error, string
❤4👍2🔥1
CHALLENGE
class ValidationError extends Error {
constructor(message, code) {
super(message);
this.name = 'ValidationError';
this.code = code;
}
}
function processData(data) {
try {
if (!data) throw new ValidationError('Data required', 'MISSING_DATA');
return data.toUpperCase();
} catch (error) {
if (error instanceof ValidationError) {
console.log(`${error.name}: ${error.message} (${error.code})`);
} else {
console.log(`Unexpected error: ${error.message}`);
}
}
}
processData(null);
processData(42);
❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
🤣40👍3🔥2
CHALLENGE
class StateMachine {
constructor() {
this.state = 'idle';
this.transitions = {
idle: { start: 'running', reset: 'idle' },
running: { pause: 'paused', stop: 'stopped' },
paused: { resume: 'running', stop: 'stopped' },
stopped: { reset: 'idle' }
};
}
transition(action) {
const nextState = this.transitions[this.state]?.[action];
if (nextState) {
this.state = nextState;
return true;
}
return false;
}
}
const sm = new StateMachine();
console.log(sm.transition('start'));
console.log(sm.state);
console.log(sm.transition('reset'));
console.log(sm.state);
❤5👍1🤔1
What is the output?
Anonymous Quiz
27%
true running true idle
37%
true started false started
32%
true running false running
4%
false idle true idle
🔥2❤1👍1
CHALLENGE
const target = { name: 'Sarah', age: 25 };
const handler = {
get(obj, prop) {
if (prop === 'toString') {
return () => `Person: ${obj.name}`;
}
return Reflect.get(obj, prop);
},
has(obj, prop) {
return prop !== 'age' && Reflect.has(obj, prop);
}
};
const proxy = new Proxy(target, handler);
console.log(proxy.name);
console.log('age' in proxy);
console.log(proxy.toString());
What is the output?
Anonymous Quiz
26%
Sarah false [object Object]
37%
Sarah true [object Object]
37%
Sarah false Person: Sarah
0%
undefined false Person: Sarah
🔥3❤2👍1🤩1