···502502}
503503504504/**
505505+ * Defines a custom element, guarding against double-registration.
506506+ *
507507+ * @param {string} name
508508+ * @param {CustomElementConstructor} constructor
509509+ */
510510+export function defineElement(name, constructor) {
511511+ if (!customElements.get(name)) customElements.define(name, constructor);
512512+}
513513+514514+/**
505515 * @template {HTMLElement} T
506516 * @param {DiffuseElement} parent
507517 * @param {string} attribute
+2-2
src/components/artwork/audio-metadata/element.js
···11-import { DiffuseElement, query } from "~/common/element.js";
11+import { defineElement, DiffuseElement, query } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···5858export const CLASS = AudioMetadataArtwork;
5959export const NAME = "da-audio-metadata";
60606161-customElements.define(NAME, AudioMetadataArtwork);
6161+defineElement(NAME, AudioMetadataArtwork);
+2-2
src/components/artwork/input/element.js
···11-import { DiffuseElement, query } from "~/common/element.js";
11+import { defineElement, DiffuseElement, query } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···5858export const CLASS = InputArtwork;
5959export const NAME = "da-input";
60606161-customElements.define(NAME, InputArtwork);
6161+defineElement(NAME, InputArtwork);
+2-2
src/components/artwork/last.fm/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···3535export const CLASS = LastFmArtwork;
3636export const NAME = "da-lastfm";
37373838-customElements.define(NAME, LastFmArtwork);
3838+defineElement(NAME, LastFmArtwork);
+2-2
src/components/artwork/musicbrainz/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···3535export const CLASS = MusicBrainzArtwork;
3636export const NAME = "da-musicbrainz";
37373838-customElements.define(NAME, MusicBrainzArtwork);
3838+defineElement(NAME, MusicBrainzArtwork);
+2-2
src/components/configurator/artwork/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···5050export const CLASS = ArtworkConfigurator;
5151export const NAME = "dc-artwork";
52525353-customElements.define(NAME, ArtworkConfigurator);
5353+defineElement(NAME, ArtworkConfigurator);
+2-2
src/components/configurator/input/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions, Tunnel} from "~/common/worker.d.ts"
···6868export const CLASS = InputConfigurator;
6969export const NAME = "dc-input";
70707171-customElements.define(NAME, CLASS);
7171+defineElement(NAME, CLASS);
+2-2
src/components/configurator/metadata/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···5050export const CLASS = MetadataConfigurator;
5151export const NAME = "dc-metadata";
52525353-customElements.define(NAME, MetadataConfigurator);
5353+defineElement(NAME, MetadataConfigurator);
+2-2
src/components/configurator/output/element.js
···11-import { BroadcastableDiffuseElement } from "~/common/element.js";
11+import { BroadcastableDiffuseElement, defineElement } from "~/common/element.js";
22import { batch, computed, signal } from "~/common/signal.js";
3344/**
···419419export const CLASS = OutputConfigurator;
420420export const NAME = "dc-output";
421421422422-customElements.define(NAME, CLASS);
422422+defineElement(NAME, CLASS);
+2-2
src/components/configurator/scrobbles/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
2233/**
44 * @import {Track} from "~/definitions/types.d.ts"
···6969export const CLASS = ScrobblesConfigurator;
7070export const NAME = "dc-scrobbles";
71717272-customElements.define(NAME, CLASS);
7272+defineElement(NAME, CLASS);
+3-3
src/components/engine/audio/element.js
···11import { keyed } from "lit-html/directives/keyed.js";
2233-import { BroadcastableDiffuseElement, nothing } from "~/common/element.js";
33+import { BroadcastableDiffuseElement, defineElement, nothing } from "~/common/element.js";
44import { computed, signal, untracked } from "~/common/signal.js";
5566/**
···885885export const NAME = "de-audio";
886886export const NAME_ITEM = "de-audio-item";
887887888888-customElements.define(NAME, AudioEngine);
889889-customElements.define(NAME_ITEM, AudioEngineItem);
888888+defineElement(NAME, AudioEngine);
889889+defineElement(NAME_ITEM, AudioEngineItem);
+2-2
src/components/engine/queue/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
22import { signal } from "~/common/signal.js";
33import { listen } from "~/common/worker.js";
44···8181export const CLASS = QueueEngine;
8282export const NAME = "de-queue";
83838484-customElements.define(NAME, QueueEngine);
8484+defineElement(NAME, QueueEngine);
+2-2
src/components/engine/repeat-shuffle/element.js
···11-import { BroadcastableDiffuseElement } from "~/common/element.js";
11+import { BroadcastableDiffuseElement, defineElement } from "~/common/element.js";
22import { signal } from "~/common/signal.js";
3344////////////////////////////////////////////
···8383export const CLASS = RepeatShuffleEngine;
8484export const NAME = "de-repeat-shuffle";
85858686-customElements.define(NAME, CLASS);
8686+defineElement(NAME, CLASS);
+2-2
src/components/engine/scope/element.js
···11-import { BroadcastableDiffuseElement } from "~/common/element.js";
11+import { BroadcastableDiffuseElement, defineElement } from "~/common/element.js";
22import { signal } from "~/common/signal.js";
3344////////////////////////////////////////////
···147147export const CLASS = ScopeEngine;
148148export const NAME = "de-scope";
149149150150-customElements.define(NAME, CLASS);
150150+defineElement(NAME, CLASS);
+2-2
src/components/input/ephemeral-cache/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
22import { SCHEME } from "./constants.js";
3344/**
···5555export const CLASS = EphemeralCacheInput;
5656export const NAME = "di-ephemeral-cache";
57575858-customElements.define(NAME, CLASS);
5858+defineElement(NAME, CLASS);
+2-2
src/components/input/https/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
22import { SCHEME } from "./constants.js";
33import { hostsFromTracks } from "./common.js";
44···5858export const CLASS = HttpsInput;
5959export const NAME = "di-https";
60606161-customElements.define(NAME, CLASS);
6161+defineElement(NAME, CLASS);
+2-2
src/components/input/icecast/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
22import { hostsFromTracks } from "./common.js";
33import { SCHEME } from "./constants.js";
44···5858export const CLASS = IcecastInput;
5959export const NAME = "di-icecast";
60606161-customElements.define(NAME, CLASS);
6161+defineElement(NAME, CLASS);
+2-2
src/components/input/local/element.js
···11import * as TID from "@atcute/tid";
22-import { DiffuseElement } from "~/common/element.js";
22+import { defineElement, DiffuseElement } from "~/common/element.js";
33import { SCHEME } from "./constants.js";
44import {
55 buildURI,
···118118export const CLASS = LocalInput;
119119export const NAME = "di-local";
120120121121-customElements.define(NAME, CLASS);
121121+defineElement(NAME, CLASS);
+2-2
src/components/input/opensubsonic/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
22import { SCHEME } from "./constants.js";
33import { buildURI, serversFromTracks } from "./common.js";
44···5858export const CLASS = OpensubsonicInput;
5959export const NAME = "di-opensubsonic";
60606161-customElements.define(NAME, CLASS);
6161+defineElement(NAME, CLASS);
+2-2
src/components/input/s3/element.js
···11-import { DiffuseElement } from "~/common/element.js";
11+import { defineElement, DiffuseElement } from "~/common/element.js";
22import { SCHEME } from "./constants.js";
33import { bucketsFromTracks, buildURI } from "./common.js";
44···6161export const CLASS = S3Input;
6262export const NAME = "di-s3";
63636464-customElements.define(NAME, CLASS);
6464+defineElement(NAME, CLASS);
+2-2
src/components/metadata/audio-file/element.js
···11-import { DiffuseElement, query } from "~/common/element.js";
11+import { defineElement, DiffuseElement, query } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···5858export const CLASS = AudioFileMetadata;
5959export const NAME = "dm-audio-file";
60606161-customElements.define(NAME, AudioFileMetadata);
6161+defineElement(NAME, AudioFileMetadata);
+2-2
src/components/orchestrator/artwork/element.js
···11-import { DiffuseElement, query } from "~/common/element.js";
11+import { defineElement, DiffuseElement, query } from "~/common/element.js";
2233/**
44 * @import {ProxiedActions} from "~/common/worker.d.ts"
···5959export const CLASS = ArtworkOrchestrator;
6060export const NAME = "do-artwork";
61616262-customElements.define(NAME, ArtworkOrchestrator);
6262+defineElement(NAME, ArtworkOrchestrator);
+2-2
src/components/orchestrator/auto-queue/element.js
···11-import { BroadcastableDiffuseElement, query } from "~/common/element.js";
11+import { BroadcastableDiffuseElement, defineElement, query } from "~/common/element.js";
2233/**
44 * @import {DiffuseElement} from "~/common/element.js";
···9595export const CLASS = AutoTracksOrchestrator;
9696export const NAME = "do-auto-queue";
97979898-customElements.define(NAME, CLASS);
9898+defineElement(NAME, CLASS);
+2-2
src/components/orchestrator/controller/element.js
···11-import { DiffuseElement, query, whenElementsDefined } from "~/common/element.js";
11+import { defineElement, DiffuseElement, query, whenElementsDefined } from "~/common/element.js";
22import { computed, signal } from "~/common/signal.js";
3344/**
···7777export const CLASS = ControllerOrchestrator;
7878export const NAME = "do-controller";
79798080-customElements.define(NAME, CLASS);
8080+defineElement(NAME, CLASS);
+2-2
src/components/orchestrator/favourites/element.js
···11-import { BroadcastableDiffuseElement, query } from "~/common/element.js";
11+import { BroadcastableDiffuseElement, defineElement, query } from "~/common/element.js";
22import { match as matchPlaylistItem } from "~/common/playlist.js";
33import { computed, signal } from "~/common/signal.js";
44import { filterFavourites } from "./common.js";
···181181export const CLASS = FavouritesOrchestrator;
182182export const NAME = "do-favourites";
183183184184-customElements.define(NAME, CLASS);
184184+defineElement(NAME, CLASS);
···4455import { computed, signal } from "~/common/signal.js";
66import { OutputTransformer } from "../../base.js";
77+import { defineElement } from "~/common/element.js";
78import * as Output from "~/common/output.js";
89910/**
···390391export const CLASS = ATProtoOutputSyncTransformer;
391392export const NAME = "dtor-atproto-sync";
392393393393-customElements.define(NAME, CLASS);
394394+defineElement(NAME, CLASS);