or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

archive-control.mdarchive-creation.mdcontent-operations.mdformat-options.mdindex.md
tile.json

content-operations.mddocs/

Content Appending Operations

Methods for adding various types of content to archives including files, directories, streams, buffers, strings, and symbolic links.

Capabilities

Append Content from Various Sources

Appends content to the archive from Buffer, Stream, or String sources.

/**
 * Appends content to archive from Buffer, Stream, or String
 * @param {Buffer|Stream|string} source - Content source
 * @param {EntryData} data - Entry metadata including name (required)
 * @returns {Archiver} This instance for chaining
 * @fires entry - When entry is processed and appended
 */
append(source, data);

Usage Examples:

const archiver = require('archiver');
const fs = require('fs');

const archive = archiver('zip');

// Append string content
archive.append('Hello World!', { name: 'hello.txt' });

// Append buffer content
const buffer = Buffer.from('Binary data', 'utf8');
archive.append(buffer, { name: 'data.bin' });

// Append stream content
const stream = fs.createReadStream('/path/to/source.txt');
archive.append(stream, { name: 'streamed.txt' });

// Append with additional metadata
archive.append('Content with metadata', {
  name: 'file.txt',
  date: new Date('2023-01-01'),
  mode: 0644,
  prefix: 'folder/'
});

Append Files from Filesystem

Appends a file from the filesystem using lazy stream loading.

/**
 * Appends a file from filesystem using lazy stream
 * @param {string} filepath - Path to file on filesystem
 * @param {EntryData} data - Entry metadata including name (required)
 * @returns {Archiver} This instance for chaining
 * @throws {Error} If filepath is empty or not a string
 */
file(filepath, data);

Usage Examples:

// Append file with same name
archive.file('/path/to/document.pdf', { name: 'document.pdf' });

// Append file with different name in archive
archive.file('/path/to/source.txt', { name: 'renamed.txt' });

// Append file to subdirectory in archive
archive.file('/path/to/image.jpg', { name: 'images/photo.jpg' });

// Append file with custom metadata
archive.file('/path/to/executable', { 
  name: 'bin/app',
  mode: 0755,
  date: new Date()
});

Append Directories Recursively

Recursively appends a directory and all its contents to the archive.

/**
 * Recursively appends directory and its contents
 * @param {string} dirpath - Directory path on filesystem
 * @param {string|false} destpath - Destination path in archive, false to use dirpath
 * @param {EntryData|Function} data - Entry metadata or filter/transform function
 * @returns {Archiver} This instance for chaining
 * @throws {Error} If dirpath is empty or not a string
 */
directory(dirpath, destpath, data);

Usage Examples:

// Append entire directory maintaining structure
archive.directory('/path/to/source/dir', 'archived-dir');

// Append directory contents to archive root
archive.directory('/path/to/source/dir', false);

// Append directory with filter function
archive.directory('/path/to/source/dir', 'filtered-dir', function(entryData) {
  // Skip hidden files
  if (entryData.name.startsWith('.')) {
    return false;
  }
  // Modify entry data
  entryData.name = entryData.name.toLowerCase();
  return entryData;
});

// Append directory with static metadata
archive.directory('/path/to/source/dir', 'modified-dir', {
  mode: 0755,
  date: new Date('2023-01-01')
});

Append Files Matching Glob Patterns

Appends files matching glob patterns using readdir-glob for pattern matching.

/**
 * Appends files matching glob pattern
 * @param {string} pattern - Glob pattern to match files
 * @param {Object} options - Glob options passed to readdir-glob
 * @param {EntryData} data - Entry metadata for matched files
 * @returns {Archiver} This instance for chaining
 */
glob(pattern, options, data);

Usage Examples:

// Append all JavaScript files recursively
archive.glob('**/*.js', {}, { name: 'js-files' });

// Append specific file types with options
archive.glob('src/**/*.{js,ts}', {
  cwd: '/project/root',
  ignore: ['**/*.test.js', '**/node_modules/**']
}, { prefix: 'source/' });

// Append with glob options and metadata
archive.glob('docs/**/*.md', {
  cwd: '/project',
  nodir: true, // Skip directories
  follow: true // Follow symlinks
}, {
  mode: 0644,
  date: new Date()
});

Create Symbolic Links

Creates symbolic link entries in the archive (programmatic, no filesystem interaction).

/**
 * Creates symbolic link entry (programmatic, no filesystem interaction)
 * @param {string} filepath - Link path in archive
 * @param {string} target - Link target path
 * @param {number} mode - File mode (optional, defaults to symlink mode)
 * @returns {Archiver} This instance for chaining
 * @throws {Error} If format doesn't support symlinks
 */
symlink(filepath, target, mode);

Usage Examples:

// Create symbolic link
archive.symlink('link-to-file.txt', '../original/file.txt');

// Create symbolic link with custom mode
archive.symlink('bin/app', '../lib/executable', 0755);

// Create directory symlink
archive.symlink('shortcut', '../very/long/path/to/directory');

Note: Symbolic link support depends on the archive format:

  • ZIP: Supported
  • TAR: Supported
  • JSON: Supported (metadata only)

Entry Data Interface

/**
 * Entry metadata for archive entries
 */
interface EntryData {
  /** Entry name including internal path (required) */
  name: string;
  /** Entry date, defaults to current time */
  date?: string | Date;
  /** Entry permissions (0755 for dirs, 0644 for files) */
  mode?: number;
  /** Path prefix for entry name */
  prefix?: string;
  /** Filesystem stats to avoid additional calls */
  stats?: fs.Stats;
}

Method Chaining

All content appending methods return the Archiver instance, enabling fluent method chaining:

const archive = archiver('zip');

archive
  .append('String content', { name: 'string.txt' })
  .file('/path/to/file.pdf', { name: 'document.pdf' })
  .directory('/path/to/dir', 'archived-dir')
  .glob('**/*.js', {}, { prefix: 'scripts/' })
  .symlink('link.txt', 'target.txt')
  .finalize();

Error Handling

Content operation errors that may be thrown:

  • ENTRYNAMEREQUIRED - Entry name must be non-empty string
  • FILEFILEPATHREQUIRED - File filepath must be non-empty string
  • DIRECTORYDIRPATHREQUIRED - Directory dirpath must be non-empty string
  • DIRECTORYFUNCTIONINVALIDDATA - Invalid data returned from directory filter function
  • INPUTSTEAMBUFFERREQUIRED - Input must be valid Stream or Buffer
  • SYMLINKNOTSUPPORTED - Format doesn't support symlink entries
  • SYMLINKFILEPATHREQUIRED - Symlink filepath must be non-empty string
  • SYMLINKTARGETREQUIRED - Symlink target must be non-empty string
  • QUEUECLOSED - Queue closed, cannot append more entries