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.
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 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>;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.
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'];
}
}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
}
}
}ember-try looks for configuration files in the following order:
--config-path optionpackage.json ember-addon.configPath + /ember-try.jsconfig/ember-try.jsLegacy configuration options are deprecated:
useYarn → Use packageManager: 'yarn'usePnpm → Use packageManager: 'pnpm'