emberjs/ember.js · error · Error
deprecation override for ${id} not found
Error message
deprecation override for ${id} not found What it means
Glimmer's DEBUG deprecate hook looks up the deprecation id in VM_DEPRECATION_OVERRIDES; if an id isn't listed there, it throws 'deprecation override for ${id} not found'. This is an internal consistency check: every VM-raised deprecation must have a registered override.
Source
Thrown at packages/@ember/-internals/glimmer/lib/environment.ts:81
}
},
deprecate(msg: string, test: unknown, options: { id: string }) {
if (DEBUG) {
let { id } = options;
if (id === 'argument-less-helper-paren-less-invocation') {
throw new Error(
`A resolved helper cannot be passed as a named argument as the syntax is ` +
`ambiguously a pass-by-reference or invocation. Use the ` +
`\`{{helper 'foo-helper}}\` helper to pass by reference or explicitly ` +
`invoke the helper with parens: \`{{(fooHelper)}}\`.`
);
}
let override = VM_DEPRECATION_OVERRIDES.filter((o) => o.id === id)[0];
if (!override) throw new Error(`deprecation override for ${id} not found`);
// allow deprecations to be disabled in the VM_DEPRECATION_OVERRIDES array below
if (!override.disabled) {
deprecate(override.message ?? msg, Boolean(test), override);
}
}
},
});
if (DEBUG) {
debug?.setTrackingTransactionEnv?.({
debugMessage(obj, keyName) {
let dirtyString = keyName
? `\`${keyName}\` on \`${getDebugName?.(obj)}\``
: `\`${getDebugName?.(obj)}\``;
return `You attempted to update ${dirtyString}, but it had already been used previously in the same computation. Attempting to update a value after using it in a computation can cause logical errors, infinite revalidation bugs, and performance issues, and is not supported.`;
},View on GitHub (pinned to 26f97246a8)
Solutions
- Use Ember.deprecate (or the normal deprecation pipeline) rather than the glimmer environment's deprecate for custom messages
- Add/align the id in VM_DEPRECATION_OVERRIDES if you own ember-source-level code
- Align ember-source and related package versions to eliminate id mismatches
Example fix
// before
env.deprecate('custom msg', false, { id: 'my-custom-deprecation' });
// after
Ember.deprecate('custom msg', false, { id: 'my-custom-deprecation', until: '5.0.0', for: 'my-addon' }); Defensive patterns
Strategy: validation
Validate before calling
// DEBUG-only guard: only call with ids known to the VM
const KNOWN_IDS = new Set(VM_DEPRECATION_OVERRIDES.map(o => o.id));
if (!KNOWN_IDS.has(id)) throw new Error(`unregistered VM deprecation id: ${id}`); Type guard
function hasVmOverride(id) { return VM_DEPRECATION_OVERRIDES.some(o => o.id === id); } Try / catch
try { env.deprecate(msg, test, { id }); } catch (e) { if (String(e.message).startsWith('deprecation override for') && e.message.includes('not found')) { /* route to Ember.deprecate instead */ } throw e; } Prevention
- Use public Ember.deprecate, not glimmer env internals
- Register any VM-level deprecation id in VM_DEPRECATION_OVERRIDES
- Keep ember-source and glimmer packages version-aligned
- Test DEBUG builds to surface these early
When it happens
Trigger: A VM/template deprecation is triggered in DEBUG with an id missing from VM_DEPRECATION_OVERRIDES — e.g. custom/third-party code calling the environment's deprecate with a novel id, or an ember-source internal/id mismatch after version drift.
Common situations: Mismatched ember-source internals (addons shimming the environment), custom deprecate calls in debug builds, running an ember-source canary where override lists changed.
Related errors
- A resolved helper cannot be passed as a named argument as th
- You must pass both the owner and args to super() in your com
- You must pass both the owner and args to super() in your com
- The API deprecated by ${options.id} was removed in ember-sou
- Compile Error: ${template.problem} @ ${template.span.start}.
AI-assisted analysis of emberjs/ember.js@26f97246a8 (2026-09-01).
Data as JSON: /api/errors/f50f9eb51051ce1c.
Report an issue: GitHub.