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
- Pass exactly the string '3.13': `capabilities('3.13')`
- Update custom manager code copied from older/newer Ember examples to use '3.13'
- Remove any dynamic version computation and hardcode the supported version
- 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
- Hardcode the literal '3.13'; never pass dynamic version strings
- Copy capability examples only from component-manager docs, not helper docs
- Test manager construction in CI to catch version drift
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
- Custom component managers must have a `capabilities` propert
- Invalid helper manager compatibility specified; you specifie
- You must pass either the `hasValue` OR the `hasScheduledEffe
- The `hasScheduledEffect` capability has not yet been impleme
AI-assisted analysis of emberjs/ember.js@26f97246a8 (2026-09-01).
Data as JSON: /api/errors/cf0b696b2cd498a5.
Report an issue: GitHub.