> archiver
Create ZIP and TAR archives programmatically with Archiver — bundle files, directories, and streams into compressed archives with progress tracking. Use when tasks involve generating downloadable bundles, backing up directories, creating deployment packages, or building export features that zip multiple files together.
curl "https://skillshub.wtf/TerminalSkills/skills/archiver?format=md"Archiver
Create ZIP and TAR archives from files, directories, and streams. Streaming architecture for large archives.
Setup
# Install archiver for creating archives.
npm install archiver
npm install -D @types/archiver
Creating a ZIP Archive
// src/archive/zip.ts — Bundle multiple files into a ZIP archive.
import archiver from "archiver";
import fs from "fs";
export async function createZip(files: string[], outputPath: string): Promise<void> {
const output = fs.createWriteStream(outputPath);
const archive = archiver("zip", { zlib: { level: 9 } });
return new Promise((resolve, reject) => {
output.on("close", () => {
console.log(`Archive created: ${archive.pointer()} bytes`);
resolve();
});
archive.on("error", reject);
archive.pipe(output);
for (const file of files) {
archive.file(file, { name: file.split("/").pop()! });
}
archive.finalize();
});
}
Archiving Directories
// src/archive/directory.ts — Recursively add an entire directory to a ZIP.
import archiver from "archiver";
import fs from "fs";
export async function zipDirectory(sourceDir: string, outputPath: string): Promise<void> {
const output = fs.createWriteStream(outputPath);
const archive = archiver("zip", { zlib: { level: 6 } });
return new Promise((resolve, reject) => {
output.on("close", resolve);
archive.on("error", reject);
archive.pipe(output);
// Add entire directory, preserving structure
archive.directory(sourceDir, false);
// Or nest under a folder name inside the archive
// archive.directory(sourceDir, "my-project");
archive.finalize();
});
}
Adding Buffers and Streams
// src/archive/buffers.ts — Add in-memory content (buffers, strings) to archives
// without writing temporary files.
import archiver from "archiver";
import fs from "fs";
export async function createArchiveFromData(
entries: { name: string; content: string | Buffer }[],
outputPath: string
): Promise<void> {
const output = fs.createWriteStream(outputPath);
const archive = archiver("zip", { zlib: { level: 6 } });
return new Promise((resolve, reject) => {
output.on("close", resolve);
archive.on("error", reject);
archive.pipe(output);
for (const entry of entries) {
archive.append(entry.content, { name: entry.name });
}
archive.finalize();
});
}
// Example: bundle generated reports
// await createArchiveFromData([
// { name: "report.csv", content: csvString },
// { name: "report.json", content: JSON.stringify(data) },
// { name: "README.txt", content: "Generated reports bundle" },
// ], "reports.zip");
TAR Archives
// src/archive/tar.ts — Create gzipped TAR archives for deployment or backup.
import archiver from "archiver";
import fs from "fs";
export async function createTarGz(sourceDir: string, outputPath: string): Promise<void> {
const output = fs.createWriteStream(outputPath);
const archive = archiver("tar", { gzip: true, gzipOptions: { level: 9 } });
return new Promise((resolve, reject) => {
output.on("close", resolve);
archive.on("error", reject);
archive.pipe(output);
archive.directory(sourceDir, false);
archive.finalize();
});
}
Progress Tracking
// src/archive/progress.ts — Track archive creation progress for large bundles.
import archiver from "archiver";
import fs from "fs";
export async function createZipWithProgress(
sourceDir: string,
outputPath: string,
onProgress: (percent: number) => void
): Promise<void> {
const output = fs.createWriteStream(outputPath);
const archive = archiver("zip", { zlib: { level: 6 } });
return new Promise((resolve, reject) => {
output.on("close", resolve);
archive.on("error", reject);
archive.on("progress", (progress) => {
const percent = (progress.entries.processed / progress.entries.total) * 100;
onProgress(Math.round(percent));
});
archive.pipe(output);
archive.directory(sourceDir, false);
archive.finalize();
});
}
Streaming to HTTP Response
// src/archive/api.ts — Stream a ZIP archive directly to an Express response
// without writing to disk.
import archiver from "archiver";
import type { Response } from "express";
export function streamZipResponse(
res: Response,
files: { name: string; content: string | Buffer }[]
) {
res.setHeader("Content-Type", "application/zip");
res.setHeader("Content-Disposition", "attachment; filename=export.zip");
const archive = archiver("zip", { zlib: { level: 6 } });
archive.pipe(res);
for (const file of files) {
archive.append(file.content, { name: file.name });
}
archive.finalize();
}
> related_skills --same-repo
> zustand
You are an expert in Zustand, the small, fast, and scalable state management library for React. You help developers manage global state without boilerplate using Zustand's hook-based stores, selectors for performance, middleware (persist, devtools, immer), computed values, and async actions — replacing Redux complexity with a simple, un-opinionated API in under 1KB.
> zoho
Integrate and automate Zoho products. Use when a user asks to work with Zoho CRM, Zoho Books, Zoho Desk, Zoho Projects, Zoho Mail, or Zoho Creator, build custom integrations via Zoho APIs, automate workflows with Deluge scripting, sync data between Zoho apps and external systems, manage leads and deals, automate invoicing, build custom Zoho Creator apps, set up webhooks, or manage Zoho organization settings. Covers Zoho CRM, Books, Desk, Projects, Creator, and cross-product integrations.
> zod
You are an expert in Zod, the TypeScript-first schema declaration and validation library. You help developers define schemas that validate data at runtime AND infer TypeScript types at compile time — eliminating the need to write types and validators separately. Used for API input validation, form validation, environment variables, config files, and any data boundary.
> zipkin
Deploy and configure Zipkin for distributed tracing and request flow visualization. Use when a user needs to set up trace collection, instrument Java/Spring or other services with Zipkin, analyze service dependencies, or configure storage backends for trace data.