emberjs/ember.js · error · Error

Invalid component manager compatibility specified

Error message

Invalid component manager compatibility specified

What it means

`componentCapabilities()` from @glimmer/manager validates the manager API version string passed to it. In DEBUG builds the only accepted version is '3.13'; any other value throws. Capabilities must be produced by this function so the library can trust them (it records them in a FROM_CAPABILITIES set).

Source

Thrown at packages/@glimmer/manager/lib/public/component.ts:49

  prepareArgs: false,
  createArgs: true,
  attributeHook: false,
  elementHook: false,
  createCaller: false,
  dynamicScope: true,
  updateHook: true,
  createInstance: true,
  wrapped: false,
  willDestroy: false,
  hasSubOwner: false,
};

export function componentCapabilities<Version extends keyof ComponentCapabilitiesVersions>(
  managerAPI: Version,
  options: ComponentCapabilitiesVersions[Version] = {}
): ComponentCapabilities {
  if (DEBUG && managerAPI !== '3.13') {
    throw new Error('Invalid component manager compatibility specified');
  }

  let updateHook = Boolean((options as ComponentCapabilitiesVersions['3.13']).updateHook);

  return buildCapabilities({
    asyncLifeCycleCallbacks: Boolean(options.asyncLifecycleCallbacks),
    destructor: Boolean(options.destructor),
    updateHook,
  });
}

export function hasAsyncLifeCycleCallbacks<ComponentInstance>(
  delegate: ComponentManager<ComponentInstance>
): delegate is ComponentManagerWithAsyncLifeCycleCallbacks<ComponentInstance> {
  return delegate.capabilities.asyncLifeCycleCallbacks;
}

export function hasUpdateHook<ComponentInstance>(

View on GitHub (pinned to 26f97246a8)

Solutions

  1. Pass exactly the string '3.13': `capabilities('3.13')`
  2. Update custom manager code copied from older/newer Ember examples to use '3.13'
  3. Remove any dynamic version computation and hardcode the supported version
  4. Ensure `capabilities` is imported from @glimmer/manager (or Ember's re-export) and not a local lookalike

Example fix

// before
static capabilities = capabilities('3.12');
// after
static capabilities = capabilities('3.13');
Defensive patterns

Strategy: validation

Validate before calling

// at manager definition
import { capabilities } from '@glimmer/manager';
const CAPS = capabilities('3.13', { asyncLifecycleCallbacks: true, updateHook: true });
if (CAPS === undefined) throw new Error('capabilities() must be called with 3.13');

Type guard

const isComponentCapabilities = (c: unknown): c is ComponentCapabilities => typeof c === 'object' && c !== null && 'createInstance' in c;

Try / catch

try { caps = componentCapabilities(version); } catch (e) { if (/Invalid component manager compatibility/.test(e.message)) caps = componentCapabilities('3.13', opts); else throw e; }

Prevention

When it happens

Trigger: Calling `capabilities('3.12')`, `capabilities('4.0')`, or passing a version typo/variable instead of the literal '3.13' when defining a custom component manager.

Common situations: Custom component manager authors copying examples from a different Ember version; passing a dynamic version string; following outdated documentation.

Related errors


AI-assisted analysis of emberjs/ember.js@26f97246a8 (2026-09-01). Data as JSON: /api/errors/cf0b696b2cd498a5. Report an issue: GitHub.