Auto-generated tile from GitHub (10 skills)
92
94%
Does it follow best practices?
Impact
92%
1.16xAverage score across 44 eval scenarios
Advisory
Suggest reviewing before use
Always use pipeline instead of .pipe() for proper error handling:
import { pipeline } from 'node:stream/promises';
import { createReadStream, createWriteStream } from 'node:fs';
import { createGzip } from 'node:zlib';
async function compressFile(input: string, output: string): Promise<void> {
await pipeline(
createReadStream(input),
createGzip(),
createWriteStream(output)
);
}Use async generators for transformation:
import { pipeline } from 'node:stream/promises';
import { createReadStream, createWriteStream } from 'node:fs';
async function* toUpperCase(source: AsyncIterable<Buffer>): AsyncGenerator<string> {
for await (const chunk of source) {
yield chunk.toString().toUpperCase();
}
}
async function processFile(input: string, output: string): Promise<void> {
await pipeline(
createReadStream(input),
toUpperCase,
createWriteStream(output)
);
}Chain multiple async generators:
import { pipeline } from 'node:stream/promises';
async function* parseLines(source: AsyncIterable<Buffer>): AsyncGenerator<string> {
let buffer = '';
for await (const chunk of source) {
buffer += chunk.toString();
const lines = buffer.split('\n');
buffer = lines.pop() ?? '';
for (const line of lines) {
yield line;
}
}
if (buffer) yield buffer;
}
async function* filterNonEmpty(source: AsyncIterable<string>): AsyncGenerator<string> {
for await (const line of source) {
if (line.trim()) {
yield line + '\n';
}
}
}
await pipeline(
createReadStream('input.txt'),
parseLines,
filterNonEmpty,
createWriteStream('output.txt')
);Use async iterators for consuming streams:
import { createReadStream } from 'node:fs';
import { createInterface } from 'node:readline';
async function processLines(filePath: string): Promise<void> {
const fileStream = createReadStream(filePath);
const rl = createInterface({
input: fileStream,
crlfDelay: Infinity,
});
for await (const line of rl) {
await processLine(line);
}
}Create readable streams from iterables:
import { Readable } from 'node:stream';
async function* generateData(): AsyncGenerator<string> {
for (let i = 0; i < 100; i++) {
yield JSON.stringify({ id: i, timestamp: Date.now() }) + '\n';
}
}
const stream = Readable.from(generateData());Respect backpressure signals using once from events:
import { Writable } from 'node:stream';
import { once } from 'node:events';
async function writeData(
writable: Writable,
data: string[]
): Promise<void> {
for (const chunk of data) {
const canContinue = writable.write(chunk);
if (!canContinue) {
await once(writable, 'drain');
}
}
}Use stream consumers for common operations:
import { text, json, buffer } from 'node:stream/consumers';
import { Readable } from 'node:stream';
async function readStreamAsJson<T>(stream: Readable): Promise<T> {
return json(stream) as Promise<T>;
}
async function readStreamAsText(stream: Readable): Promise<string> {
return text(stream);
}evals
scenario-1
scenario-2
scenario-3
scenario-4
scenario-5
scenario-6
scenario-7
scenario-8
scenario-9
scenario-10
scenario-11
scenario-12
scenario-13
scenario-14
scenario-15
scenario-16
scenario-17
scenario-18
scenario-19
scenario-20
scenario-21
scenario-22
scenario-23
scenario-24
scenario-25
scenario-26
scenario-27
scenario-28
scenario-29
scenario-30
scenario-31
scenario-32
scenario-33
scenario-34
scenario-35
scenario-36
scenario-37
scenario-38
scenario-39
scenario-40
scenario-41
scenario-42
scenario-43
scenario-44
skills
documentation
fastify
init
linting-neostandard-eslint9
node
nodejs-core
rules
oauth
octocat
snipgrapher