# AUR0154

## Warning Message

`AUR0154: Attribute "<attribute-name>" has already been registered.`

Where `<attribute-name>` is the name of the custom attribute that was attempted to be registered again.

## Description

This warning indicates that an attempt was made to register a custom attribute with a specific name (e.g., `my-highlight`), but another custom attribute with the same name was already registered in the same scope (either globally or within the same component's dependencies). Aurelia requires custom attribute names to be unique within their registration scope.

**Note:** This is typically logged as a warning, not a hard error. The application might continue, but only the first registration for the given name will be effective, potentially leading to unexpected behavior.

## Cause

1. **Duplicate Global Registration:** Calling `Aurelia.register()` multiple times with the same custom attribute class or different classes using the same attribute name via the `@customAttribute` decorator.
2. **Duplicate Local Registration:** Including the same custom attribute class multiple times in a component's `dependencies` array, or including different attribute classes that resolve to the same attribute name.
3. **Global and Local Conflict:** Registering an attribute globally and then attempting to register another attribute with the same name locally within a component (or vice-versa).
4. **Naming Collision:** Accidentally defining two different custom attribute classes that use the same attribute name in their `@customAttribute` decorator.

## Solution

1. **Ensure Unique Names:** Choose a unique name for each custom attribute within its intended scope. Consider prefixing names for libraries (e.g., `mylib-tooltip`).
2. **Register Once:** Ensure each custom attribute is registered only once per scope. Check global registrations (`main.ts`) and local `dependencies` arrays.
3. **Consolidate Registrations:** Register globally if widely used, or locally if specific to few components. Avoid mixing registration types for the same name.
4. **Refactor/Rename:** If two distinct attributes share a name, rename one.

## Example

```typescript
// highlight.ts
import { customAttribute } from 'aurelia';
@customAttribute('highlight')
export class HighlightAttribute { /* ... */ }

// blue-highlight.ts - Incorrect: Uses the same name
import { customAttribute } from 'aurelia';
@customAttribute('highlight') // Causes AUR0154 if both are registered
export class BlueHighlightAttribute { /* ... */ }

// --- main.ts ---
import { Aurelia } from 'aurelia';
import { HighlightAttribute } from './highlight';
import { BlueHighlightAttribute } from './blue-highlight';

// Incorrect: Attempting to register two attributes with the same name globally
// Aurelia.register(HighlightAttribute, BlueHighlightAttribute) /* ... */;

// Correct: Register only one implementation for the name 'highlight'
Aurelia.register(HighlightAttribute) /* ... */;

// --- my-component.ts ---
import { customElement } from 'aurelia';
import { HighlightAttribute } from './highlight';
// Incorrect: Duplicate local registration
// @customElement({ name: 'my-component', template: '<div highlight></div>', dependencies: [HighlightAttribute, HighlightAttribute] })
// export class MyComponent {}

// Correct: Register locally only once (if not registered globally)
// @customElement({ name: 'my-component', template: '<div highlight></div>', dependencies: [HighlightAttribute] })
// export class MyComponent {}
```

## Debugging Tips

* Search your project for the attribute name (`<attribute-name>`) from the warning to find all `@customAttribute` usages with that name.
* Check global registrations in `main.ts` (or equivalent).
* Inspect `dependencies` arrays in component/element definitions.
* Verify naming conventions if used.

\</rewritten\_file>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aurelia.io/developer-guides/error-messages/runtime-html/aur0154.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
