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

  1. Use Ember.deprecate (or the normal deprecation pipeline) rather than the glimmer environment's deprecate for custom messages
  2. Add/align the id in VM_DEPRECATION_OVERRIDES if you own ember-source-level code
  3. 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

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


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