@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
JavaScript
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;
;