Database migration framework for Node.js applications that enables developers to programmatically manage database schema changes and evolution over time.
—
Quality
Pending
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Pending
The risk profile of this skill
Configuration system for setting up database connections, environments, and migration settings. db-migrate supports multiple configuration sources including files, objects, environment variables, and runtime parameter modification.
Add custom configuration options with CLI argument support.
/**
* Add a configuration option with CLI argument support
* @param description - Description of the configuration option
* @param args - Array of argument names, first is primary name
* @param type - Argument type: 'string' or 'boolean'
* @returns boolean - Success status
*/
addConfiguration(description, args, type): boolean;Usage Examples:
const dbMigrate = require('db-migrate');
const instance = dbMigrate.getInstance();
// Add string configuration option
instance.addConfiguration(
'Custom migration directory',
['custom-dir', 'd'],
'string'
);
// Add boolean configuration option
instance.addConfiguration(
'Enable verbose logging',
['verbose', 'v'],
'boolean'
);
// Add configuration with multiple aliases
instance.addConfiguration(
'Database connection timeout',
['timeout', 't', 'connection-timeout'],
'string'
);Set configuration parameter values at runtime.
/**
* Set a configuration parameter value
* @param param - Parameter name
* @param value - Parameter value
* @returns value - The set value
*/
setConfigParam(param, value): any;Usage Examples:
// Set migration directory
instance.setConfigParam('migrations-dir', './db/migrations');
// Set environment
instance.setConfigParam('env', 'production');
// Set database table name
instance.setConfigParam('table', 'schema_migrations');
// Set count for operations
instance.setConfigParam('count', 5);
// Set boolean flags
instance.setConfigParam('dry-run', true);
instance.setConfigParam('verbose', true);Reset argv configuration to new values.
/**
* Reset argv configuration to specified values
* @param argv - New argv configuration object
*/
resetConfiguration(argv): void;Usage Example:
// Reset configuration with new argv
const newArgv = {
env: 'test',
'migrations-dir': './test/migrations',
verbose: true
};
instance.resetConfiguration(newArgv);This method is also documented in the API reference and allows complete replacement of the current argument configuration.
Add global library references for use in migrations.
/**
* Add a global library reference accessible in migrations
* @param library - Library name or path to require
* @returns boolean - Success status (true if library loaded successfully)
*/
addGlobal(library): boolean;Usage Examples:
// Add lodash globally
const success = instance.addGlobal('lodash');
if (success) {
console.log('Lodash is now available globally in migrations');
}
// Add custom utility
instance.addGlobal('./lib/db-utils');
// Add multiple libraries
['moment', 'uuid', 'bcrypt'].forEach(lib => {
instance.addGlobal(lib);
});Register and manage API hooks for extending db-migrate functionality.
/**
* Register and initialize API hooks for plugins
* @param callback - Completion callback (function)
* @returns Promise
*/
registerAPIHook(callback): Promise;Usage Examples:
const dbMigrate = require('db-migrate');
const instance = dbMigrate.getInstance(true, {
plugins: {
'custom-hook': {
hooks: ['init:api:addfunction:hook'],
name: 'CustomPlugin',
loadPlugin: function() { /* plugin implementation */ }
}
}
});
// Register API hooks
await instance.registerAPIHook();
// Plugin can add functions to the API
instance.customFunction(); // Added by pluginPlugin Structure:
// Example plugin
const customPlugin = {
name: 'CustomMigrationPlugin',
hooks: [
'init:api:addfunction:hook',
'init:api:accessapi:hook'
],
loadPlugin: function() {
// Plugin initialization logic
},
'init:api:addfunction:hook': function() {
return ['customMigrationMethod', function() {
console.log('Custom migration functionality');
}];
}
};
// Use plugin
const instance = dbMigrate.getInstance(true, {
plugins: { 'custom-plugin': customPlugin }
});Disabling Plugins:
// Disable all plugin loading
const instance = dbMigrate.getInstance(true, {
noPlugins: true
});Most common approach using database.json or custom config files.
{
"development": {
"driver": "mysql",
"host": "localhost",
"user": "root",
"password": "password",
"database": "myapp_development",
"multipleStatements": true,
"migrations-dir": "migrations",
"seeds-dir": "seeds"
},
"test": {
"driver": "mysql",
"host": "localhost",
"user": "test",
"password": "test",
"database": "myapp_test"
},
"production": {
"driver": "mysql",
"host": "prod-db.example.com",
"user": "prod_user",
"password": "secure_password",
"database": "myapp_production",
"ssl": true
}
}Loading File Configuration:
// Default database.json
const instance = dbMigrate.getInstance();
// Custom config file
const instance = dbMigrate.getInstance(true, {
config: './config/database.json'
});
// Different environments
const prodInstance = dbMigrate.getInstance(true, {
config: './config/database.json',
env: 'production'
});Programmatic configuration using JavaScript objects.
const config = {
development: {
driver: 'mysql',
host: process.env.DB_HOST || 'localhost',
user: process.env.DB_USER || 'root',
password: process.env.DB_PASSWORD || 'password',
database: 'myapp_development'
}
};
const instance = dbMigrate.getInstance(true, { config });Using environment variables for configuration.
{
"production": {
"driver": "mysql",
"host": {"ENV": "DB_HOST"},
"user": {"ENV": "DB_USER"},
"password": {"ENV": "DB_PASSWORD"},
"database": {"ENV": "DB_NAME"},
"port": {"ENV": "DB_PORT"}
}
}Environment Variables:
export DB_HOST=prod-db.example.com
export DB_USER=prod_user
export DB_PASSWORD=secure_password
export DB_NAME=myapp_production
export DB_PORT=3306Using DATABASE_URL for configuration (common in cloud deployments).
DATABASE_URL=mysql://user:password@host:port/database// Automatically uses DATABASE_URL if available
const instance = dbMigrate.getInstance();
// Or explicitly
const instance = dbMigrate.getInstance(true, {
config: process.env.DATABASE_URL
});const options = {
// Environment selection
env: 'development',
// Working directory
cwd: process.cwd(),
// Configuration source
config: './database.json', // or config object
// Directory paths
'migrations-dir': 'migrations',
'vcseeder-dir': 'seeds/vc',
'staticseeder-dir': 'seeds/static',
// Table names
table: 'migrations',
'seeds-table': 'seeds',
// Operation settings
count: 0, // Number of migrations to run
'dry-run': false, // Print SQL without executing
verbose: false, // Verbose output
'force-exit': false, // Force exit after completion
// Transaction settings
'non-transactional': false, // Disable transactions
// File generation
'sql-file': false, // Generate SQL files
'coffee-file': false, // Generate CoffeeScript files
'ignore-on-init': false, // Generate conditional files
// Plugin settings
noPlugins: false, // Disable plugin loading
plugins: {}, // Custom plugins
// Advanced settings
staticLoader: false, // Use static command loader
throwUncatched: false // Prevent error event registration
};
const instance = dbMigrate.getInstance(true, options);MySQL:
{
"driver": "mysql",
"host": "localhost",
"port": 3306,
"user": "root",
"password": "password",
"database": "myapp",
"multipleStatements": true,
"charset": "utf8mb4",
"timezone": "UTC",
"acquireTimeout": 60000,
"timeout": 60000,
"reconnect": true,
"ssl": {
"ca": "path/to/ca.pem",
"cert": "path/to/cert.pem",
"key": "path/to/key.pem"
}
}PostgreSQL:
{
"driver": "pg",
"host": "localhost",
"port": 5432,
"user": "postgres",
"password": "password",
"database": "myapp",
"schema": "public",
"ssl": false,
"max": 10,
"idleTimeoutMillis": 30000
}SQLite3:
{
"driver": "sqlite3",
"filename": "./database.db",
"mode": "OPEN_READWRITE | OPEN_CREATE"
}MongoDB:
{
"driver": "mongodb",
"host": "localhost",
"port": 27017,
"database": "myapp",
"username": "user",
"password": "password",
"ssl": false
}// Get instance with base configuration
const instance = dbMigrate.getInstance(true, {
env: 'development',
config: './database.json'
});
// Modify configuration at runtime
instance.setConfigParam('verbose', true);
instance.setConfigParam('migrations-dir', './custom/migrations');
instance.setConfigParam('table', 'custom_migrations');
// Add custom CLI options
instance.addConfiguration('Custom timeout', ['timeout'], 'string');
instance.setConfigParam('timeout', '30000');
// Execute with modified configuration
await instance.up();function validateConfig(config) {
const required = ['driver', 'database'];
const missing = required.filter(key => !config[key]);
if (missing.length > 0) {
throw new Error(`Missing required config: ${missing.join(', ')}`);
}
// Driver-specific validation
if (config.driver === 'mysql' || config.driver === 'pg') {
if (!config.host || !config.user) {
throw new Error('Host and user are required for MySQL/PostgreSQL');
}
}
return true;
}
// Use validated configuration
try {
validateConfig(config.development);
const instance = dbMigrate.getInstance(true, { config });
} catch (error) {
console.error('Configuration error:', error.message);
}// Multi-environment setup
const environments = ['development', 'test', 'staging', 'production'];
async function runMigrationsAllEnvironments() {
for (const env of environments) {
console.log(`Running migrations for ${env}...`);
const instance = dbMigrate.getInstance(true, { env });
await instance.up();
}
}
// Conditional configuration
const config = {
development: {
driver: 'sqlite3',
filename: './dev_database.db'
},
production: {
driver: 'mysql',
host: process.env.DB_HOST,
user: process.env.DB_USER,
password: process.env.DB_PASSWORD,
database: process.env.DB_NAME,
ssl: process.env.NODE_ENV === 'production'
}
};/**
* Configuration argument type
*/
type ConfigArgType = 'string' | 'boolean';
/**
* Configuration parameter value
*/
type ConfigValue = string | number | boolean | object;
/**
* Database configuration object
*/
interface DatabaseConfig {
/** Database driver name */
driver: string;
/** Database host */
host?: string;
/** Database port */
port?: number;
/** Database user */
user?: string;
/** Database password */
password?: string;
/** Database name */
database: string;
/** Additional driver-specific options */
[key: string]: any;
}
/**
* Migration configuration options
*/
interface MigrationConfig {
/** Migrations directory path */
'migrations-dir'?: string;
/** Migration table name */
table?: string;
/** Seeds table name */
'seeds-table'?: string;
/** Version controlled seeds directory */
'vcseeder-dir'?: string;
/** Static seeds directory */
'staticseeder-dir'?: string;
/** Enable verbose output */
verbose?: boolean;
/** Dry run mode */
'dry-run'?: boolean;
/** Force exit after completion */
'force-exit'?: boolean;
/** Disable transactions */
'non-transactional'?: boolean;
}
/**
* Complete configuration object
*/
interface Config {
[environment: string]: DatabaseConfig & MigrationConfig;
}