or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

cli-interface.mdconfiguration-management.mddata-seeding.mddatabase-interface.mddatabase-operations.mdindex.mdmigration-management.md
tile.json

configuration-management.mddocs/

Configuration Management

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.

Capabilities

Add Configuration Options

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 Parameters

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 Configuration

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 Libraries

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

Plugin and Hook Management

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 plugin

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

Configuration Sources

File-Based Configuration

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

Object-Based Configuration

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

Environment Variable Configuration

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=3306

Database URL Configuration

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

Configuration Options

Common Options

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

Database-Specific 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
}

Runtime Configuration

// 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();

Configuration Validation

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

Environment-Specific Patterns

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

Types

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