UNPKG

sanity

Version:

Sanity is a real-time content infrastructure with a scalable, hosted backend featuring a Graph Oriented Query Language (GROQ), asset pipelines and fast edge caches

52 lines (39 loc) 1.47 kB
import {createWriteStream} from 'node:fs' import zlib from 'node:zlib' import {type ProgressData} from 'archiver' import debug from './debug' const archiver = require('archiver') // ProgressCb is a callback that is called with the number of bytes processed so far. type ProgressCb = (processedBytes: number) => void // archiveDir creates a tarball of the given directory and writes it to the given file path. function archiveDir(tmpOutDir: string, outFilePath: string, progressCb: ProgressCb): Promise<void> { return new Promise((resolve, reject) => { const archiveDestination = createWriteStream(outFilePath) archiveDestination.on('error', (err: Error) => { reject(err) }) archiveDestination.on('close', () => { resolve() }) const archive = archiver('tar', { gzip: true, gzipOptions: {level: zlib.constants.Z_DEFAULT_COMPRESSION}, }) archive.on('error', (err: Error) => { debug('Archiving errored!\n%s', err.stack) reject(err) }) // Catch warnings for non-blocking errors (stat failures and others) archive.on('warning', (err: Error) => { debug('Archive warning: %s', err.message) }) archive.on('progress', (progress: ProgressData) => { progressCb(progress.fs.processedBytes) }) // Pipe archive data to the file archive.pipe(archiveDestination) archive.directory(tmpOutDir, false) archive.finalize() }) } export default archiveDir