// Definitions. import { View, Template, KeyedTemplate } from "../core/view"; import { ViewBase } from "../core/view-base"; import { ViewEntry } from "../frame"; import { Page } from "../page"; // Types. import { debug, ScopeError, SourceError, Source } from "../../utils/debug"; import * as xml from "../../xml"; import { isString, isObject, isDefined } from "../../utils/types"; import { ComponentModule, setPropertyValue, getComponentModule, } from "./component-builder"; import { platformNames, device } from "../../platform"; import { profile } from "../../profiling"; import { sanitizeModuleName } from "./module-name-sanitizer"; import { resolveModuleName } from "../../module-name-resolver"; const ios = platformNames.ios.toLowerCase(); const android = platformNames.android.toLowerCase(); const defaultNameSpaceMatcher = /tns\.xsd$/i; export interface LoadOptions { path: string; name: string; attributes?: any; exports?: any; page?: Page; } export class Builder { static createViewFromEntry(entry: ViewEntry): View { if (entry.create) { const view = entry.create(); if (!view) { throw new Error( "Failed to create View with entry.create() function." ); } return view; } else if (entry.moduleName) { const moduleName = sanitizeModuleName(entry.moduleName); const resolvedCodeModuleName = resolveModuleName(moduleName, ""); //`${moduleName}.xml`; let moduleExports = resolvedCodeModuleName ? global.loadModule(resolvedCodeModuleName, true) : null; if (moduleExports && moduleExports.createPage) { // Exports has a createPage() method const view = moduleExports.createPage(); const resolvedCssModuleName = resolveModuleName( moduleName, "css" ); //entry.moduleName + ".css"; if (resolvedCssModuleName) { view.addCssFile(resolvedCssModuleName); } return view; } else { const componentModule = loadInternal(moduleName, moduleExports); const componentView = componentModule && componentModule.component; return componentView; } } throw new Error( "Failed to load page XML file for module: " + entry.moduleName ); } static parse(value: string | Template, context: any): View { if (typeof value === "function") { return (