in packages/web-components/fast-router/src/commands.ts [166:252]
public static fromDefinition(
owner: RouterConfiguration,
definition:
| ElementRouteDefinition
| TemplateRouteDefinition
| ElementFallbackRouteDefinition
| TemplateFallbackRouteDefinition
): Render {
let createView: () => Promise<RouteView>;
if ("template" in definition) {
createView = async () => {
let template = definition.template;
if (typeof template === "function") {
template = await template();
}
return template.create();
};
} else {
createView = async () => {
let element = definition.element;
let factory: ViewFactory | null = null;
if ((definition as any).factory) {
factory = (definition as any).factory as ViewFactory;
} else if (typeof element === "function") {
// Do not cache it becase the function could return
// a different value each time.
let def = FASTElementDefinition.forType(element);
if (def) {
factory = factoryFromElementName(def.name);
} else {
element = await (element as Function)();
if (typeof element === "string") {
factory = factoryFromElementName(element);
} else if (element instanceof HTMLElement) {
factory = factoryFromElementInstance(element);
} else {
def = FASTElementDefinition.forType(element as any);
if (def) {
factory = factoryFromElementName(def.name);
} else {
throw new Error(
"Invalid value for element in route config."
);
}
}
}
} else if (element instanceof HTMLElement) {
(definition as any).factory = factory = factoryFromElementInstance(
element
);
} else {
(definition as any).factory = factory = factoryFromElementName(
element
);
}
return factory.create();
};
}
const command = new Render(owner, createView);
if (definition.layout) {
if (definition.layout instanceof ViewTemplate) {
command.layout = new FASTElementLayout(definition.layout);
} else {
command.layout = definition.layout;
}
}
if (definition.transition) {
command.transition = definition.transition;
}
if (definition.title) {
command.title = definition.title;
}
return command;
}