From 75503ef1107953737f05b8939d724fa29fac3fc4 Mon Sep 17 00:00:00 2001 From: Dimitris-Rafail Katsampas Date: Tue, 8 Nov 2022 19:23:17 +0200 Subject: [PATCH] feat(core): support for external XML UI compilers (#10008) --- packages/core/ui/builder/index.ts | 26 +++++++++++++++++--------- packages/core/ui/repeater/index.ts | 2 +- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/core/ui/builder/index.ts b/packages/core/ui/builder/index.ts index 315ff8825..55f853abd 100644 --- a/packages/core/ui/builder/index.ts +++ b/packages/core/ui/builder/index.ts @@ -55,9 +55,19 @@ export class Builder { return view; } else { - const componentModule = loadInternal(moduleName, moduleExports); - const componentView = componentModule && componentModule.component; - + 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; } } @@ -226,7 +236,7 @@ function parseInternal(value: string, context: any, xmlModule?: string, moduleNa if (__UI_USE_XML_PARSER__) { let start: xml2ui.XmlStringParser; let ui: xml2ui.ComponentParser; - + const errorFormat = debug && xmlModule ? xml2ui.SourceErrorFormat(xmlModule) : xml2ui.PositionErrorFormat; const componentSourceTracker = debug && xmlModule @@ -234,15 +244,13 @@ function parseInternal(value: string, context: any, xmlModule?: string, moduleNa : () => { // no-op }; - + (start = new xml2ui.XmlStringParser(errorFormat)).pipe(new xml2ui.PlatformFilter()).pipe(new xml2ui.XmlStateParser((ui = new xml2ui.ComponentParser(context, errorFormat, componentSourceTracker, moduleName)))); - + start.parse(value); - + return ui.rootComponentModule; } else { return null; } } - - diff --git a/packages/core/ui/repeater/index.ts b/packages/core/ui/repeater/index.ts index 5a3d1c5e3..89cc7de64 100644 --- a/packages/core/ui/repeater/index.ts +++ b/packages/core/ui/repeater/index.ts @@ -130,7 +130,7 @@ export class Repeater extends CustomLayoutView { if (!viewToAdd) { if (__UI_USE_EXTERNAL_RENDERER__) { - viewToAdd = this._getDefaultItemContent(i) + viewToAdd = this._getDefaultItemContent(i); } else { viewToAdd = this.itemTemplate ? Builder.parse(this.itemTemplate, this) : this._getDefaultItemContent(i); }