A comprehensive TypeScript backup library for databases, files, and directories.
- 🗄️ Multi-Database Support - SQLite, PostgreSQL, and MySQL (via Bun's native drivers)
- 📁 File & Directory Backups - Backup individual files or entire directories with filtering
- 🗜️ Compression Support - Optional gzip compression for all backup types
- 🎯 Advanced Filtering - Include/exclude patterns with glob support for directory backups
- 🔄 Retention Policies - Configure backup retention by count or age
- 📁 Flexible Output - Customizable backup file naming and output directories
- ⚡ Performance - Built with Bun for fast execution
- 🧪 Thoroughly Tested - Comprehensive test suite with 95%+ coverage
- 🔧 TypeScript First - Fully typed APIs for better developer experience
- 📦 CLI & Programmatic - Use as a library or command-line tool
# Using Bun (recommended)
bun add backupx
import { createBackup } from 'backupx'
const config = {
verbose: true,
outputPath: './backups',
databases: [
{
type: 'sqlite',
name: 'my-app-db',
path: './data/app.sqlite'
},
{
type: 'postgresql',
name: 'users-db',
connection: 'postgres://user:pass@localhost:5432/myapp'
}
],
files: [
{
name: 'uploads',
path: './public/uploads', // Automatically detected as directory
compress: true,
include: ['*.jpg', '*.png', '*.pdf'],
exclude: ['temp/*']
},
{
name: 'config',
path: './config/app.json', // Automatically detected as file
compress: false
}
],
retention: {
count: 5, // Keep 5 most recent backups
maxAge: 30 // Delete backups older than 30 days
}
}
const summary = await createBackup(config)
console.log(`✅ ${summary.successCount} backups completed`)
console.log(`📊 Database backups: ${summary.databaseBackups.length}`)
console.log(`📁 File backups: ${summary.fileBackups.length}`)
# Create backups.config.ts file first
./backups start --verbose
The library includes a comprehensive test suite covering:
- ✅ Type Safety - TypeScript configuration validation
- ✅ SQLite Backups - Schema extraction, data export, special characters
- ✅ File Backups - Individual file backup with compression and metadata preservation
- ✅ Directory Backups - Full directory backup with glob filtering and size limits
- ✅ Backup Manager - Multi-database and file coordination, error handling
- ✅ Retention Policies - Count-based and age-based cleanup for all backup types
- ✅ Error Scenarios - Database connection failures, permission issues, missing files
- ✅ CLI Integration - Command-line interface functionality
# Run all tests
bun test
# Run tests in watch mode
bun run test:watch
# Run with coverage
bun run test:coverage
# Run specific test files
bun test test/sqlite.test.ts
bun test test/backup-manager.test.ts
test/
├── types.test.ts # Type definitions and configurations
├── config.test.ts # Default configuration validation
├── sqlite.test.ts # SQLite backup functionality
├── file.test.ts # Individual file backup functionality
├── directory.test.ts # Directory backup with filtering
├── backup-manager.test.ts # Multi-database and file coordination
└── index.test.ts # Integration tests and exports
Create a backups.config.ts
file:
import { BackupConfig } from 'backupx'
export const config: BackupConfig = {
verbose: true,
outputPath: './backups',
retention: {
count: 10, // Keep 10 most recent backups
maxAge: 90 // Delete backups older than 90 days
},
databases: [
// SQLite
{
type: 'sqlite',
name: 'app-database',
path: './data/app.sqlite',
compress: true
},
// PostgreSQL
{
type: 'postgresql',
name: 'user-data',
connection: {
hostname: 'localhost',
port: 5432,
database: 'myapp',
username: 'postgres',
password: 'secret'
},
tables: ['users', 'orders'], // Specific tables only
includeSchema: true,
includeData: true
},
// MySQL (when Bun adds support)
{
type: 'mysql',
name: 'analytics',
connection: 'mysql://user:pass@localhost:3306/analytics',
excludeTables: ['temp_logs', 'cache']
}
],
files: [
// Directory backups (automatically detected from path)
{
name: 'app-uploads',
path: './public/uploads',
compress: true,
include: ['*.jpg', '*.png', '*.pdf', '*.doc*'],
exclude: ['temp/*', '*.tmp'],
maxFileSize: 50 * 1024 * 1024, // 50MB max file size
preserveMetadata: true,
followSymlinks: false
},
{
name: 'user-data',
path: './data/users',
compress: false,
exclude: ['*.cache', 'temp/*', '*.log'],
preserveMetadata: true
},
// Individual file backups (automatically detected from path)
{
name: 'app-config',
path: './config/app.json',
compress: false,
preserveMetadata: true
},
{
name: 'env-file',
path: './.env.production',
compress: true,
filename: 'production-env' // Custom filename
}
]
}
- Native
bun:sqlite
driver - Complete schema export (tables, indexes, triggers, views)
- Efficient data export with proper escaping
- Binary data support (BLOB fields)
- Native Bun SQL class
- Connection strings or configuration objects
- Schema extraction and data export
- Batch processing for large datasets
- Waiting for Bun's native MySQL driver
- Placeholder implementation ready
- Recursive directory scanning with configurable depth
- Advanced glob pattern filtering (include/exclude)
- File size limits and symbolic link handling
- Metadata preservation (timestamps, permissions)
- Custom archive format with compression support
- Single file backup with original extension preservation
- Optional gzip compression for any file type
- Metadata preservation in separate
.meta
files - Binary and text file support
- Custom filename and output path configuration
Creates backups for all configured databases.
const manager = new BackupManager(config)
const summary = await manager.createBackup()
import { backupPostgreSQL, backupSQLite } from 'backupx'
const result = await backupSQLite(sqliteConfig, './output')
const result = await backupPostgreSQL(pgConfig, './output')
We welcome contributions! Please see our testing guidelines for running the test suite.
- Fork the repository
- Create a feature branch
- Add tests for new functionality
- Ensure all tests pass:
bun test
- Submit a pull request
MIT License - see LICENSE for details.
Made with 💙