tuil
ReferencePackages@mwillbanks/tuil-themeAPI

ThemeRegistry

class exported by @mwillbanks/tuil-theme.

View rawEdit

class

Public class exported by @mwillbanks/tuil-theme.

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

MemberTypeRequiredDescriptionRelated types
#entriesMap<string, ThemeRegistryEntry>YesThe #entries member uses the Map<string, ThemeRegistryEntry> contract.ThemeRegistryEntry
#defaultIdstring | undefinedNoThe #defaultId member uses the string | undefined contract.
register(entry: ThemeRegistryEntry, options?: &#123; readonly default?: boolean; &#125;) => DisposableYesThe register member uses the (entry: ThemeRegistryEntry, options?: &#123; readonly default?: boolean; &#125;) => Disposable contract.Disposable, ThemeRegistryEntry
get(id: string) => ThemeRegistryEntry | undefinedYesThe get member uses the (id: string) => ThemeRegistryEntry | undefined contract.ThemeRegistryEntry
resolve(id?: string) => ThemeYesThe resolve member uses the (id?: string) => Theme contract.Theme
list(options?: &#123; readonly tag?: string; &#125;) => readonly ThemeRegistryEntry[]YesThe list member uses the (options?: &#123; readonly tag?: string; &#125;) => readonly ThemeRegistryEntry[] contract.ThemeRegistryEntry

Parameters

This declaration has no public members.

Returns

This declaration does not return a value.

Throws

No thrown errors are documented for this declaration.

Source

View the secondary source reference

Package

@mwillbanks/tuil-theme

On this page