# ThemeRegistry

Source: /tuil/docs/reference/packages/theme/api/theme-registry
Locale: en

class exported by @mwillbanks/tuil-theme.



{/* Generated by tooling/docs/generate-reference.ts. */}

## class [#class]

Public class exported by `@mwillbanks/tuil-theme`.

```ts
export class ThemeRegistry {
  readonly #entries = new Map<string, ThemeRegistryEntry>();
  #defaultId?: string;

  register(
    entry: ThemeRegistryEntry,
    options: { readonly default?: boolean } = {},
  ): Disposable {
    if (this.#entries.has(entry.theme.id)) {
      throw new Error(`Theme "${entry.theme.id}" is already registered`);
    }
    const registered = Object.freeze({
      ...entry,
      tags: Object.freeze([...new Set(entry.tags ?? [])]),
    });
    this.#entries.set(entry.theme.id, registered);
    if (options.default || this.#defaultId === undefined) {
      this.#defaultId = entry.theme.id;
    }
    return toDisposable(() => {
      if (this.#entries.get(entry.theme.id) !== registered) return;
      this.#entries.delete(entry.theme.id);
      if (this.#defaultId === entry.theme.id) {
        this.#defaultId = this.list()[0]?.theme.id;
      }
    });
  }

  get(id: string): ThemeRegistryEntry | undefined {
    return this.#entries.get(id);
  }

  resolve(id?: string): Theme {
    const selected = id ?? this.#defaultId;
    const theme = selected ? this.#entries.get(selected)?.theme : undefined;
    if (!theme) {
      throw new Error(
        selected
          ? `Theme "${selected}" is not registered`
          : "No theme is registered",
      );
    }
    return theme;
  }

  list(options: { readonly tag?: string } = {}): readonly ThemeRegistryEntry[] {
    return [...this.#entries.values()]
      .filter((entry) => !options.tag || entry.tags?.includes(options.tag))
      .sort((left, right) => left.theme.id.localeCompare(right.theme.id));
  }
}
```

## Members [#members]

| Member       | Type                                                                                             | Required | Description                                                                                                                               | Related types                                                                                                                                 |
| ------------ | ------------------------------------------------------------------------------------------------ | -------- | ----------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `#entries`   | `Map<string, ThemeRegistryEntry>`                                                                | Yes      | The `#entries` member uses the `Map<string, ThemeRegistryEntry>` contract.                                                                | [`ThemeRegistryEntry`](/tuil/docs/reference/packages/theme/api/theme-registry-entry)                                                               |
| `#defaultId` | `string \| undefined`                                                                            | No       | The `#defaultId` member uses the `string \| undefined` contract.                                                                          | —                                                                                                                                             |
| `register`   | `(entry: ThemeRegistryEntry, options?: &#123; readonly default?: boolean; &#125;) => Disposable` | Yes      | The `register` member uses the `(entry: ThemeRegistryEntry, options?: &#123; readonly default?: boolean; &#125;) => Disposable` contract. | [`Disposable`](/tuil/docs/reference/packages/core/api/disposable), [`ThemeRegistryEntry`](/tuil/docs/reference/packages/theme/api/theme-registry-entry) |
| `get`        | `(id: string) => ThemeRegistryEntry \| undefined`                                                | Yes      | The `get` member uses the `(id: string) => ThemeRegistryEntry \| undefined` contract.                                                     | [`ThemeRegistryEntry`](/tuil/docs/reference/packages/theme/api/theme-registry-entry)                                                               |
| `resolve`    | `(id?: string) => Theme`                                                                         | Yes      | The `resolve` member uses the `(id?: string) => Theme` contract.                                                                          | [`Theme`](/tuil/docs/reference/packages/theme/api/theme)                                                                                           |
| `list`       | `(options?: &#123; readonly tag?: string; &#125;) => readonly ThemeRegistryEntry[]`              | Yes      | The `list` member uses the `(options?: &#123; readonly tag?: string; &#125;) => readonly ThemeRegistryEntry[]` contract.                  | [`ThemeRegistryEntry`](/tuil/docs/reference/packages/theme/api/theme-registry-entry)                                                               |

## Parameters [#parameters]

This declaration has no public members.

## Returns [#returns]

This declaration does not return a value.

## Throws [#throws]

No thrown errors are documented for this declaration.

## Related types [#related-types]

* [`Theme`](/tuil/docs/reference/packages/theme/api/theme)
* [`ThemeRegistryEntry`](/tuil/docs/reference/packages/theme/api/theme-registry-entry)

## Source [#source]

[View the secondary source reference](https://github.com/mwillbanks/tuil/blob/main/packages/theme/src/index.ts)

## Package [#package]

[@mwillbanks/tuil-theme](/tuil/docs/reference/packages/theme)
