UNPKG

@progress/sitefinity-widget-designers-sdk

Version:

This package aims to create a parity for widget designer generation similar to the [autogenerated widget designers](https://www.progress.com/documentation/sitefinity-cms/next.js-autogenerated-field-types) in Sitefinity. Due to some limitations in Typescri

101 lines (100 loc) 5.76 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MappedType = exports.Model = exports.SectionsOrder = exports.WidgetEntity = void 0; const widget_metadata_1 = require("../metadata/widget-metadata"); const known_keys_1 = require("../symbols/known-keys"); const utils_1 = require("./property-decorators/common/utils"); /** * Class decorator * Defines the decorated class as a widget entity. * Calls internally the {@link Model} decorator on the entity class. * @param {string} name The widget's name. * @param {string?} caption The widget display caption. */ function WidgetEntity(name, caption) { return function (target, context) { widget_metadata_1.WidgetMetadata.registerPrototype(target); widget_metadata_1.WidgetMetadata.registerPrototypeProperty(target, known_keys_1.keys.name, name); widget_metadata_1.WidgetMetadata.registerPrototypeProperty(target, known_keys_1.keys.caption, caption || name); Model()(target); }; } exports.WidgetEntity = WidgetEntity; /** * Class decorator * Defines the widget entity's sections ordering in the designer. * @param {string[]} sections The sections titles in the order they need to appear in the designer. */ function SectionsOrder(sections) { return function (target, context) { widget_metadata_1.WidgetMetadata.registerPrototype(target); widget_metadata_1.WidgetMetadata.registerPrototypeProperty(target, known_keys_1.keys.sectionsOrder, sections); }; } exports.SectionsOrder = SectionsOrder; /** * Class decorator * Defines the decorated class as a data model. * Enumerates the class properties, defines their name, title and default value (if such is set). * The class properties are suggested to be defined with a default value to be enumerated properly. * Properties that have their default value set as undefined or null will not get their default type, receiving 'string' as their type and would need to have the {@link DataType} decorator set as well. * @param {boolean?} [capitalizeProperties] Defines whether the object properties should be capitalized in their designer metadata names but retain their original spelling in the js object. * Analoguous to the C# synthax: * @example * [DataMember(Name = "warning")] * public string Warning { get; set; } */ function Model(arg) { return function (target, context) { var _a; widget_metadata_1.WidgetMetadata.registerPrototype(target); if (arg === true) { widget_metadata_1.WidgetMetadata.registerPrototypeProperty(target, known_keys_1.keys.capitalizeModelProperties, true); } const descriptors = Object.getOwnPropertyDescriptors(target.prototype); const metaDescriptor = (_a = descriptors[known_keys_1.keys.metadata]) === null || _a === void 0 ? void 0 : _a.value; const instance = new target(); const propertyDescriptors = Object.getOwnPropertyDescriptors(instance); const propKeys = Object.keys(propertyDescriptors); propKeys.forEach(p => { var _a, _b; let type = typeof (instance[p]); const value = instance[p]; if (Array.isArray(value)) { type = 'enumerable'; } if (((_b = (_a = metaDescriptor[p]) === null || _a === void 0 ? void 0 : _a.value) === null || _b === void 0 ? void 0 : _b.type) === 'object') { widget_metadata_1.WidgetMetadata.registerPrototypePropertyMetadata(target, p, known_keys_1.keys.modelType, type, widget_metadata_1.PropertyMergeStrategy.Override); } let typeName = (0, utils_1.getBasicType)(type); if (typeName) { const proto = Object.getPrototypeOf(target.prototype); if (proto) { const metaDescriptor = Object.getOwnPropertyDescriptor(proto, known_keys_1.keys.metadata); if ((metaDescriptor === null || metaDescriptor === void 0 ? void 0 : metaDescriptor.value) && (metaDescriptor === null || metaDescriptor === void 0 ? void 0 : metaDescriptor.value[p]) && (metaDescriptor === null || metaDescriptor === void 0 ? void 0 : metaDescriptor.value[p][known_keys_1.keys.type])) { typeName = metaDescriptor === null || metaDescriptor === void 0 ? void 0 : metaDescriptor.value[p][known_keys_1.keys.type]; } } widget_metadata_1.WidgetMetadata.registerPrototypePropertyMetadata(target, p, known_keys_1.keys.type, typeName, widget_metadata_1.PropertyMergeStrategy.Skip); } let defaultValue = value; if (typeof (value) === 'boolean') { defaultValue = defaultValue ? 'True' : 'False'; } else if (typeof (value) === 'object' && value !== null) { defaultValue = JSON.stringify(defaultValue); } widget_metadata_1.WidgetMetadata.registerPrototypePropertyMetadata(target, p, known_keys_1.keys.name, p, widget_metadata_1.PropertyMergeStrategy.Skip); widget_metadata_1.WidgetMetadata.registerPrototypePropertyMetadata(target, p, known_keys_1.keys.title, p, widget_metadata_1.PropertyMergeStrategy.Skip); widget_metadata_1.WidgetMetadata.registerPrototypePropertyMetadata(target, p, known_keys_1.keys.defaultValue, defaultValue, widget_metadata_1.PropertyMergeStrategy.Skip); }); }; } exports.Model = Model; function MappedType(type) { return function (target, context) { widget_metadata_1.WidgetMetadata.registerPrototype(target); widget_metadata_1.WidgetMetadata.registerPrototypeProperty(target, known_keys_1.keys.modelType, type); }; } exports.MappedType = MappedType;