# `Selecto.Extensions`

Shared extension loading and callback dispatch for the Selecto ecosystem.

# `normalized_spec`

```elixir
@type normalized_spec() :: {module(), keyword()}
```

Normalized extension entries: `{module, opts}`

# `components_views`

```elixir
@spec components_views(term(), [normalized_spec()]) :: [tuple()]
```

Return additional `selecto_components` views contributed by extensions.

# `deep_merge`

```elixir
@spec deep_merge(map(), map()) :: map()
```

Deep-merge maps recursively.

# `ecto_type_to_selecto_type`

```elixir
@spec ecto_type_to_selecto_type(term(), [normalized_spec()]) :: atom() | nil
```

Resolve extension-provided Ecto->Selecto type mapping.

Returns the first non-nil mapping from extensions in declaration order.

# `from_domain`

```elixir
@spec from_domain(map()) :: [normalized_spec()]
```

Extract normalized extension specs from a domain-like map.

# `from_source`

```elixir
@spec from_source(term()) :: [normalized_spec()]
```

Extract normalized extension specs from a selecto/domain-like value.

# `merge_domain_extensions`

```elixir
@spec merge_domain_extensions(map(), [normalized_spec()]) :: map()
```

Apply `merge_domain/2` callbacks for extensions in declaration order.

# `merge_updato_domain_extensions`

```elixir
@spec merge_updato_domain_extensions(map(), [normalized_spec()]) :: map()
```

Apply `updato_domain/2` callbacks for extensions in declaration order.

# `normalize_specs`

```elixir
@spec normalize_specs(term()) :: [normalized_spec()]
```

Normalize extension specs from any supported format.

Supported entries:

- `MyExtension`
- `{MyExtension, key: "value"}`
- `%{module: MyExtension, opts: [...]}`

# `overlay_dsl_modules`

```elixir
@spec overlay_dsl_modules([normalized_spec()]) :: [module()]
```

Return additional overlay DSL import modules from extension callbacks.

# `overlay_fragments`

```elixir
@spec overlay_fragments(module(), [normalized_spec()]) :: map()
```

Build and deep-merge extension overlay fragments.

# `setup_overlay_extensions`

```elixir
@spec setup_overlay_extensions(module(), [normalized_spec()]) :: :ok
```

Execute compile-time `overlay_setup/2` callbacks.

---

*Consult [api-reference.md](api-reference.md) for complete listing*
