// 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 } from '../../utils/debug'; import { isDefined } from '../../utils/types'; import { sanitizeModuleName } from '../../utils/common'; import { setPropertyValue, getComponentModule } from './component-builder'; import type { ComponentModule } from './component-builder'; import { platformNames } from '../../platform'; import { resolveModuleName } from '../../module-name-resolver'; import { xml2ui } from './xml2ui'; export const ios = platformNames.ios.toLowerCase(); export const android = platformNames.android.toLowerCase(); export const visionos = platformNames.visionos.toLowerCase(); export const apple = platformNames.apple.toLowerCase(); export const defaultNameSpaceMatcher = /tns\.xsd$/i; export interface LoadOptions { path: string; name: string; attributes?: any; exports?: any; page?: Page; } export class Builder { // ui plugin developers can add to these to define their own custom types if needed static knownTemplates: Set = new Set(['itemTemplate']); static knownMultiTemplates: Set = new Set(['itemTemplates']); static knownCollections: Set = new Set(['items', 'spans', 'actionItems']); 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`; const 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 { let componentView; if (__UI_USE_XML_PARSER__) { const componentModule = loadInternal(moduleName, moduleExports); componentView = componentModule && componentModule.component; } else { const resolvedXmlModuleName = resolveModuleName(moduleName, 'xml'); const componentModule = resolvedXmlModuleName ? global.loadModule(resolvedXmlModuleName, true) : null; if (componentModule?.default) { componentView = new componentModule.default(); } else { throw new Error('Failed to load component from module: ' + moduleName); } } 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 (