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;
}