plugins/backend-and-infra/skills/javascript-pro/SKILL.md
Write modern JavaScript with ES6+ features, async patterns, and Node.js APIs. Use when writing JavaScript code, debugging async issues, handling promises, optimizing JS performance, or working with the event loop.
npx skillsauth add arosenkranz/claude-code-config javascript-proInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Guidelines for modern JavaScript and async programming patterns.
// Nullish coalescing (??) - only null/undefined
const port = config.port ?? 3000;
// Optional chaining (?.)
const city = user?.address?.city;
const result = obj.method?.();
// Combined pattern
const name = data?.user?.name ?? 'Anonymous';
// Nested destructuring with defaults
const { user: { name = 'Guest', role = 'viewer' } = {} } = response;
// Rest in destructuring
const { id, ...rest } = obj;
// Spread for immutable updates
const updated = { ...original, status: 'active' };
const combined = [...arr1, ...arr2];
// Array.at() for negative indexing
const last = arr.at(-1);
// Object.fromEntries() for object creation
const obj = Object.fromEntries([['a', 1], ['b', 2]]);
// Array.prototype.flatMap()
const words = sentences.flatMap(s => s.split(' '));
// Object.hasOwn() (safer than hasOwnProperty)
if (Object.hasOwn(obj, 'key')) { }
// Promise.all - fail fast, all must succeed
const [users, posts] = await Promise.all([
fetchUsers(),
fetchPosts()
]);
// Promise.allSettled - get all results regardless of failures
const results = await Promise.allSettled([
riskyOperation1(),
riskyOperation2()
]);
const successes = results.filter(r => r.status === 'fulfilled');
// Promise.race - first to complete wins
const result = await Promise.race([
fetchData(),
timeout(5000)
]);
// Promise.any - first success wins (ignores rejections)
const fastest = await Promise.any([
fetchFromCDN1(),
fetchFromCDN2()
]);
// Wrapper for clean try/catch
async function safeAsync(promise) {
try {
const data = await promise;
return [data, null];
} catch (error) {
return [null, error];
}
}
// Usage
const [user, error] = await safeAsync(fetchUser(id));
if (error) {
console.error('Failed to fetch user:', error.message);
return;
}
// for-await-of for async iterables
async function* paginate(url) {
let nextUrl = url;
while (nextUrl) {
const response = await fetch(nextUrl);
const data = await response.json();
yield data.items;
nextUrl = data.nextPage;
}
}
for await (const page of paginate('/api/items')) {
processItems(page);
}
async function processWithLimit(items, fn, limit = 5) {
const results = [];
const executing = new Set();
for (const item of items) {
const promise = fn(item).then(result => {
executing.delete(promise);
return result;
});
executing.add(promise);
results.push(promise);
if (executing.size >= limit) {
await Promise.race(executing);
}
}
return Promise.all(results);
}
// Named exports for utilities
export function formatDate(date) { }
export function parseDate(str) { }
// Default export for main class/function
export default class ApiClient { }
// Re-exports for barrel files
export { formatDate, parseDate } from './dates.js';
export { default as ApiClient } from './client.js';
// Code splitting with dynamic imports
const module = await import('./heavy-module.js');
// Conditional loading
if (featureEnabled) {
const { Feature } = await import('./feature.js');
new Feature().init();
}
import { readFile, writeFile, mkdir } from 'fs/promises';
import { existsSync } from 'fs';
async function ensureDir(path) {
if (!existsSync(path)) {
await mkdir(path, { recursive: true });
}
}
const content = await readFile('config.json', 'utf-8');
const config = JSON.parse(content);
import { createReadStream, createWriteStream } from 'fs';
import { pipeline } from 'stream/promises';
import { createGzip } from 'zlib';
await pipeline(
createReadStream('input.txt'),
createGzip(),
createWriteStream('output.txt.gz')
);
import { describe, it, expect, vi } from 'vitest';
describe('UserService', () => {
it('fetches user by id', async () => {
const mockFetch = vi.fn().mockResolvedValue({
json: () => Promise.resolve({ id: 1, name: 'Test' })
});
const user = await fetchUser(1, { fetch: mockFetch });
expect(user.name).toBe('Test');
expect(mockFetch).toHaveBeenCalledWith('/api/users/1');
});
});
Map/Set for frequent lookups (O(1) vs O(n))requestAnimationFrame for DOM updatesfor...of over forEach for break/continue support== instead of ===var instead of const/lettools
Lightweight orchestrator for spec-before-plan workflow. Use when starting a feature with ambiguous requirements. Walks SPEC.md → PLAN.md → execute, delegating to /superpowers:writing-plans and /superpowers:executing-plans. Invoke when asked to "spec this out", "spec-first", "spec and plan for X", or when feature requirements are vague.
tools
Problem Statement Co-Authoring Skill
development
Structure and maintain professional brag documents with clear templates for accomplishments, projects, and growth tracking. Use when documenting achievements, creating brag document entries, formatting accomplishments, or tracking career progress.
development
Analyze technical documentation for clarity, conciseness, and effectiveness using Google Technical Writing principles. Use when reviewing documentation, checking writing quality, improving docs, or providing writing feedback.