or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

commands.mdconfiguration.mddependency-management.mdindex.mdtask-execution.mdutilities.md
tile.json

configuration.mddocs/

Configuration

ember-try uses configuration files to define test scenarios and package manager settings. Configuration can be provided through explicit config files or auto-generated from package.json metadata.

Capabilities

Configuration File Structure

Configuration files are typically located at config/ember-try.js and export either an object or a function that returns the configuration.

/**
 * Main configuration interface for ember-try
 */
interface EmberTryConfig {
  /** Default command to run for scenarios (default: 'ember test') */
  command?: string;
  /** Options passed to npm/package manager */
  npmOptions?: string[];
  /** Use versionCompatibility from package.json to generate scenarios */
  useVersionCompatibility?: boolean;
  /** Package manager to use: 'npm', 'pnpm', or 'yarn' */
  packageManager?: 'npm' | 'pnpm' | 'yarn';
  /** Use workspace-aware package management for monorepos */
  useWorkspaces?: boolean;
  /** Function to customize package manager options per scenario */
  buildManagerOptions?: (scenario: Scenario) => string[];
  /** Array of test scenarios */
  scenarios: Scenario[];
}

/**
 * Individual test scenario configuration
 */
interface Scenario {
  /** Unique name for the scenario */
  name: string;
  /** npm/package manager dependency specifications */
  npm?: {
    /** Development dependencies to install */
    devDependencies?: Record<string, string>;
    /** Production dependencies to install */
    dependencies?: Record<string, string>;
    /** npm/pnpm overrides for dependency resolution */
    overrides?: Record<string, string>;
    /** Yarn resolutions for dependency resolution */
    resolutions?: Record<string, string>;
    /** Ember configuration overrides */
    ember?: Record<string, any>;
  };
  /** Environment variables to set during scenario execution */
  env?: Record<string, string>;
  /** Allow this scenario to fail without failing the entire run */
  allowedToFail?: boolean;
  /** Custom command for this scenario (overrides global command) */
  command?: string;
}

Configuration Examples:

// config/ember-try.js
const getChannelURL = require('ember-source-channel-url');

module.exports = async function() {
  return {
    command: 'ember test --reporter xunit',
    npmOptions: ['--loglevel=silent'],
    packageManager: 'npm',
    useVersionCompatibility: true,
    buildManagerOptions(scenario) {
      return ['--ignore-engines'];
    },
    scenarios: [
      {
        name: 'ember-lts-3.16',
        npm: {
          devDependencies: {
            'ember-source': '~3.16.0'
          }
        }
      },
      {
        name: 'ember-canary',
        allowedToFail: true,
        npm: {
          devDependencies: {
            'ember-source': await getChannelURL('canary')
          }
        }
      }
    ]
  };
};

Configuration Loading

Configuration is loaded and processed by the config utility function.

/**
 * Load and process ember-try configuration
 * @param options - Configuration loading options
 * @returns Promise resolving to processed configuration
 */
async function getConfig(options: {
  /** Path to configuration file (relative to cwd) */
  configPath?: string;
  /** Current working directory */
  cwd: string;
  /** Version compatibility overrides for auto-generation */
  versionCompatibility?: Record<string, string>;
}): Promise<EmberTryConfig>;

/**
 * Determine configuration file path based on package.json or default location
 * @param cwd - Current working directory
 * @returns Path to configuration file
 */
function getConfigPath(cwd: string): string;

/**
 * Load base configuration before processing
 * @param options - Configuration loading options
 * @returns Promise resolving to base configuration
 */
async function getBaseConfig(options: {
  configPath?: string;
  cwd: string;
  versionCompatibility?: Record<string, string>;
}): Promise<EmberTryConfig>;

Version Compatibility Auto-Generation

ember-try can automatically generate scenarios from version compatibility declarations in package.json.

/**
 * Extract version compatibility from package.json
 * @param cwd - Current working directory
 * @returns Version compatibility object or null
 */
function versionCompatibilityFromPackageJSON(cwd: string): Record<string, string> | null;

/**
 * Merge auto-generated config with explicit config file data
 * @param autoConfig - Auto-generated configuration
 * @param configData - Explicit configuration from file
 * @returns Merged configuration
 */
function mergeAutoConfigAndConfigFileData(
  autoConfig: EmberTryConfig,
  configData?: Partial<EmberTryConfig>
): EmberTryConfig;

Version Compatibility Example:

// package.json
{
  "ember-addon": {
    "versionCompatibility": {
      "ember": ">=3.16.0 <5.0.0"
    }
  }
}

This automatically generates scenarios for the latest patch version of each minor release within the range, plus beta and canary scenarios.

Package Manager Configuration

ember-try supports multiple package managers with specific configuration options.

/**
 * Package manager options interface
 */
interface PackageManagerConfig {
  /** Package manager to use */
  packageManager?: 'npm' | 'pnpm' | 'yarn';
  /** Enable workspace-aware dependency management */
  useWorkspaces?: boolean;
  /** Options passed to the package manager */
  npmOptions?: string[];
  /** Function to build custom options per scenario */
  buildManagerOptions?: (scenario: Scenario) => string[];
}

Package Manager Examples:

// NPM configuration
{
  packageManager: 'npm',
  npmOptions: ['--loglevel=silent', '--no-audit']
}

// PNPM configuration
{
  packageManager: 'pnpm',
  npmOptions: ['--silent']
}

// Yarn configuration
{
  packageManager: 'yarn',
  npmOptions: ['--silent']
}

// Workspace configuration (for monorepos)
{
  useWorkspaces: true,
  packageManager: 'npm',
  buildManagerOptions(scenario) {
    if (scenario.name.includes('canary')) {
      return ['--ignore-engines', '--no-lockfile'];
    }
    return ['--ignore-engines'];
  }
}

Scenario Configuration

Scenarios define specific dependency sets and environment configurations for testing.

/**
 * npm dependency configuration for scenarios
 */
interface ScenarioNpmConfig {
  /** Development dependencies to install/override */
  devDependencies?: Record<string, string>;
  /** Production dependencies to install/override */
  dependencies?: Record<string, string>;
  /** npm/pnpm overrides (ignored for yarn) */
  overrides?: Record<string, string>;
  /** Yarn resolutions (ignored for npm/pnpm) */
  resolutions?: Record<string, string>;
  /** Ember configuration overrides merged into package.json */
  ember?: Record<string, any>;
}

Scenario Examples:

// Basic scenario with ember version override
{
  name: 'ember-lts-3.20',
  npm: {
    devDependencies: {
      'ember-source': '~3.20.0'
    }
  }
}

// Scenario with environment variables
{
  name: 'ember-with-feature-flag',
  env: {
    ENABLE_NEW_DASHBOARD: 'true'
  },
  npm: {
    devDependencies: {
      'ember-source': '~3.24.0'
    }
  }
}

// Scenario with overrides/resolutions
{
  name: 'ember-with-lodash-override',
  npm: {
    devDependencies: {
      'ember-source': '~4.0.0'
    },
    overrides: {
      'lodash': '4.17.21'
    },
    resolutions: {
      'lodash': '4.17.21'
    }
  }
}

// Scenario with ember configuration
{
  name: 'ember-octane',
  npm: {
    devDependencies: {
      'ember-source': '~3.16.0'
    },
    ember: {
      edition: 'octane'
    }
  }
}

// Scenario allowed to fail
{
  name: 'ember-canary',
  allowedToFail: true,
  npm: {
    devDependencies: {
      'ember-source': await getChannelURL('canary')
    }
  }
}

// Scenario with custom command
{
  name: 'ember-production-build',
  command: 'ember build --environment=production',
  npm: {
    devDependencies: {
      'ember-source': '~4.0.0'
    }
  }
}

// Scenario with package removal
{
  name: 'ember-without-optional-addon',
  npm: {
    devDependencies: {
      'some-optional-addon': null  // Remove package
    }
  }
}

Configuration File Locations

ember-try looks for configuration files in the following order:

  1. Path specified via --config-path option
  2. Path from package.json ember-addon.configPath + /ember-try.js
  3. Default: config/ember-try.js

Deprecation Warnings

Legacy configuration options are deprecated:

  • useYarn → Use packageManager: 'yarn'
  • usePnpm → Use packageManager: 'pnpm'