Archiver

a streaming interface for archive generation

Visit the API documentation for a list of all methods available.

Install

npm install archiver --save

Quick Start

// require modules
var fs = require('fs');
var archiver = require('archiver');

// create a file to stream archive data to.
var output = fs.createWriteStream(__dirname + '/example.zip');
var archive = archiver('zip', {
  zlib: { level: 9 } // Sets the compression level.
});

// listen for all archive data to be written
// 'close' event is fired only when a file descriptor is involved
output.on('close', function() {
  console.log(archive.pointer() + ' total bytes');
  console.log('archiver has been finalized and the output file descriptor has closed.');
});

// This event is fired when the data source is drained no matter what was the data source.
// It is not part of this library but rather from the NodeJS Stream API.
// @see: https://nodejs.org/api/stream.html#stream_event_end
output.on('end', function() {
  console.log('Data has been drained');
});

// good practice to catch warnings (ie stat failures and other non-blocking errors)
archive.on('warning', function(err) {
  if (err.code === 'ENOENT') {
    // log warning
  } else {
    // throw error
    throw err;
  }
});

// good practice to catch this error explicitly
archive.on('error', function(err) {
  throw err;
});

// pipe archive data to the file
archive.pipe(output);

// append a file from stream
var file1 = __dirname + '/file1.txt';
archive.append(fs.createReadStream(file1), { name: 'file1.txt' });

// append a file from string
archive.append('string cheese!', { name: 'file2.txt' });

// append a file from buffer
var buffer3 = Buffer.from('buff it!');
archive.append(buffer3, { name: 'file3.txt' });

// append a file
archive.file('file1.txt', { name: 'file4.txt' });

// append files from a sub-directory and naming it `new-subdir` within the archive
archive.directory('subdir/', 'new-subdir');

// append files from a sub-directory, putting its contents at the root of archive
archive.directory('subdir/', false);

// append files from a glob pattern
archive.glob('subdir/*.txt');

// finalize the archive (ie we are done appending files but streams have to finish yet)
// 'close', 'end' or 'finish' may be fired right after calling this method so register to them beforehand
archive.finalize();

Formats

Archiver ships with out of the box support for TAR and ZIP archives.

You can register additional formats with registerFormat.

Formats will be changing in the future to implement a middleware approach.

Changelog

5.0.0 - July 22, 2020Diff

  • breaking: absolute path glob patterns are no longer supported: use cwd option instead.
  • Replaced glob with readdir-glob to be memory efficient (#433) @Yqnn
  • Bump zip-stream from 4.0.0 to 4.0.2 (#431) @dependabot
  • Bump zip-stream from 3.0.1 to 4.0.0 (#430) @dependabot
  • Bump mocha from 6.2.3 to 8.0.1 (#424) @dependabot
  • Bump tar from 4.4.13 to 6.0.2 (#426) @dependabot
  • Bump tar-stream from 2.1.2 to 2.1.3 (#427) @dependabot
  • Bump rimraf from 2.7.1 to 3.0.2 (#425) @dependabot
  • Bump actions/setup-node from v1 to v2.1.0 (#428) @dependabot
  • Bump actions/checkout from v1 to v2.3.1 (#429) @dependabot
  • Bump lodash from 4.17.15 to 4.17.19 (#423) @dependabot

4.0.2 - July 11, 2020Diff

  • update to async@^3.2.0 (#420)

4.0.1 - April 14, 2020Diff

  • update to zip-stream@^3.0.1

4.0.0 - April 14, 2020Diff

  • breaking: slowly catch up with node LTS, remove support for versions under 8.
  • update multiple deps.
  • fix for a hang with _statQueue (#388)

3.1.1 - August 2, 2019Diff

  • update zip-stream to v2.1.2

3.1.0 - August 2, 2019Diff

  • update zip-stream to v2.1.0

3.0.3 - July 19, 2019Diff

  • test: now targeting node v12
  • other: update zip-stream@2.0.0

3.0.2 - July 19, 2019Diff

  • other: update dependencies

3.0.1 - July 19, 2019Diff

  • other: update dependencies
  • docs: now deployed using netlify

3.0.0 - August 22, 2018Diff

  • breaking: follow node LTS, remove support for versions under 6. (#339)
  • bugfix: use stats in tar.js and core.js (#326)
  • other: update to archiver-utils@2 and zip-stream@2
  • other: remove lodash npm module usage (#335, #339)
  • other: Avoid using deprecated Buffer constructor (#312)
  • other: Remove unnecessary return and fix indentation (#297)
  • test: now targeting node v10 (#320)

2.1.1January 10, 2018Diff

  • bugfix: fix relative symlink paths (#293)
  • other: coding style fixes (#294)

2.1.0October 12, 2017Diff

  • refactor: directory now uses glob behind the scenes. should fix some directory recursion issues. (#267, #275)
  • docs: more info in quick start. (#284)

2.0.3August 25, 2017Diff

  • bugfix: revert #261 due to potential issues with editing entryData in special cases.
  • bugfix: add var to entryData in glob callback (#273)

2.0.2August 25, 2017Diff

  • docs: fix changelog date.

2.0.1August 25, 2017Diff

  • bugfix: add const to entryData in glob callback (#261)
  • other: coding style fixes (#263)

2.0.0July 5, 2017Diff

  • feature: support for symlinks. (#228)
  • feature: support for promises on finalize. (#248)
  • feature: addition of symlink method for programmatically creating symlinks within an archive.
  • change: emit warning instead of error when stat fails and the process can still continue.
  • change: errors and warnings now contain extended data (where available) and have standardized error codes (#256)
  • change: removal of deprecated bulk functionality. (#249)
  • change: removal of internal _entries property in favor of progress event. (#247)
  • change: support for node v4.0+ only. node v0.10 and v0.12 support has been dropped. (#241)

1.3.0December 13, 2016Diff

  • improve directory and glob methods to use events rather than callbacks. (#203)
  • fix bulk warning spam (#208)
  • updated mocha (#205)

1.2.0November 2, 2016Diff

  • Add a process.emitWarning for deprecated (#202)

1.1.0August 29, 2016Diff

  • minor doc fixes.
  • bump deps to ensure latest versions are used.

1.0.1July 27, 2016Diff

  • minor doc fixes.
  • dependencies upgraded.

1.0.0April 5, 2016Diff

  • version unification across many archiver packages.
  • dependencies upgraded and now using semver caret (^).

0.21.0December 21, 2015Diff

  • core: add support for entry.prefix. update some internals to use it.
  • core(glob): when setting options.cwd get an absolute path to the file and use the relative path for entry.name. #173
  • core(bulk): soft-deprecation of bulk feature. will remain for time being with no new features or support.
  • docs: initial jsdoc for core. http://archiverjs.com/docs
  • tests: restructure a bit.

0.20.0November 30, 2015Diff

  • simpler path normalization as path.join was a bit restrictive. #162
  • move utils to separate module to DRY.

Release Archive