@sapui5/sap.fe.base 1.125.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,14 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define([], function () {
6
+ "use strict";
7
+
8
+ var _exports = {};
9
+ let Fragment = function Fragment() {};
10
+ Fragment.isFragment = true;
11
+ _exports = Fragment;
12
+ return _exports;
13
+ }, false);
14
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJGcmFnbWVudCIsImlzRnJhZ21lbnQiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkZyYWdtZW50LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IGNsYXNzIEZyYWdtZW50IHtcblx0c3RhdGljIGlzRnJhZ21lbnQgPSB0cnVlO1xufVxuIl0sIm1hcHBpbmdzIjoiO0FBQUE7QUFBQTtBQUFBOzs7OztNQUFxQkEsUUFBUTtFQUFSQSxRQUFRLENBQ3JCQyxVQUFVLEdBQUcsSUFBSTtFQUFBO0VBQUE7QUFBQSJ9
@@ -0,0 +1,3 @@
1
+ export default class Fragment {
2
+ static isFragment = true;
3
+ }
@@ -0,0 +1,93 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/fe/base/ClassSupport", "sap/ui/base/ManagedObject", "sap/ui/core/Component", "sap/ui/core/mvc/View"], function (ClassSupport, ManagedObject, Component, View) {
6
+ "use strict";
7
+
8
+ var _dec, _dec2, _class, _class2, _descriptor;
9
+ var _exports = {};
10
+ var property = ClassSupport.property;
11
+ var defineUI5Class = ClassSupport.defineUI5Class;
12
+ function _initializerDefineProperty(target, property, descriptor, context) { if (!descriptor) return; Object.defineProperty(target, property, { enumerable: descriptor.enumerable, configurable: descriptor.configurable, writable: descriptor.writable, value: descriptor.initializer ? descriptor.initializer.call(context) : void 0 }); }
13
+ function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
14
+ function _inheritsLoose(subClass, superClass) { subClass.prototype = Object.create(superClass.prototype); subClass.prototype.constructor = subClass; _setPrototypeOf(subClass, superClass); }
15
+ function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
16
+ function _applyDecoratedDescriptor(target, property, decorators, descriptor, context) { var desc = {}; Object.keys(descriptor).forEach(function (key) { desc[key] = descriptor[key]; }); desc.enumerable = !!desc.enumerable; desc.configurable = !!desc.configurable; if ('value' in desc || desc.initializer) { desc.writable = true; } desc = decorators.slice().reverse().reduce(function (desc, decorator) { return decorator(target, property, desc) || desc; }, desc); if (context && desc.initializer !== void 0) { desc.value = desc.initializer ? desc.initializer.call(context) : void 0; desc.initializer = undefined; } if (desc.initializer === void 0) { Object.defineProperty(target, property, desc); desc = null; } return desc; }
17
+ function _initializerWarningHelper(descriptor, context) { throw new Error('Decorating class property failed. Please ensure that ' + 'proposal-class-properties is enabled and runs after the decorators transform.'); }
18
+ let ViewLoader = (_dec = defineUI5Class("sap.fe.base.jsx-runtime.MDXViewLoader"), _dec2 = property({
19
+ type: "string"
20
+ }), _dec(_class = (_class2 = /*#__PURE__*/function (_View) {
21
+ _inheritsLoose(ViewLoader, _View);
22
+ function ViewLoader(mSettings) {
23
+ var _this;
24
+ delete mSettings.cache;
25
+ _this = _View.call(this, mSettings) || this;
26
+ _initializerDefineProperty(_this, "viewName", _descriptor, _assertThisInitialized(_this));
27
+ _this.sViewName = _this.viewName;
28
+ _this._oContainingView = _assertThisInitialized(_this);
29
+ return _this;
30
+ }
31
+ _exports = ViewLoader;
32
+ var _proto = ViewLoader.prototype;
33
+ _proto.loadDependency = async function loadDependency(name) {
34
+ return new Promise(resolve => {
35
+ sap.ui.require([name], MDXContent => {
36
+ resolve(MDXContent);
37
+ });
38
+ });
39
+ };
40
+ _proto.initViewSettings = async function initViewSettings(mSettings) {
41
+ var _getMetadata, _ref;
42
+ const viewConfig = this.getViewData();
43
+ const viewContent = viewConfig.viewContent || (await this.loadDependency(viewConfig._jsxViewName));
44
+ delete mSettings.cache;
45
+ if (viewContent !== null && viewContent !== void 0 && (_getMetadata = (_ref = viewContent).getMetadata) !== null && _getMetadata !== void 0 && _getMetadata.call(_ref).isA("sap.ui.core.mvc.Controller")) {
46
+ mSettings.controller = new viewContent(viewConfig);
47
+ } else {
48
+ this.viewContentFn = viewContent;
49
+ }
50
+ };
51
+ _proto.getControllerName = function getControllerName() {
52
+ const viewData = this.getViewData();
53
+ return viewData.controllerName;
54
+ }
55
+
56
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
57
+ // @ts-ignore
58
+ ;
59
+ _proto.createContent = function createContent(oController) {
60
+ var _mPreprocessors;
61
+ ViewLoader.preprocessorData = this === null || this === void 0 ? void 0 : (_mPreprocessors = this.mPreprocessors) === null || _mPreprocessors === void 0 ? void 0 : _mPreprocessors.xml;
62
+ ViewLoader.controller = oController;
63
+ const owner = Component.getOwnerComponentFor(this) ?? {
64
+ runAsOwner: fn => fn()
65
+ };
66
+ return owner.runAsOwner(() => {
67
+ return ManagedObject.runWithPreprocessors(() => {
68
+ var _this$viewContentFn;
69
+ if (oController && oController.render) {
70
+ return oController.render();
71
+ }
72
+ return (_this$viewContentFn = this.viewContentFn) === null || _this$viewContentFn === void 0 ? void 0 : _this$viewContentFn.call(this);
73
+ }, {
74
+ id: sId => {
75
+ return this.createId(sId);
76
+ },
77
+ settings: function () {
78
+ this.controller = oController;
79
+ }
80
+ });
81
+ });
82
+ };
83
+ return ViewLoader;
84
+ }(View), (_descriptor = _applyDecoratedDescriptor(_class2.prototype, "viewName", [_dec2], {
85
+ configurable: true,
86
+ enumerable: true,
87
+ writable: true,
88
+ initializer: null
89
+ })), _class2)) || _class);
90
+ _exports = ViewLoader;
91
+ return _exports;
92
+ }, false);
93
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJWaWV3TG9hZGVyIiwiZGVmaW5lVUk1Q2xhc3MiLCJwcm9wZXJ0eSIsInR5cGUiLCJtU2V0dGluZ3MiLCJjYWNoZSIsInNWaWV3TmFtZSIsInZpZXdOYW1lIiwiX29Db250YWluaW5nVmlldyIsImxvYWREZXBlbmRlbmN5IiwibmFtZSIsIlByb21pc2UiLCJyZXNvbHZlIiwic2FwIiwidWkiLCJyZXF1aXJlIiwiTURYQ29udGVudCIsImluaXRWaWV3U2V0dGluZ3MiLCJ2aWV3Q29uZmlnIiwiZ2V0Vmlld0RhdGEiLCJ2aWV3Q29udGVudCIsIl9qc3hWaWV3TmFtZSIsImdldE1ldGFkYXRhIiwiaXNBIiwiY29udHJvbGxlciIsInZpZXdDb250ZW50Rm4iLCJnZXRDb250cm9sbGVyTmFtZSIsInZpZXdEYXRhIiwiY29udHJvbGxlck5hbWUiLCJjcmVhdGVDb250ZW50Iiwib0NvbnRyb2xsZXIiLCJwcmVwcm9jZXNzb3JEYXRhIiwibVByZXByb2Nlc3NvcnMiLCJ4bWwiLCJvd25lciIsIkNvbXBvbmVudCIsImdldE93bmVyQ29tcG9uZW50Rm9yIiwicnVuQXNPd25lciIsImZuIiwiTWFuYWdlZE9iamVjdCIsInJ1bldpdGhQcmVwcm9jZXNzb3JzIiwicmVuZGVyIiwiaWQiLCJzSWQiLCJjcmVhdGVJZCIsInNldHRpbmdzIiwiVmlldyJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiVmlld0xvYWRlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVmaW5lVUk1Q2xhc3MsIHByb3BlcnR5IH0gZnJvbSBcInNhcC9mZS9iYXNlL0NsYXNzU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBYTUxQcmVwcm9jZXNzb3JDb250ZXh0IH0gZnJvbSBcInNhcC9mZS9jb3JlL1RlbXBsYXRlQ29tcG9uZW50XCI7XG5pbXBvcnQgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IENvbXBvbmVudCBmcm9tIFwic2FwL3VpL2NvcmUvQ29tcG9uZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlciBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJcIjtcbmltcG9ydCBWaWV3IGZyb20gXCJzYXAvdWkvY29yZS9tdmMvVmlld1wiO1xuaW1wb3J0IHR5cGUgeyBNYW5hZ2VkT2JqZWN0RXggfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdHlwZXMvZXh0ZW5zaW9uX3R5cGVzXCI7XG5cbnR5cGUgSlNYVmlld0NvbnRyb2xsZXIgPSBDb250cm9sbGVyICYgeyByZW5kZXI/OiAoKSA9PiBDb250cm9sIH07XG5AZGVmaW5lVUk1Q2xhc3MoXCJzYXAuZmUuYmFzZS5qc3gtcnVudGltZS5NRFhWaWV3TG9hZGVyXCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3TG9hZGVyIGV4dGVuZHMgVmlldyB7XG5cdHN0YXRpYyBwcmVwcm9jZXNzb3JEYXRhPzogWE1MUHJlcHJvY2Vzc29yQ29udGV4dDtcblxuXHRzdGF0aWMgY29udHJvbGxlcjogQ29udHJvbGxlcjtcblxuXHRAcHJvcGVydHkoeyB0eXBlOiBcInN0cmluZ1wiIH0pXG5cdHZpZXdOYW1lITogc3RyaW5nO1xuXG5cdHByaXZhdGUgdmlld0NvbnRlbnQ/OiBDb250cm9sO1xuXG5cdHByaXZhdGUgdmlld0NvbnRlbnRGbj86IEZ1bmN0aW9uO1xuXG5cdHB1YmxpYyBzVmlld05hbWU6IHN0cmluZztcblxuXHRwdWJsaWMgX29Db250YWluaW5nVmlldzogdGhpcztcblxuXHRjb25zdHJ1Y3RvcihtU2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB7XG5cdFx0ZGVsZXRlIG1TZXR0aW5ncy5jYWNoZTtcblx0XHRzdXBlcihtU2V0dGluZ3MpO1xuXHRcdHRoaXMuc1ZpZXdOYW1lID0gdGhpcy52aWV3TmFtZTtcblx0XHR0aGlzLl9vQ29udGFpbmluZ1ZpZXcgPSB0aGlzO1xuXHR9XG5cblx0YXN5bmMgbG9hZERlcGVuZGVuY3kobmFtZTogc3RyaW5nKTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG5cdFx0XHRzYXAudWkucmVxdWlyZShbbmFtZV0sIChNRFhDb250ZW50OiBGdW5jdGlvbik6IHZvaWQgPT4ge1xuXHRcdFx0XHRyZXNvbHZlKE1EWENvbnRlbnQpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHRhc3luYyBpbml0Vmlld1NldHRpbmdzKG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCB2aWV3Q29uZmlnID0gdGhpcy5nZXRWaWV3RGF0YSgpIGFzIHsgdmlld0NvbnRlbnQ/OiBDb250cm9sOyBfanN4Vmlld05hbWU6IHN0cmluZyB9ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0Y29uc3Qgdmlld0NvbnRlbnQgPSB2aWV3Q29uZmlnLnZpZXdDb250ZW50IHx8ICgoYXdhaXQgdGhpcy5sb2FkRGVwZW5kZW5jeSh2aWV3Q29uZmlnLl9qc3hWaWV3TmFtZSkpIGFzIENvbnRyb2wgfCBGdW5jdGlvbik7XG5cdFx0ZGVsZXRlIG1TZXR0aW5ncy5jYWNoZTtcblx0XHRpZiAoKHZpZXdDb250ZW50IGFzIENvbnRyb2wpPy5nZXRNZXRhZGF0YT8uKCkuaXNBKFwic2FwLnVpLmNvcmUubXZjLkNvbnRyb2xsZXJcIikpIHtcblx0XHRcdG1TZXR0aW5ncy5jb250cm9sbGVyID0gbmV3ICh2aWV3Q29udGVudCBhcyB0eXBlb2YgQ29udHJvbCkodmlld0NvbmZpZyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy52aWV3Q29udGVudEZuID0gdmlld0NvbnRlbnQgYXMgRnVuY3Rpb247XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q29udHJvbGxlck5hbWUoKTogc3RyaW5nIHtcblx0XHRjb25zdCB2aWV3RGF0YSA9IHRoaXMuZ2V0Vmlld0RhdGEoKSBhcyB7IGNvbnRyb2xsZXJOYW1lOiBzdHJpbmcgfTtcblx0XHRyZXR1cm4gdmlld0RhdGEuY29udHJvbGxlck5hbWU7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG5cdC8vIEB0cy1pZ25vcmVcblx0Y3JlYXRlQ29udGVudChvQ29udHJvbGxlcjogSlNYVmlld0NvbnRyb2xsZXIpOiBDb250cm9sIHtcblx0XHRWaWV3TG9hZGVyLnByZXByb2Nlc3NvckRhdGEgPSAodGhpcyBhcyB7IG1QcmVwcm9jZXNzb3JzPzogeyB4bWw/OiBYTUxQcmVwcm9jZXNzb3JDb250ZXh0IH0gfSk/Lm1QcmVwcm9jZXNzb3JzPy54bWw7XG5cdFx0Vmlld0xvYWRlci5jb250cm9sbGVyID0gb0NvbnRyb2xsZXI7XG5cblx0XHRjb25zdCBvd25lciA9IENvbXBvbmVudC5nZXRPd25lckNvbXBvbmVudEZvcih0aGlzKSEgPz8geyBydW5Bc093bmVyOiAoZm46IEZ1bmN0aW9uKSA9PiBmbigpIH07XG5cdFx0cmV0dXJuIG93bmVyLnJ1bkFzT3duZXIoKCkgPT4ge1xuXHRcdFx0cmV0dXJuIChNYW5hZ2VkT2JqZWN0IGFzIE1hbmFnZWRPYmplY3RFeCkucnVuV2l0aFByZXByb2Nlc3NvcnMoXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRpZiAob0NvbnRyb2xsZXIgJiYgb0NvbnRyb2xsZXIucmVuZGVyKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gb0NvbnRyb2xsZXIucmVuZGVyKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnZpZXdDb250ZW50Rm4/LigpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aWQ6IChzSWQ6IHN0cmluZykgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSWQoc0lkKTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHNldHRpbmdzOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmNvbnRyb2xsZXIgPSBvQ29udHJvbGxlcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdCk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7Ozs7Ozs7TUFZcUJBLFVBQVUsV0FEOUJDLGNBQWMsQ0FBQyx1Q0FBdUMsQ0FBQyxVQU10REMsUUFBUSxDQUFDO0lBQUVDLElBQUksRUFBRTtFQUFTLENBQUMsQ0FBQztJQUFBO0lBVzdCLG9CQUFZQyxTQUFrQyxFQUFFO01BQUE7TUFDL0MsT0FBT0EsU0FBUyxDQUFDQyxLQUFLO01BQ3RCLHlCQUFNRCxTQUFTLENBQUM7TUFBQztNQUNqQixNQUFLRSxTQUFTLEdBQUcsTUFBS0MsUUFBUTtNQUM5QixNQUFLQyxnQkFBZ0IsZ0NBQU87TUFBQztJQUM5QjtJQUFDO0lBQUE7SUFBQSxPQUVLQyxjQUFjLEdBQXBCLDhCQUFxQkMsSUFBWSxFQUFvQjtNQUNwRCxPQUFPLElBQUlDLE9BQU8sQ0FBRUMsT0FBTyxJQUFLO1FBQy9CQyxHQUFHLENBQUNDLEVBQUUsQ0FBQ0MsT0FBTyxDQUFDLENBQUNMLElBQUksQ0FBQyxFQUFHTSxVQUFvQixJQUFXO1VBQ3RESixPQUFPLENBQUNJLFVBQVUsQ0FBQztRQUNwQixDQUFDLENBQUM7TUFDSCxDQUFDLENBQUM7SUFDSCxDQUFDO0lBQUEsT0FFS0MsZ0JBQWdCLEdBQXRCLGdDQUF1QmIsU0FBa0MsRUFBaUI7TUFBQTtNQUN6RSxNQUFNYyxVQUFVLEdBQUcsSUFBSSxDQUFDQyxXQUFXLEVBQStFO01BQ2xILE1BQU1DLFdBQVcsR0FBR0YsVUFBVSxDQUFDRSxXQUFXLEtBQU0sTUFBTSxJQUFJLENBQUNYLGNBQWMsQ0FBQ1MsVUFBVSxDQUFDRyxZQUFZLENBQUMsQ0FBd0I7TUFDMUgsT0FBT2pCLFNBQVMsQ0FBQ0MsS0FBSztNQUN0QixJQUFLZSxXQUFXLGFBQVhBLFdBQVcsK0JBQVosUUFBQ0EsV0FBVyxFQUFjRSxXQUFXLHlDQUFyQyx1QkFBeUMsQ0FBQ0MsR0FBRyxDQUFDLDRCQUE0QixDQUFDLEVBQUU7UUFDaEZuQixTQUFTLENBQUNvQixVQUFVLEdBQUcsSUFBS0osV0FBVyxDQUFvQkYsVUFBVSxDQUFxQjtNQUMzRixDQUFDLE1BQU07UUFDTixJQUFJLENBQUNPLGFBQWEsR0FBR0wsV0FBdUI7TUFDN0M7SUFDRCxDQUFDO0lBQUEsT0FFRE0saUJBQWlCLEdBQWpCLDZCQUE0QjtNQUMzQixNQUFNQyxRQUFRLEdBQUcsSUFBSSxDQUFDUixXQUFXLEVBQWdDO01BQ2pFLE9BQU9RLFFBQVEsQ0FBQ0MsY0FBYztJQUMvQjs7SUFFQTtJQUNBO0lBQUE7SUFBQSxPQUNBQyxhQUFhLEdBQWIsdUJBQWNDLFdBQThCLEVBQVc7TUFBQTtNQUN0RDlCLFVBQVUsQ0FBQytCLGdCQUFnQixHQUFJLElBQUksYUFBSixJQUFJLDBDQUFKLElBQUksQ0FBNERDLGNBQWMsb0RBQS9FLGdCQUFpRkMsR0FBRztNQUNsSGpDLFVBQVUsQ0FBQ3dCLFVBQVUsR0FBR00sV0FBVztNQUVuQyxNQUFNSSxLQUFLLEdBQUdDLFNBQVMsQ0FBQ0Msb0JBQW9CLENBQUMsSUFBSSxDQUFDLElBQUs7UUFBRUMsVUFBVSxFQUFHQyxFQUFZLElBQUtBLEVBQUU7TUFBRyxDQUFDO01BQzdGLE9BQU9KLEtBQUssQ0FBQ0csVUFBVSxDQUFDLE1BQU07UUFDN0IsT0FBUUUsYUFBYSxDQUFxQkMsb0JBQW9CLENBQzdELE1BQU07VUFBQTtVQUNMLElBQUlWLFdBQVcsSUFBSUEsV0FBVyxDQUFDVyxNQUFNLEVBQUU7WUFDdEMsT0FBT1gsV0FBVyxDQUFDVyxNQUFNLEVBQUU7VUFDNUI7VUFDQSw4QkFBTyxJQUFJLENBQUNoQixhQUFhLHdEQUFsQiw2QkFBSSxDQUFrQjtRQUM5QixDQUFDLEVBQ0Q7VUFDQ2lCLEVBQUUsRUFBR0MsR0FBVyxJQUFLO1lBQ3BCLE9BQU8sSUFBSSxDQUFDQyxRQUFRLENBQUNELEdBQUcsQ0FBQztVQUMxQixDQUFDO1VBQ0RFLFFBQVEsRUFBRSxZQUFZO1lBQ3JCLElBQUksQ0FBQ3JCLFVBQVUsR0FBR00sV0FBVztVQUM5QjtRQUNELENBQUMsQ0FDRDtNQUNGLENBQUMsQ0FBQztJQUNILENBQUM7SUFBQTtFQUFBLEVBeEVzQ2dCLElBQUk7SUFBQTtJQUFBO0lBQUE7SUFBQTtFQUFBO0VBQUE7RUFBQTtBQUFBIn0=
@@ -0,0 +1,86 @@
1
+ import { defineUI5Class, property } from "sap/fe/base/ClassSupport";
2
+ import type { XMLPreprocessorContext } from "sap/fe/core/TemplateComponent";
3
+ import ManagedObject from "sap/ui/base/ManagedObject";
4
+ import Component from "sap/ui/core/Component";
5
+ import type Control from "sap/ui/core/Control";
6
+ import type { $ControlSettings } from "sap/ui/core/Control";
7
+ import type Controller from "sap/ui/core/mvc/Controller";
8
+ import View from "sap/ui/core/mvc/View";
9
+ import type { ManagedObjectEx } from "../../../../../../../types/extension_types";
10
+
11
+ type JSXViewController = Controller & { render?: () => Control };
12
+ @defineUI5Class("sap.fe.base.jsx-runtime.MDXViewLoader")
13
+ export default class ViewLoader extends View {
14
+ static preprocessorData?: XMLPreprocessorContext;
15
+
16
+ static controller: Controller;
17
+
18
+ @property({ type: "string" })
19
+ viewName!: string;
20
+
21
+ private viewContent?: Control;
22
+
23
+ private viewContentFn?: Function;
24
+
25
+ public sViewName: string;
26
+
27
+ public _oContainingView: this;
28
+
29
+ constructor(mSettings: Record<string, unknown>) {
30
+ delete mSettings.cache;
31
+ super(mSettings);
32
+ this.sViewName = this.viewName;
33
+ this._oContainingView = this;
34
+ }
35
+
36
+ async loadDependency(name: string): Promise<unknown> {
37
+ return new Promise((resolve) => {
38
+ sap.ui.require([name], (MDXContent: Function): void => {
39
+ resolve(MDXContent);
40
+ });
41
+ });
42
+ }
43
+
44
+ async initViewSettings(mSettings: Record<string, unknown>): Promise<void> {
45
+ const viewConfig = this.getViewData() as { viewContent?: Control; _jsxViewName: string } & Record<string, unknown>;
46
+ const viewContent = viewConfig.viewContent || ((await this.loadDependency(viewConfig._jsxViewName)) as Control | Function);
47
+ delete mSettings.cache;
48
+ if ((viewContent as Control)?.getMetadata?.().isA("sap.ui.core.mvc.Controller")) {
49
+ mSettings.controller = new (viewContent as typeof Control)(viewConfig as $ControlSettings);
50
+ } else {
51
+ this.viewContentFn = viewContent as Function;
52
+ }
53
+ }
54
+
55
+ getControllerName(): string {
56
+ const viewData = this.getViewData() as { controllerName: string };
57
+ return viewData.controllerName;
58
+ }
59
+
60
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
61
+ // @ts-ignore
62
+ createContent(oController: JSXViewController): Control {
63
+ ViewLoader.preprocessorData = (this as { mPreprocessors?: { xml?: XMLPreprocessorContext } })?.mPreprocessors?.xml;
64
+ ViewLoader.controller = oController;
65
+
66
+ const owner = Component.getOwnerComponentFor(this)! ?? { runAsOwner: (fn: Function) => fn() };
67
+ return owner.runAsOwner(() => {
68
+ return (ManagedObject as ManagedObjectEx).runWithPreprocessors(
69
+ () => {
70
+ if (oController && oController.render) {
71
+ return oController.render();
72
+ }
73
+ return this.viewContentFn?.();
74
+ },
75
+ {
76
+ id: (sId: string) => {
77
+ return this.createId(sId);
78
+ },
79
+ settings: function () {
80
+ this.controller = oController;
81
+ }
82
+ }
83
+ );
84
+ });
85
+ }
86
+ }
@@ -0,0 +1,177 @@
1
+ /*!
2
+ * SAP UI development toolkit for HTML5 (SAPUI5)
3
+ * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
+ */
5
+ sap.ui.define(["sap/base/Log", "sap/fe/core/helpers/BindingToolkit", "sap/m/Text", "sap/ui/base/DataType", "sap/ui/core/mvc/EventHandlerResolver"], function (Log, BindingToolkit, Text, DataType, EventHandlerResolver) {
6
+ "use strict";
7
+
8
+ var isConstant = BindingToolkit.isConstant;
9
+ var isBindingToolkitExpression = BindingToolkit.isBindingToolkitExpression;
10
+ var compileExpression = BindingToolkit.compileExpression;
11
+ var compileConstant = BindingToolkit.compileConstant;
12
+ const addChildAggregation = function (aggregationChildren, aggregationName, child) {
13
+ if (child === null || child === undefined || typeof child === "string") {
14
+ return;
15
+ }
16
+ if (!aggregationChildren[aggregationName]) {
17
+ aggregationChildren[aggregationName] = [];
18
+ }
19
+ if (isChildAnElement(child)) {
20
+ aggregationChildren[aggregationName].push(child);
21
+ } else if (Array.isArray(child)) {
22
+ child.forEach(subChild => {
23
+ addChildAggregation(aggregationChildren, aggregationName, subChild);
24
+ });
25
+ } else if (typeof child === "function") {
26
+ aggregationChildren[aggregationName] = child;
27
+ } else {
28
+ Object.keys(child).forEach(childKey => {
29
+ addChildAggregation(aggregationChildren, childKey, child[childKey]);
30
+ });
31
+ }
32
+ };
33
+ const isChildAnElement = function (children) {
34
+ var _isA, _ref;
35
+ return children === null || children === void 0 ? void 0 : (_isA = (_ref = children).isA) === null || _isA === void 0 ? void 0 : _isA.call(_ref, "sap.ui.core.Element");
36
+ };
37
+ const isAControl = function (children) {
38
+ return !!(children !== null && children !== void 0 && children.getMetadata);
39
+ };
40
+ function processAggregations(metadata, mSettings) {
41
+ const metadataAggregations = metadata.getAllAggregations();
42
+ const defaultAggregationName = metadata.getDefaultAggregationName();
43
+ const aggregationChildren = {};
44
+ addChildAggregation(aggregationChildren, defaultAggregationName, mSettings.children);
45
+ delete mSettings.children;
46
+ // find out which aggregation are bound (both in children and directly under it)
47
+ Object.keys(metadataAggregations).forEach(aggregationName => {
48
+ if (aggregationChildren[aggregationName] !== undefined) {
49
+ if (mSettings.hasOwnProperty(aggregationName)) {
50
+ if (typeof mSettings[aggregationName] === "string") {
51
+ mSettings[aggregationName] = {
52
+ path: mSettings[aggregationName]
53
+ };
54
+ }
55
+ // always use the first item as template according to UI5 logic
56
+ if (typeof aggregationChildren[aggregationName] === "function") {
57
+ mSettings[aggregationName].factory = aggregationChildren[aggregationName];
58
+ } else {
59
+ mSettings[aggregationName].template = aggregationChildren[aggregationName][0];
60
+ }
61
+ } else {
62
+ mSettings[aggregationName] = aggregationChildren[aggregationName];
63
+ }
64
+ }
65
+ });
66
+ }
67
+
68
+ /**
69
+ * Processes the properties.
70
+ *
71
+ * If the property is a bindingToolkit expression we need to compile it.
72
+ * Else if the property is set as string (compiled binding expression returns string by default even if it's a boolean, int, etc.) and it doesn't match with expected
73
+ * format the value is parsed to provide expected format.
74
+ *
75
+ * @param metadata Metadata of the control
76
+ * @param settings Settings of the control
77
+ * @returns A map of late properties that need to be awaited after the control is created
78
+ */
79
+ function processProperties(metadata, settings) {
80
+ let settingsKey;
81
+ const lateProperties = {};
82
+ for (settingsKey in settings) {
83
+ const value = settings[settingsKey];
84
+ if (isBindingToolkitExpression(value)) {
85
+ const bindingToolkitExpression = value;
86
+ if (isConstant(bindingToolkitExpression)) {
87
+ settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
88
+ } else {
89
+ settings[settingsKey] = compileExpression(bindingToolkitExpression);
90
+ }
91
+ } else if (value !== null && typeof value === "object" && value.then) {
92
+ lateProperties[settingsKey] = value;
93
+ delete settings[settingsKey];
94
+ } else if (typeof value === "string" && !value.startsWith("{")) {
95
+ var _metadata$getAllPrope, _metadata$getAllPrope2, _metadata$getAllPrope3;
96
+ const propertyType = (_metadata$getAllPrope = metadata.getAllProperties()[settingsKey]) === null || _metadata$getAllPrope === void 0 ? void 0 : (_metadata$getAllPrope2 = (_metadata$getAllPrope3 = _metadata$getAllPrope).getType) === null || _metadata$getAllPrope2 === void 0 ? void 0 : _metadata$getAllPrope2.call(_metadata$getAllPrope3);
97
+ if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
98
+ settings[settingsKey] = propertyType.parseValue(value);
99
+ }
100
+ }
101
+ }
102
+ return lateProperties;
103
+ }
104
+
105
+ /**
106
+ * Processes the command.
107
+ *
108
+ * Resolves the command set on the control via the intrinsic class attribute "jsx:command".
109
+ * If no command has been set or the targeted event doesn't exist, no configuration is set.
110
+ *
111
+ * @param metadata Metadata of the control
112
+ * @param settings Settings of the control
113
+ */
114
+ function processCommand(metadata, settings) {
115
+ const commandProperty = settings["jsx:command"];
116
+ if (commandProperty) {
117
+ const [command, eventName] = commandProperty.split("|");
118
+ const event = metadata.getAllEvents()[eventName];
119
+ if (event && command.startsWith("cmd:")) {
120
+ settings[event.name] = EventHandlerResolver.resolveEventHandler(command);
121
+ }
122
+ }
123
+ delete settings["jsx:command"];
124
+ }
125
+ const jsxControl = function (ControlType, settings, key, jsxContext) {
126
+ let targetControl;
127
+ if (ControlType !== null && ControlType !== void 0 && ControlType.isFragment) {
128
+ targetControl = settings.children;
129
+ } else if (ControlType !== null && ControlType !== void 0 && ControlType.isRuntime) {
130
+ var _runtimeBuildingBlock;
131
+ const runtimeBuildingBlock = new ControlType(settings);
132
+ targetControl = (_runtimeBuildingBlock = runtimeBuildingBlock.getContent) === null || _runtimeBuildingBlock === void 0 ? void 0 : _runtimeBuildingBlock.call(runtimeBuildingBlock, jsxContext.view, jsxContext.appComponent);
133
+ } else if (isAControl(ControlType)) {
134
+ const metadata = ControlType.getMetadata();
135
+ if (key !== undefined) {
136
+ settings["key"] = key;
137
+ }
138
+ processCommand(metadata, settings);
139
+ processAggregations(metadata, settings);
140
+ const classDef = settings.class;
141
+ const refDef = settings.ref;
142
+ const bindingDef = settings.binding;
143
+ delete settings.ref;
144
+ delete settings.class;
145
+ delete settings.binding;
146
+ const lateProperties = processProperties(metadata, settings);
147
+ const targetControlInstance = new ControlType(settings);
148
+ if (classDef) {
149
+ targetControlInstance.addStyleClass(classDef);
150
+ }
151
+ if (refDef) {
152
+ refDef.setCurrent(targetControlInstance);
153
+ }
154
+ if (bindingDef) {
155
+ targetControlInstance.bindElement(bindingDef);
156
+ }
157
+ for (const latePropertiesKey in lateProperties) {
158
+ lateProperties[latePropertiesKey].then(value => {
159
+ return targetControlInstance.setProperty(latePropertiesKey, value);
160
+ }).catch(error => {
161
+ Log.error(`Couldn't set property ${latePropertiesKey} on ${ControlType.getMetadata().getName()}`, error, "jsxControl");
162
+ });
163
+ }
164
+ targetControl = targetControlInstance;
165
+ } else if (typeof ControlType === "function") {
166
+ const controlTypeFn = ControlType;
167
+ targetControl = controlTypeFn(settings);
168
+ } else {
169
+ targetControl = new Text({
170
+ text: "Missing component " + ControlType
171
+ });
172
+ }
173
+ return targetControl;
174
+ };
175
+ return jsxControl;
176
+ }, false);
177
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhZGRDaGlsZEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25DaGlsZHJlbiIsImFnZ3JlZ2F0aW9uTmFtZSIsImNoaWxkIiwidW5kZWZpbmVkIiwiaXNDaGlsZEFuRWxlbWVudCIsInB1c2giLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwic3ViQ2hpbGQiLCJPYmplY3QiLCJrZXlzIiwiY2hpbGRLZXkiLCJjaGlsZHJlbiIsImlzQSIsImlzQUNvbnRyb2wiLCJnZXRNZXRhZGF0YSIsInByb2Nlc3NBZ2dyZWdhdGlvbnMiLCJtZXRhZGF0YSIsIm1TZXR0aW5ncyIsIm1ldGFkYXRhQWdncmVnYXRpb25zIiwiZ2V0QWxsQWdncmVnYXRpb25zIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSIsImdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUiLCJoYXNPd25Qcm9wZXJ0eSIsInBhdGgiLCJmYWN0b3J5IiwidGVtcGxhdGUiLCJwcm9jZXNzUHJvcGVydGllcyIsInNldHRpbmdzIiwic2V0dGluZ3NLZXkiLCJsYXRlUHJvcGVydGllcyIsInZhbHVlIiwiaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24iLCJpc0NvbnN0YW50IiwiY29tcGlsZUNvbnN0YW50IiwiY29tcGlsZUV4cHJlc3Npb24iLCJ0aGVuIiwic3RhcnRzV2l0aCIsInByb3BlcnR5VHlwZSIsImdldEFsbFByb3BlcnRpZXMiLCJnZXRUeXBlIiwiRGF0YVR5cGUiLCJpbmNsdWRlcyIsImdldE5hbWUiLCJwYXJzZVZhbHVlIiwicHJvY2Vzc0NvbW1hbmQiLCJjb21tYW5kUHJvcGVydHkiLCJjb21tYW5kIiwiZXZlbnROYW1lIiwic3BsaXQiLCJldmVudCIsImdldEFsbEV2ZW50cyIsIm5hbWUiLCJFdmVudEhhbmRsZXJSZXNvbHZlciIsInJlc29sdmVFdmVudEhhbmRsZXIiLCJqc3hDb250cm9sIiwiQ29udHJvbFR5cGUiLCJrZXkiLCJqc3hDb250ZXh0IiwidGFyZ2V0Q29udHJvbCIsImlzRnJhZ21lbnQiLCJpc1J1bnRpbWUiLCJydW50aW1lQnVpbGRpbmdCbG9jayIsImdldENvbnRlbnQiLCJ2aWV3IiwiYXBwQ29tcG9uZW50IiwiY2xhc3NEZWYiLCJjbGFzcyIsInJlZkRlZiIsInJlZiIsImJpbmRpbmdEZWYiLCJiaW5kaW5nIiwidGFyZ2V0Q29udHJvbEluc3RhbmNlIiwiYWRkU3R5bGVDbGFzcyIsInNldEN1cnJlbnQiLCJiaW5kRWxlbWVudCIsImxhdGVQcm9wZXJ0aWVzS2V5Iiwic2V0UHJvcGVydHkiLCJjYXRjaCIsImVycm9yIiwiTG9nIiwiY29udHJvbFR5cGVGbiIsIlRleHQiLCJ0ZXh0Il0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJqc3gtY29udHJvbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nIGZyb20gXCJzYXAvYmFzZS9Mb2dcIjtcbmltcG9ydCB0eXBlIHsgQ29udHJvbFByb3BlcnRpZXMsIEpTWENvbnRleHQsIE5vbkNvbnRyb2xQcm9wZXJ0aWVzLCBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBCdWlsZGluZ0Jsb2NrVGVtcGxhdGluZ0Jhc2UgZnJvbSBcInNhcC9mZS9jb3JlL2J1aWxkaW5nQmxvY2tzL3RlbXBsYXRpbmcvQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlXCI7XG5pbXBvcnQgdHlwZSBSdW50aW1lQnVpbGRpbmdCbG9jayBmcm9tIFwic2FwL2ZlL2NvcmUvYnVpbGRpbmdCbG9ja3MvdGVtcGxhdGluZy9SdW50aW1lQnVpbGRpbmdCbG9ja1wiO1xuaW1wb3J0IHR5cGUgeyBCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24gfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IHsgY29tcGlsZUNvbnN0YW50LCBjb21waWxlRXhwcmVzc2lvbiwgaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24sIGlzQ29uc3RhbnQgfSBmcm9tIFwic2FwL2ZlL2NvcmUvaGVscGVycy9CaW5kaW5nVG9vbGtpdFwiO1xuaW1wb3J0IFRleHQgZnJvbSBcInNhcC9tL1RleHRcIjtcbmltcG9ydCBEYXRhVHlwZSBmcm9tIFwic2FwL3VpL2Jhc2UvRGF0YVR5cGVcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3RNZXRhZGF0YSBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdE1ldGFkYXRhXCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyBkZWZhdWx0IGFzIEVsZW1lbnQsIGRlZmF1bHQgYXMgVUk1RWxlbWVudCB9IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgRXZlbnRIYW5kbGVyUmVzb2x2ZXIgZnJvbSBcInNhcC91aS9jb3JlL212Yy9FdmVudEhhbmRsZXJSZXNvbHZlclwiO1xuXG5jb25zdCBhZGRDaGlsZEFnZ3JlZ2F0aW9uID0gZnVuY3Rpb24gKFxuXHRhZ2dyZWdhdGlvbkNoaWxkcmVuOiBSZWNvcmQ8c3RyaW5nLCAoc3RyaW5nIHwgVUk1RWxlbWVudClbXT4sXG5cdGFnZ3JlZ2F0aW9uTmFtZTogc3RyaW5nLFxuXHRjaGlsZD86IHN0cmluZyB8IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W11cbik6IHZvaWQge1xuXHRpZiAoY2hpbGQgPT09IG51bGwgfHwgY2hpbGQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2hpbGQgPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm47XG5cdH1cblx0aWYgKCFhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0pIHtcblx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0gPSBbXTtcblx0fVxuXHRpZiAoaXNDaGlsZEFuRWxlbWVudChjaGlsZCkpIHtcblx0XHRhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV0ucHVzaChjaGlsZCk7XG5cdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShjaGlsZCkpIHtcblx0XHRjaGlsZC5mb3JFYWNoKChzdWJDaGlsZCkgPT4ge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBhZ2dyZWdhdGlvbk5hbWUsIHN1YkNoaWxkKTtcblx0XHR9KTtcblx0fSBlbHNlIGlmICh0eXBlb2YgY2hpbGQgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9IGNoaWxkO1xuXHR9IGVsc2Uge1xuXHRcdE9iamVjdC5rZXlzKGNoaWxkKS5mb3JFYWNoKChjaGlsZEtleSkgPT4ge1xuXHRcdFx0YWRkQ2hpbGRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkNoaWxkcmVuLCBjaGlsZEtleSwgY2hpbGRbY2hpbGRLZXldKTtcblx0XHR9KTtcblx0fVxufTtcbmNvbnN0IGlzQ2hpbGRBbkVsZW1lbnQgPSBmdW5jdGlvbiAoY2hpbGRyZW4/OiB1bmtub3duKTogY2hpbGRyZW4gaXMgRWxlbWVudCB7XG5cdHJldHVybiAoY2hpbGRyZW4gYXMgRWxlbWVudCk/LmlzQT8uKFwic2FwLnVpLmNvcmUuRWxlbWVudFwiKTtcbn07XG5jb25zdCBpc0FDb250cm9sID0gZnVuY3Rpb24gKGNoaWxkcmVuPzogdHlwZW9mIENvbnRyb2wgfCBGdW5jdGlvbik6IGNoaWxkcmVuIGlzIHR5cGVvZiBDb250cm9sIHtcblx0cmV0dXJuICEhKGNoaWxkcmVuIGFzIHR5cGVvZiBDb250cm9sKT8uZ2V0TWV0YWRhdGE7XG59O1xuXG5mdW5jdGlvbiBwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhOiBNYW5hZ2VkT2JqZWN0TWV0YWRhdGEsIG1TZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcblx0Y29uc3QgbWV0YWRhdGFBZ2dyZWdhdGlvbnMgPSBtZXRhZGF0YS5nZXRBbGxBZ2dyZWdhdGlvbnMoKTtcblx0Y29uc3QgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSA9IG1ldGFkYXRhLmdldERlZmF1bHRBZ2dyZWdhdGlvbk5hbWUoKTtcblx0Y29uc3QgYWdncmVnYXRpb25DaGlsZHJlbjogUmVjb3JkPHN0cmluZywgKHN0cmluZyB8IFVJNUVsZW1lbnQpW10+ID0ge307XG5cdGFkZENoaWxkQWdncmVnYXRpb24oYWdncmVnYXRpb25DaGlsZHJlbiwgZGVmYXVsdEFnZ3JlZ2F0aW9uTmFtZSwgbVNldHRpbmdzLmNoaWxkcmVuIGFzIHN0cmluZyB8IFVJNUVsZW1lbnQgfCBVSTVFbGVtZW50W10pO1xuXHRkZWxldGUgbVNldHRpbmdzLmNoaWxkcmVuO1xuXHQvLyBmaW5kIG91dCB3aGljaCBhZ2dyZWdhdGlvbiBhcmUgYm91bmQgKGJvdGggaW4gY2hpbGRyZW4gYW5kIGRpcmVjdGx5IHVuZGVyIGl0KVxuXHRPYmplY3Qua2V5cyhtZXRhZGF0YUFnZ3JlZ2F0aW9ucykuZm9yRWFjaCgoYWdncmVnYXRpb25OYW1lKSA9PiB7XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAobVNldHRpbmdzLmhhc093blByb3BlcnR5KGFnZ3JlZ2F0aW9uTmFtZSkpIHtcblx0XHRcdFx0aWYgKHR5cGVvZiBtU2V0dGluZ3NbYWdncmVnYXRpb25OYW1lXSA9PT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0ge1xuXHRcdFx0XHRcdFx0cGF0aDogbVNldHRpbmdzW2FnZ3JlZ2F0aW9uTmFtZV1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vIGFsd2F5cyB1c2UgdGhlIGZpcnN0IGl0ZW0gYXMgdGVtcGxhdGUgYWNjb3JkaW5nIHRvIFVJNSBsb2dpY1xuXHRcdFx0XHRpZiAodHlwZW9mIGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bYWdncmVnYXRpb25OYW1lXSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgZmFjdG9yeTogRnVuY3Rpb24gfSkuZmFjdG9yeSA9IGFnZ3JlZ2F0aW9uQ2hpbGRyZW5bXG5cdFx0XHRcdFx0XHRhZ2dyZWdhdGlvbk5hbWVcblx0XHRcdFx0XHRdIGFzIHVua25vd24gYXMgRnVuY3Rpb247XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdIGFzIHsgdGVtcGxhdGU6IHN0cmluZyB8IFVJNUVsZW1lbnQgfSkudGVtcGxhdGUgPSBhZ2dyZWdhdGlvbkNoaWxkcmVuW2FnZ3JlZ2F0aW9uTmFtZV1bMF07XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1TZXR0aW5nc1thZ2dyZWdhdGlvbk5hbWVdID0gYWdncmVnYXRpb25DaGlsZHJlblthZ2dyZWdhdGlvbk5hbWVdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG59XG5cbi8qKlxuICogUHJvY2Vzc2VzIHRoZSBwcm9wZXJ0aWVzLlxuICpcbiAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhIGJpbmRpbmdUb29sa2l0IGV4cHJlc3Npb24gd2UgbmVlZCB0byBjb21waWxlIGl0LlxuICogRWxzZSBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IGFzIHN0cmluZyAoY29tcGlsZWQgYmluZGluZyBleHByZXNzaW9uIHJldHVybnMgc3RyaW5nIGJ5IGRlZmF1bHQgZXZlbiBpZiBpdCdzIGEgYm9vbGVhbiwgaW50LCBldGMuKSBhbmQgaXQgZG9lc24ndCBtYXRjaCB3aXRoIGV4cGVjdGVkXG4gKiBmb3JtYXQgdGhlIHZhbHVlIGlzIHBhcnNlZCB0byBwcm92aWRlIGV4cGVjdGVkIGZvcm1hdC5cbiAqXG4gKiBAcGFyYW0gbWV0YWRhdGEgTWV0YWRhdGEgb2YgdGhlIGNvbnRyb2xcbiAqIEBwYXJhbSBzZXR0aW5ncyBTZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICogQHJldHVybnMgQSBtYXAgb2YgbGF0ZSBwcm9wZXJ0aWVzIHRoYXQgbmVlZCB0byBiZSBhd2FpdGVkIGFmdGVyIHRoZSBjb250cm9sIGlzIGNyZWF0ZWRcbiAqL1xuZnVuY3Rpb24gcHJvY2Vzc1Byb3BlcnRpZXMobWV0YWRhdGE6IE1hbmFnZWRPYmplY3RNZXRhZGF0YSwgc2V0dGluZ3M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVjb3JkPHN0cmluZywgUHJvbWlzZTx1bmtub3duPj4ge1xuXHRsZXQgc2V0dGluZ3NLZXk6IGtleW9mIHR5cGVvZiBzZXR0aW5ncztcblx0Y29uc3QgbGF0ZVByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFByb21pc2U8dW5rbm93bj4+ID0ge307XG5cdGZvciAoc2V0dGluZ3NLZXkgaW4gc2V0dGluZ3MpIHtcblx0XHRjb25zdCB2YWx1ZSA9IHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHRpZiAoaXNCaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24odmFsdWUpKSB7XG5cdFx0XHRjb25zdCBiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb246IEJpbmRpbmdUb29sa2l0RXhwcmVzc2lvbjx1bmtub3duPiA9IHZhbHVlO1xuXHRcdFx0aWYgKGlzQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uKSkge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlQ29uc3RhbnQoYmluZGluZ1Rvb2xraXRFeHByZXNzaW9uLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZXR0aW5nc1tzZXR0aW5nc0tleV0gPSBjb21waWxlRXhwcmVzc2lvbihiaW5kaW5nVG9vbGtpdEV4cHJlc3Npb24pO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiICYmICh2YWx1ZSBhcyBQcm9taXNlPHVua25vd24+KS50aGVuKSB7XG5cdFx0XHRsYXRlUHJvcGVydGllc1tzZXR0aW5nc0tleV0gPSB2YWx1ZSBhcyBQcm9taXNlPHVua25vd24+O1xuXHRcdFx0ZGVsZXRlIHNldHRpbmdzW3NldHRpbmdzS2V5XTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIntcIikpIHtcblx0XHRcdGNvbnN0IHByb3BlcnR5VHlwZSA9IChtZXRhZGF0YS5nZXRBbGxQcm9wZXJ0aWVzKClbc2V0dGluZ3NLZXldIGFzIHsgZ2V0VHlwZT86IEZ1bmN0aW9uIH0pPy5nZXRUeXBlPy4oKTtcblx0XHRcdGlmIChwcm9wZXJ0eVR5cGUgJiYgcHJvcGVydHlUeXBlIGluc3RhbmNlb2YgRGF0YVR5cGUgJiYgW1wiYm9vbGVhblwiLCBcImludFwiLCBcImZsb2F0XCJdLmluY2x1ZGVzKHByb3BlcnR5VHlwZS5nZXROYW1lKCkpKSB7XG5cdFx0XHRcdHNldHRpbmdzW3NldHRpbmdzS2V5XSA9IHByb3BlcnR5VHlwZS5wYXJzZVZhbHVlKHZhbHVlKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblx0cmV0dXJuIGxhdGVQcm9wZXJ0aWVzO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgY29tbWFuZC5cbiAqXG4gKiBSZXNvbHZlcyB0aGUgY29tbWFuZCBzZXQgb24gdGhlIGNvbnRyb2wgdmlhIHRoZSBpbnRyaW5zaWMgY2xhc3MgYXR0cmlidXRlIFwianN4OmNvbW1hbmRcIi5cbiAqIElmIG5vIGNvbW1hbmQgaGFzIGJlZW4gc2V0IG9yIHRoZSB0YXJnZXRlZCBldmVudCBkb2Vzbid0IGV4aXN0LCBubyBjb25maWd1cmF0aW9uIGlzIHNldC5cbiAqXG4gKiBAcGFyYW0gbWV0YWRhdGEgTWV0YWRhdGEgb2YgdGhlIGNvbnRyb2xcbiAqIEBwYXJhbSBzZXR0aW5ncyBTZXR0aW5ncyBvZiB0aGUgY29udHJvbFxuICovXG5mdW5jdGlvbiBwcm9jZXNzQ29tbWFuZChtZXRhZGF0YTogTWFuYWdlZE9iamVjdE1ldGFkYXRhLCBzZXR0aW5nczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB2b2lkIHtcblx0Y29uc3QgY29tbWFuZFByb3BlcnR5ID0gc2V0dGluZ3NbXCJqc3g6Y29tbWFuZFwiXTtcblx0aWYgKGNvbW1hbmRQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IFtjb21tYW5kLCBldmVudE5hbWVdID0gKGNvbW1hbmRQcm9wZXJ0eSBhcyBzdHJpbmcpLnNwbGl0KFwifFwiKTtcblx0XHRjb25zdCBldmVudCA9IG1ldGFkYXRhLmdldEFsbEV2ZW50cygpW2V2ZW50TmFtZV07XG5cdFx0aWYgKGV2ZW50ICYmIGNvbW1hbmQuc3RhcnRzV2l0aChcImNtZDpcIikpIHtcblx0XHRcdHNldHRpbmdzW2V2ZW50Lm5hbWVdID0gRXZlbnRIYW5kbGVyUmVzb2x2ZXIucmVzb2x2ZUV2ZW50SGFuZGxlcihjb21tYW5kKTtcblx0XHR9XG5cdH1cblx0ZGVsZXRlIHNldHRpbmdzW1wianN4OmNvbW1hbmRcIl07XG59XG5cbmNvbnN0IGpzeENvbnRyb2wgPSBmdW5jdGlvbiA8VCBleHRlbmRzIEVsZW1lbnQ+KFxuXHRDb250cm9sVHlwZTogdHlwZW9mIENvbnRyb2wgfCBGdW5jdGlvbixcblx0c2V0dGluZ3M6IE5vbkNvbnRyb2xQcm9wZXJ0aWVzPFQ+ICYge1xuXHRcdGtleTogc3RyaW5nO1xuXHRcdGNoaWxkcmVuPzogRWxlbWVudCB8IENvbnRyb2xQcm9wZXJ0aWVzPFQ+O1xuXHRcdHJlZj86IFJlZjxUPjtcblx0XHRiaW5kaW5nPzogc3RyaW5nO1xuXHRcdGNsYXNzPzogc3RyaW5nO1xuXHR9LFxuXHRrZXk6IHN0cmluZyxcblx0anN4Q29udGV4dDogSlNYQ29udGV4dFxuKTogQ29udHJvbCB8IENvbnRyb2xbXSB8IHVuZGVmaW5lZCB7XG5cdGxldCB0YXJnZXRDb250cm9sOiBDb250cm9sIHwgQ29udHJvbFtdIHwgdW5kZWZpbmVkO1xuXG5cdGlmICgoQ29udHJvbFR5cGUgYXMgeyBpc0ZyYWdtZW50PzogYm9vbGVhbiB9KT8uaXNGcmFnbWVudCkge1xuXHRcdHRhcmdldENvbnRyb2wgPSBzZXR0aW5ncy5jaGlsZHJlbiBhcyBDb250cm9sIHwgQ29udHJvbFtdO1xuXHR9IGVsc2UgaWYgKChDb250cm9sVHlwZSBhcyB0eXBlb2YgQnVpbGRpbmdCbG9ja1RlbXBsYXRpbmdCYXNlKT8uaXNSdW50aW1lKSB7XG5cdFx0Y29uc3QgcnVudGltZUJ1aWxkaW5nQmxvY2sgPSBuZXcgKENvbnRyb2xUeXBlIGFzIHR5cGVvZiBSdW50aW1lQnVpbGRpbmdCbG9jaykoc2V0dGluZ3MgYXMgdW5rbm93biBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0XHR0YXJnZXRDb250cm9sID0gcnVudGltZUJ1aWxkaW5nQmxvY2suZ2V0Q29udGVudD8uKGpzeENvbnRleHQudmlldyEsIGpzeENvbnRleHQuYXBwQ29tcG9uZW50ISk7XG5cdH0gZWxzZSBpZiAoaXNBQ29udHJvbChDb250cm9sVHlwZSkpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IENvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCk7XG5cdFx0aWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRzZXR0aW5nc1tcImtleVwiXSA9IGtleTtcblx0XHR9XG5cdFx0cHJvY2Vzc0NvbW1hbmQobWV0YWRhdGEsIHNldHRpbmdzKTtcblx0XHRwcm9jZXNzQWdncmVnYXRpb25zKG1ldGFkYXRhLCBzZXR0aW5ncyk7XG5cdFx0Y29uc3QgY2xhc3NEZWYgPSBzZXR0aW5ncy5jbGFzcztcblx0XHRjb25zdCByZWZEZWYgPSBzZXR0aW5ncy5yZWY7XG5cdFx0Y29uc3QgYmluZGluZ0RlZiA9IHNldHRpbmdzLmJpbmRpbmc7XG5cdFx0ZGVsZXRlIHNldHRpbmdzLnJlZjtcblx0XHRkZWxldGUgc2V0dGluZ3MuY2xhc3M7XG5cdFx0ZGVsZXRlIHNldHRpbmdzLmJpbmRpbmc7XG5cdFx0Y29uc3QgbGF0ZVByb3BlcnRpZXMgPSBwcm9jZXNzUHJvcGVydGllcyhtZXRhZGF0YSwgc2V0dGluZ3MpO1xuXHRcdGNvbnN0IHRhcmdldENvbnRyb2xJbnN0YW5jZSA9IG5ldyBDb250cm9sVHlwZShzZXR0aW5ncyBhcyAkQ29udHJvbFNldHRpbmdzKTtcblx0XHRpZiAoY2xhc3NEZWYpIHtcblx0XHRcdHRhcmdldENvbnRyb2xJbnN0YW5jZS5hZGRTdHlsZUNsYXNzKGNsYXNzRGVmKTtcblx0XHR9XG5cdFx0aWYgKHJlZkRlZikge1xuXHRcdFx0cmVmRGVmLnNldEN1cnJlbnQodGFyZ2V0Q29udHJvbEluc3RhbmNlIGFzIHVua25vd24gYXMgVCk7XG5cdFx0fVxuXHRcdGlmIChiaW5kaW5nRGVmKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sSW5zdGFuY2UuYmluZEVsZW1lbnQoYmluZGluZ0RlZik7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgbGF0ZVByb3BlcnRpZXNLZXkgaW4gbGF0ZVByb3BlcnRpZXMpIHtcblx0XHRcdGxhdGVQcm9wZXJ0aWVzW2xhdGVQcm9wZXJ0aWVzS2V5XVxuXHRcdFx0XHQudGhlbigodmFsdWUpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbEluc3RhbmNlLnNldFByb3BlcnR5KGxhdGVQcm9wZXJ0aWVzS2V5LCB2YWx1ZSk7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5jYXRjaCgoZXJyb3IpID0+IHtcblx0XHRcdFx0XHRMb2cuZXJyb3IoYENvdWxkbid0IHNldCBwcm9wZXJ0eSAke2xhdGVQcm9wZXJ0aWVzS2V5fSBvbiAke0NvbnRyb2xUeXBlLmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpfWAsIGVycm9yLCBcImpzeENvbnRyb2xcIik7XG5cdFx0XHRcdH0pO1xuXHRcdH1cblx0XHR0YXJnZXRDb250cm9sID0gdGFyZ2V0Q29udHJvbEluc3RhbmNlO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBDb250cm9sVHlwZSA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0Y29uc3QgY29udHJvbFR5cGVGbiA9IENvbnRyb2xUeXBlO1xuXHRcdHRhcmdldENvbnRyb2wgPSBjb250cm9sVHlwZUZuKHNldHRpbmdzIGFzICRDb250cm9sU2V0dGluZ3MpO1xuXHR9IGVsc2Uge1xuXHRcdHRhcmdldENvbnRyb2wgPSBuZXcgVGV4dCh7IHRleHQ6IFwiTWlzc2luZyBjb21wb25lbnQgXCIgKyAoQ29udHJvbFR5cGUgYXMgc3RyaW5nKSB9KTtcblx0fVxuXG5cdHJldHVybiB0YXJnZXRDb250cm9sO1xufTtcblxuZXhwb3J0IGRlZmF1bHQganN4Q29udHJvbDtcbiJdLCJtYXBwaW5ncyI6IjtBQUFBO0FBQUE7QUFBQTs7Ozs7Ozs7RUFjQSxNQUFNQSxtQkFBbUIsR0FBRyxVQUMzQkMsbUJBQTRELEVBQzVEQyxlQUF1QixFQUN2QkMsS0FBMEMsRUFDbkM7SUFDUCxJQUFJQSxLQUFLLEtBQUssSUFBSSxJQUFJQSxLQUFLLEtBQUtDLFNBQVMsSUFBSSxPQUFPRCxLQUFLLEtBQUssUUFBUSxFQUFFO01BQ3ZFO0lBQ0Q7SUFDQSxJQUFJLENBQUNGLG1CQUFtQixDQUFDQyxlQUFlLENBQUMsRUFBRTtNQUMxQ0QsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxHQUFHLEVBQUU7SUFDMUM7SUFDQSxJQUFJRyxnQkFBZ0IsQ0FBQ0YsS0FBSyxDQUFDLEVBQUU7TUFDNUJGLG1CQUFtQixDQUFDQyxlQUFlLENBQUMsQ0FBQ0ksSUFBSSxDQUFDSCxLQUFLLENBQUM7SUFDakQsQ0FBQyxNQUFNLElBQUlJLEtBQUssQ0FBQ0MsT0FBTyxDQUFDTCxLQUFLLENBQUMsRUFBRTtNQUNoQ0EsS0FBSyxDQUFDTSxPQUFPLENBQUVDLFFBQVEsSUFBSztRQUMzQlYsbUJBQW1CLENBQUNDLG1CQUFtQixFQUFFQyxlQUFlLEVBQUVRLFFBQVEsQ0FBQztNQUNwRSxDQUFDLENBQUM7SUFDSCxDQUFDLE1BQU0sSUFBSSxPQUFPUCxLQUFLLEtBQUssVUFBVSxFQUFFO01BQ3ZDRixtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDLEdBQUdDLEtBQUs7SUFDN0MsQ0FBQyxNQUFNO01BQ05RLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDVCxLQUFLLENBQUMsQ0FBQ00sT0FBTyxDQUFFSSxRQUFRLElBQUs7UUFDeENiLG1CQUFtQixDQUFDQyxtQkFBbUIsRUFBRVksUUFBUSxFQUFFVixLQUFLLENBQUNVLFFBQVEsQ0FBQyxDQUFDO01BQ3BFLENBQUMsQ0FBQztJQUNIO0VBQ0QsQ0FBQztFQUNELE1BQU1SLGdCQUFnQixHQUFHLFVBQVVTLFFBQWtCLEVBQXVCO0lBQUE7SUFDM0UsT0FBUUEsUUFBUSxhQUFSQSxRQUFRLCtCQUFULFFBQUNBLFFBQVEsRUFBY0MsR0FBRyx5Q0FBMUIsZ0JBQTZCLHFCQUFxQixDQUFDO0VBQzNELENBQUM7RUFDRCxNQUFNQyxVQUFVLEdBQUcsVUFBVUYsUUFBb0MsRUFBOEI7SUFDOUYsT0FBTyxDQUFDLEVBQUVBLFFBQVEsYUFBUkEsUUFBUSxlQUFSQSxRQUFRLENBQXFCRyxXQUFXO0VBQ25ELENBQUM7RUFFRCxTQUFTQyxtQkFBbUIsQ0FBQ0MsUUFBK0IsRUFBRUMsU0FBa0MsRUFBUTtJQUN2RyxNQUFNQyxvQkFBb0IsR0FBR0YsUUFBUSxDQUFDRyxrQkFBa0IsRUFBRTtJQUMxRCxNQUFNQyxzQkFBc0IsR0FBR0osUUFBUSxDQUFDSyx5QkFBeUIsRUFBRTtJQUNuRSxNQUFNdkIsbUJBQTRELEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFRCxtQkFBbUIsQ0FBQ0MsbUJBQW1CLEVBQUVzQixzQkFBc0IsRUFBRUgsU0FBUyxDQUFDTixRQUFRLENBQXVDO0lBQzFILE9BQU9NLFNBQVMsQ0FBQ04sUUFBUTtJQUN6QjtJQUNBSCxNQUFNLENBQUNDLElBQUksQ0FBQ1Msb0JBQW9CLENBQUMsQ0FBQ1osT0FBTyxDQUFFUCxlQUFlLElBQUs7TUFDOUQsSUFBSUQsbUJBQW1CLENBQUNDLGVBQWUsQ0FBQyxLQUFLRSxTQUFTLEVBQUU7UUFDdkQsSUFBSWdCLFNBQVMsQ0FBQ0ssY0FBYyxDQUFDdkIsZUFBZSxDQUFDLEVBQUU7VUFDOUMsSUFBSSxPQUFPa0IsU0FBUyxDQUFDbEIsZUFBZSxDQUFDLEtBQUssUUFBUSxFQUFFO1lBQ25Ea0IsU0FBUyxDQUFDbEIsZUFBZSxDQUFDLEdBQUc7Y0FDNUJ3QixJQUFJLEVBQUVOLFNBQVMsQ0FBQ2xCLGVBQWU7WUFDaEMsQ0FBQztVQUNGO1VBQ0E7VUFDQSxJQUFJLE9BQU9ELG1CQUFtQixDQUFDQyxlQUFlLENBQUMsS0FBSyxVQUFVLEVBQUU7WUFDOURrQixTQUFTLENBQUNsQixlQUFlLENBQUMsQ0FBMkJ5QixPQUFPLEdBQUcxQixtQkFBbUIsQ0FDbEZDLGVBQWUsQ0FDUTtVQUN6QixDQUFDLE1BQU07WUFDTGtCLFNBQVMsQ0FBQ2xCLGVBQWUsQ0FBQyxDQUF1QzBCLFFBQVEsR0FBRzNCLG1CQUFtQixDQUFDQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDckg7UUFDRCxDQUFDLE1BQU07VUFDTmtCLFNBQVMsQ0FBQ2xCLGVBQWUsQ0FBQyxHQUFHRCxtQkFBbUIsQ0FBQ0MsZUFBZSxDQUFDO1FBQ2xFO01BQ0Q7SUFDRCxDQUFDLENBQUM7RUFDSDs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0EsU0FBUzJCLGlCQUFpQixDQUFDVixRQUErQixFQUFFVyxRQUFpQyxFQUFvQztJQUNoSSxJQUFJQyxXQUFrQztJQUN0QyxNQUFNQyxjQUFnRCxHQUFHLENBQUMsQ0FBQztJQUMzRCxLQUFLRCxXQUFXLElBQUlELFFBQVEsRUFBRTtNQUM3QixNQUFNRyxLQUFLLEdBQUdILFFBQVEsQ0FBQ0MsV0FBVyxDQUFDO01BQ25DLElBQUlHLDBCQUEwQixDQUFDRCxLQUFLLENBQUMsRUFBRTtRQUN0QyxNQUFNRSx3QkFBMkQsR0FBR0YsS0FBSztRQUN6RSxJQUFJRyxVQUFVLENBQUNELHdCQUF3QixDQUFDLEVBQUU7VUFDekNMLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDLEdBQUdNLGVBQWUsQ0FBQ0Ysd0JBQXdCLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7UUFDckYsQ0FBQyxNQUFNO1VBQ05MLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDLEdBQUdPLGlCQUFpQixDQUFDSCx3QkFBd0IsQ0FBQztRQUNwRTtNQUNELENBQUMsTUFBTSxJQUFJRixLQUFLLEtBQUssSUFBSSxJQUFJLE9BQU9BLEtBQUssS0FBSyxRQUFRLElBQUtBLEtBQUssQ0FBc0JNLElBQUksRUFBRTtRQUMzRlAsY0FBYyxDQUFDRCxXQUFXLENBQUMsR0FBR0UsS0FBeUI7UUFDdkQsT0FBT0gsUUFBUSxDQUFDQyxXQUFXLENBQUM7TUFDN0IsQ0FBQyxNQUFNLElBQUksT0FBT0UsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDQSxLQUFLLENBQUNPLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUFBO1FBQy9ELE1BQU1DLFlBQVksNEJBQUl0QixRQUFRLENBQUN1QixnQkFBZ0IsRUFBRSxDQUFDWCxXQUFXLENBQUMsb0ZBQXpDLGlEQUFzRVksT0FBTywyREFBN0UsbURBQWlGO1FBQ3RHLElBQUlGLFlBQVksSUFBSUEsWUFBWSxZQUFZRyxRQUFRLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDQyxRQUFRLENBQUNKLFlBQVksQ0FBQ0ssT0FBTyxFQUFFLENBQUMsRUFBRTtVQUNySGhCLFFBQVEsQ0FBQ0MsV0FBVyxDQUFDLEdBQUdVLFlBQVksQ0FBQ00sVUFBVSxDQUFDZCxLQUFLLENBQUM7UUFDdkQ7TUFDRDtJQUNEO0lBQ0EsT0FBT0QsY0FBYztFQUN0Qjs7RUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTZ0IsY0FBYyxDQUFDN0IsUUFBK0IsRUFBRVcsUUFBaUMsRUFBUTtJQUNqRyxNQUFNbUIsZUFBZSxHQUFHbkIsUUFBUSxDQUFDLGFBQWEsQ0FBQztJQUMvQyxJQUFJbUIsZUFBZSxFQUFFO01BQ3BCLE1BQU0sQ0FBQ0MsT0FBTyxFQUFFQyxTQUFTLENBQUMsR0FBSUYsZUFBZSxDQUFZRyxLQUFLLENBQUMsR0FBRyxDQUFDO01BQ25FLE1BQU1DLEtBQUssR0FBR2xDLFFBQVEsQ0FBQ21DLFlBQVksRUFBRSxDQUFDSCxTQUFTLENBQUM7TUFDaEQsSUFBSUUsS0FBSyxJQUFJSCxPQUFPLENBQUNWLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUN4Q1YsUUFBUSxDQUFDdUIsS0FBSyxDQUFDRSxJQUFJLENBQUMsR0FBR0Msb0JBQW9CLENBQUNDLG1CQUFtQixDQUFDUCxPQUFPLENBQUM7TUFDekU7SUFDRDtJQUNBLE9BQU9wQixRQUFRLENBQUMsYUFBYSxDQUFDO0VBQy9CO0VBRUEsTUFBTTRCLFVBQVUsR0FBRyxVQUNsQkMsV0FBc0MsRUFDdEM3QixRQU1DLEVBQ0Q4QixHQUFXLEVBQ1hDLFVBQXNCLEVBQ1k7SUFDbEMsSUFBSUMsYUFBOEM7SUFFbEQsSUFBS0gsV0FBVyxhQUFYQSxXQUFXLGVBQVhBLFdBQVcsQ0FBK0JJLFVBQVUsRUFBRTtNQUMxREQsYUFBYSxHQUFHaEMsUUFBUSxDQUFDaEIsUUFBK0I7SUFDekQsQ0FBQyxNQUFNLElBQUs2QyxXQUFXLGFBQVhBLFdBQVcsZUFBWEEsV0FBVyxDQUF5Q0ssU0FBUyxFQUFFO01BQUE7TUFDMUUsTUFBTUMsb0JBQW9CLEdBQUcsSUFBS04sV0FBVyxDQUFpQzdCLFFBQVEsQ0FBZ0M7TUFDdEhnQyxhQUFhLDRCQUFHRyxvQkFBb0IsQ0FBQ0MsVUFBVSwwREFBL0IsMkJBQUFELG9CQUFvQixFQUFjSixVQUFVLENBQUNNLElBQUksRUFBR04sVUFBVSxDQUFDTyxZQUFZLENBQUU7SUFDOUYsQ0FBQyxNQUFNLElBQUlwRCxVQUFVLENBQUMyQyxXQUFXLENBQUMsRUFBRTtNQUNuQyxNQUFNeEMsUUFBUSxHQUFHd0MsV0FBVyxDQUFDMUMsV0FBVyxFQUFFO01BQzFDLElBQUkyQyxHQUFHLEtBQUt4RCxTQUFTLEVBQUU7UUFDdEIwQixRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUc4QixHQUFHO01BQ3RCO01BQ0FaLGNBQWMsQ0FBQzdCLFFBQVEsRUFBRVcsUUFBUSxDQUFDO01BQ2xDWixtQkFBbUIsQ0FBQ0MsUUFBUSxFQUFFVyxRQUFRLENBQUM7TUFDdkMsTUFBTXVDLFFBQVEsR0FBR3ZDLFFBQVEsQ0FBQ3dDLEtBQUs7TUFDL0IsTUFBTUMsTUFBTSxHQUFHekMsUUFBUSxDQUFDMEMsR0FBRztNQUMzQixNQUFNQyxVQUFVLEdBQUczQyxRQUFRLENBQUM0QyxPQUFPO01BQ25DLE9BQU81QyxRQUFRLENBQUMwQyxHQUFHO01BQ25CLE9BQU8xQyxRQUFRLENBQUN3QyxLQUFLO01BQ3JCLE9BQU94QyxRQUFRLENBQUM0QyxPQUFPO01BQ3ZCLE1BQU0xQyxjQUFjLEdBQUdILGlCQUFpQixDQUFDVixRQUFRLEVBQUVXLFFBQVEsQ0FBQztNQUM1RCxNQUFNNkMscUJBQXFCLEdBQUcsSUFBSWhCLFdBQVcsQ0FBQzdCLFFBQVEsQ0FBcUI7TUFDM0UsSUFBSXVDLFFBQVEsRUFBRTtRQUNiTSxxQkFBcUIsQ0FBQ0MsYUFBYSxDQUFDUCxRQUFRLENBQUM7TUFDOUM7TUFDQSxJQUFJRSxNQUFNLEVBQUU7UUFDWEEsTUFBTSxDQUFDTSxVQUFVLENBQUNGLHFCQUFxQixDQUFpQjtNQUN6RDtNQUNBLElBQUlGLFVBQVUsRUFBRTtRQUNmRSxxQkFBcUIsQ0FBQ0csV0FBVyxDQUFDTCxVQUFVLENBQUM7TUFDOUM7TUFDQSxLQUFLLE1BQU1NLGlCQUFpQixJQUFJL0MsY0FBYyxFQUFFO1FBQy9DQSxjQUFjLENBQUMrQyxpQkFBaUIsQ0FBQyxDQUMvQnhDLElBQUksQ0FBRU4sS0FBSyxJQUFLO1VBQ2hCLE9BQU8wQyxxQkFBcUIsQ0FBQ0ssV0FBVyxDQUFDRCxpQkFBaUIsRUFBRTlDLEtBQUssQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FDRGdELEtBQUssQ0FBRUMsS0FBSyxJQUFLO1VBQ2pCQyxHQUFHLENBQUNELEtBQUssQ0FBRSx5QkFBd0JILGlCQUFrQixPQUFNcEIsV0FBVyxDQUFDMUMsV0FBVyxFQUFFLENBQUM2QixPQUFPLEVBQUcsRUFBQyxFQUFFb0MsS0FBSyxFQUFFLFlBQVksQ0FBQztRQUN2SCxDQUFDLENBQUM7TUFDSjtNQUNBcEIsYUFBYSxHQUFHYSxxQkFBcUI7SUFDdEMsQ0FBQyxNQUFNLElBQUksT0FBT2hCLFdBQVcsS0FBSyxVQUFVLEVBQUU7TUFDN0MsTUFBTXlCLGFBQWEsR0FBR3pCLFdBQVc7TUFDakNHLGFBQWEsR0FBR3NCLGFBQWEsQ0FBQ3RELFFBQVEsQ0FBcUI7SUFDNUQsQ0FBQyxNQUFNO01BQ05nQyxhQUFhLEdBQUcsSUFBSXVCLElBQUksQ0FBQztRQUFFQyxJQUFJLEVBQUUsb0JBQW9CLEdBQUkzQjtNQUF1QixDQUFDLENBQUM7SUFDbkY7SUFFQSxPQUFPRyxhQUFhO0VBQ3JCLENBQUM7RUFBQyxPQUVhSixVQUFVO0FBQUEifQ==
@@ -0,0 +1,197 @@
1
+ import Log from "sap/base/Log";
2
+ import type { ControlProperties, JSXContext, NonControlProperties, Ref } from "sap/fe/base/jsx-runtime/jsx";
3
+ import type BuildingBlockTemplatingBase from "sap/fe/core/buildingBlocks/templating/BuildingBlockTemplatingBase";
4
+ import type RuntimeBuildingBlock from "sap/fe/core/buildingBlocks/templating/RuntimeBuildingBlock";
5
+ import type { BindingToolkitExpression } from "sap/fe/core/helpers/BindingToolkit";
6
+ import { compileConstant, compileExpression, isBindingToolkitExpression, isConstant } from "sap/fe/core/helpers/BindingToolkit";
7
+ import Text from "sap/m/Text";
8
+ import DataType from "sap/ui/base/DataType";
9
+ import type ManagedObjectMetadata from "sap/ui/base/ManagedObjectMetadata";
10
+ import type Control from "sap/ui/core/Control";
11
+ import type { $ControlSettings } from "sap/ui/core/Control";
12
+ import type { default as Element, default as UI5Element } from "sap/ui/core/Element";
13
+ import EventHandlerResolver from "sap/ui/core/mvc/EventHandlerResolver";
14
+
15
+ const addChildAggregation = function (
16
+ aggregationChildren: Record<string, (string | UI5Element)[]>,
17
+ aggregationName: string,
18
+ child?: string | UI5Element | UI5Element[]
19
+ ): void {
20
+ if (child === null || child === undefined || typeof child === "string") {
21
+ return;
22
+ }
23
+ if (!aggregationChildren[aggregationName]) {
24
+ aggregationChildren[aggregationName] = [];
25
+ }
26
+ if (isChildAnElement(child)) {
27
+ aggregationChildren[aggregationName].push(child);
28
+ } else if (Array.isArray(child)) {
29
+ child.forEach((subChild) => {
30
+ addChildAggregation(aggregationChildren, aggregationName, subChild);
31
+ });
32
+ } else if (typeof child === "function") {
33
+ aggregationChildren[aggregationName] = child;
34
+ } else {
35
+ Object.keys(child).forEach((childKey) => {
36
+ addChildAggregation(aggregationChildren, childKey, child[childKey]);
37
+ });
38
+ }
39
+ };
40
+ const isChildAnElement = function (children?: unknown): children is Element {
41
+ return (children as Element)?.isA?.("sap.ui.core.Element");
42
+ };
43
+ const isAControl = function (children?: typeof Control | Function): children is typeof Control {
44
+ return !!(children as typeof Control)?.getMetadata;
45
+ };
46
+
47
+ function processAggregations(metadata: ManagedObjectMetadata, mSettings: Record<string, unknown>): void {
48
+ const metadataAggregations = metadata.getAllAggregations();
49
+ const defaultAggregationName = metadata.getDefaultAggregationName();
50
+ const aggregationChildren: Record<string, (string | UI5Element)[]> = {};
51
+ addChildAggregation(aggregationChildren, defaultAggregationName, mSettings.children as string | UI5Element | UI5Element[]);
52
+ delete mSettings.children;
53
+ // find out which aggregation are bound (both in children and directly under it)
54
+ Object.keys(metadataAggregations).forEach((aggregationName) => {
55
+ if (aggregationChildren[aggregationName] !== undefined) {
56
+ if (mSettings.hasOwnProperty(aggregationName)) {
57
+ if (typeof mSettings[aggregationName] === "string") {
58
+ mSettings[aggregationName] = {
59
+ path: mSettings[aggregationName]
60
+ };
61
+ }
62
+ // always use the first item as template according to UI5 logic
63
+ if (typeof aggregationChildren[aggregationName] === "function") {
64
+ (mSettings[aggregationName] as { factory: Function }).factory = aggregationChildren[
65
+ aggregationName
66
+ ] as unknown as Function;
67
+ } else {
68
+ (mSettings[aggregationName] as { template: string | UI5Element }).template = aggregationChildren[aggregationName][0];
69
+ }
70
+ } else {
71
+ mSettings[aggregationName] = aggregationChildren[aggregationName];
72
+ }
73
+ }
74
+ });
75
+ }
76
+
77
+ /**
78
+ * Processes the properties.
79
+ *
80
+ * If the property is a bindingToolkit expression we need to compile it.
81
+ * Else if the property is set as string (compiled binding expression returns string by default even if it's a boolean, int, etc.) and it doesn't match with expected
82
+ * format the value is parsed to provide expected format.
83
+ *
84
+ * @param metadata Metadata of the control
85
+ * @param settings Settings of the control
86
+ * @returns A map of late properties that need to be awaited after the control is created
87
+ */
88
+ function processProperties(metadata: ManagedObjectMetadata, settings: Record<string, unknown>): Record<string, Promise<unknown>> {
89
+ let settingsKey: keyof typeof settings;
90
+ const lateProperties: Record<string, Promise<unknown>> = {};
91
+ for (settingsKey in settings) {
92
+ const value = settings[settingsKey];
93
+ if (isBindingToolkitExpression(value)) {
94
+ const bindingToolkitExpression: BindingToolkitExpression<unknown> = value;
95
+ if (isConstant(bindingToolkitExpression)) {
96
+ settings[settingsKey] = compileConstant(bindingToolkitExpression, false, true, true);
97
+ } else {
98
+ settings[settingsKey] = compileExpression(bindingToolkitExpression);
99
+ }
100
+ } else if (value !== null && typeof value === "object" && (value as Promise<unknown>).then) {
101
+ lateProperties[settingsKey] = value as Promise<unknown>;
102
+ delete settings[settingsKey];
103
+ } else if (typeof value === "string" && !value.startsWith("{")) {
104
+ const propertyType = (metadata.getAllProperties()[settingsKey] as { getType?: Function })?.getType?.();
105
+ if (propertyType && propertyType instanceof DataType && ["boolean", "int", "float"].includes(propertyType.getName())) {
106
+ settings[settingsKey] = propertyType.parseValue(value);
107
+ }
108
+ }
109
+ }
110
+ return lateProperties;
111
+ }
112
+
113
+ /**
114
+ * Processes the command.
115
+ *
116
+ * Resolves the command set on the control via the intrinsic class attribute "jsx:command".
117
+ * If no command has been set or the targeted event doesn't exist, no configuration is set.
118
+ *
119
+ * @param metadata Metadata of the control
120
+ * @param settings Settings of the control
121
+ */
122
+ function processCommand(metadata: ManagedObjectMetadata, settings: Record<string, unknown>): void {
123
+ const commandProperty = settings["jsx:command"];
124
+ if (commandProperty) {
125
+ const [command, eventName] = (commandProperty as string).split("|");
126
+ const event = metadata.getAllEvents()[eventName];
127
+ if (event && command.startsWith("cmd:")) {
128
+ settings[event.name] = EventHandlerResolver.resolveEventHandler(command);
129
+ }
130
+ }
131
+ delete settings["jsx:command"];
132
+ }
133
+
134
+ const jsxControl = function <T extends Element>(
135
+ ControlType: typeof Control | Function,
136
+ settings: NonControlProperties<T> & {
137
+ key: string;
138
+ children?: Element | ControlProperties<T>;
139
+ ref?: Ref<T>;
140
+ binding?: string;
141
+ class?: string;
142
+ },
143
+ key: string,
144
+ jsxContext: JSXContext
145
+ ): Control | Control[] | undefined {
146
+ let targetControl: Control | Control[] | undefined;
147
+
148
+ if ((ControlType as { isFragment?: boolean })?.isFragment) {
149
+ targetControl = settings.children as Control | Control[];
150
+ } else if ((ControlType as typeof BuildingBlockTemplatingBase)?.isRuntime) {
151
+ const runtimeBuildingBlock = new (ControlType as typeof RuntimeBuildingBlock)(settings as unknown as $ControlSettings);
152
+ targetControl = runtimeBuildingBlock.getContent?.(jsxContext.view!, jsxContext.appComponent!);
153
+ } else if (isAControl(ControlType)) {
154
+ const metadata = ControlType.getMetadata();
155
+ if (key !== undefined) {
156
+ settings["key"] = key;
157
+ }
158
+ processCommand(metadata, settings);
159
+ processAggregations(metadata, settings);
160
+ const classDef = settings.class;
161
+ const refDef = settings.ref;
162
+ const bindingDef = settings.binding;
163
+ delete settings.ref;
164
+ delete settings.class;
165
+ delete settings.binding;
166
+ const lateProperties = processProperties(metadata, settings);
167
+ const targetControlInstance = new ControlType(settings as $ControlSettings);
168
+ if (classDef) {
169
+ targetControlInstance.addStyleClass(classDef);
170
+ }
171
+ if (refDef) {
172
+ refDef.setCurrent(targetControlInstance as unknown as T);
173
+ }
174
+ if (bindingDef) {
175
+ targetControlInstance.bindElement(bindingDef);
176
+ }
177
+ for (const latePropertiesKey in lateProperties) {
178
+ lateProperties[latePropertiesKey]
179
+ .then((value) => {
180
+ return targetControlInstance.setProperty(latePropertiesKey, value);
181
+ })
182
+ .catch((error) => {
183
+ Log.error(`Couldn't set property ${latePropertiesKey} on ${ControlType.getMetadata().getName()}`, error, "jsxControl");
184
+ });
185
+ }
186
+ targetControl = targetControlInstance;
187
+ } else if (typeof ControlType === "function") {
188
+ const controlTypeFn = ControlType;
189
+ targetControl = controlTypeFn(settings as $ControlSettings);
190
+ } else {
191
+ targetControl = new Text({ text: "Missing component " + (ControlType as string) });
192
+ }
193
+
194
+ return targetControl;
195
+ };
196
+
197
+ export default jsxControl;