in packages/web-components/fast-foundation/src/design-system/design-system.ts [237:321]
public register(...registrations: any[]): DesignSystem {
const container = this.container;
const elementDefinitionEntries: ElementDefinitionEntry[] = [];
const disambiguate = this.disambiguate;
const shadowRootMode = this.shadowRootMode;
const context: DesignSystemRegistrationContext = {
elementPrefix: this.prefix,
tryDefineElement(
params: string | ElementDefinitionParams,
elementDefinitionType?: Constructable,
elementDefinitionCallback?: ElementDefinitionCallback
) {
const extractedParams = extractTryDefineElementParams(
params,
elementDefinitionType,
elementDefinitionCallback
);
const { name, callback, baseClass } = extractedParams;
let { type } = extractedParams;
let elementName: string | null = name;
let typeFoundByName = elementTypesByTag.get(elementName);
let needsDefine = true;
while (typeFoundByName) {
const result = disambiguate(elementName, type, typeFoundByName);
switch (result) {
case ElementDisambiguation.ignoreDuplicate:
return;
case ElementDisambiguation.definitionCallbackOnly:
needsDefine = false;
typeFoundByName = void 0;
break;
default:
elementName = result as string;
typeFoundByName = elementTypesByTag.get(elementName);
break;
}
}
if (needsDefine) {
if (elementTagsByType.has(type) || type === FoundationElement) {
type = class extends type {};
}
elementTypesByTag.set(elementName, type);
elementTagsByType.set(type, elementName);
if (baseClass) {
elementTagsByType.set(baseClass, elementName!);
}
}
elementDefinitionEntries.push(
new ElementDefinitionEntry(
container,
elementName,
type,
shadowRootMode,
callback,
needsDefine
)
);
},
};
if (!this.designTokensInitialized) {
this.designTokensInitialized = true;
if (this.designTokenRoot !== null) {
DesignToken.registerRoot(this.designTokenRoot);
}
}
container.registerWithContext(context, ...registrations);
for (const entry of elementDefinitionEntries) {
entry.callback(entry);
if (entry.willDefine && entry.definition !== null) {
entry.definition.define();
}
}
return this;
}