UNPKG

@rxap/xml-parser

Version:

Provides a set of decorators and services for parsing and serializing XML documents into TypeScript classes. It simplifies the process of mapping XML elements and attributes to class properties, handling data validation, and serializing objects back into

47 lines 2.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.createElement = createElement; const reflect_metadata_1 = require("@rxap/reflect-metadata"); const element_child_1 = require("./decorators/element-child"); const element_children_1 = require("./decorators/element-children"); const element_namespace_1 = require("./decorators/element-namespace"); const metadata_keys_1 = require("./decorators/metadata-keys"); const utilities_1 = require("./decorators/utilities"); const link_to_parent_1 = require("./link-to-parent"); const is_parsed_element_1 = require("./utilities/is-parsed-element"); function createElement(element, propertiesOrParent, _parent) { var _a, _b; const constructor = typeof element === 'function' ? element : element.constructor; const tag = (0, reflect_metadata_1.getMetadata)(metadata_keys_1.ElementParserMetaData.NAME, constructor); if (!tag) { throw new Error(`The element ${constructor.name} is not annotated with @ElementDef`); } const instance = typeof element === 'function' ? new element() : element; const properties = ((0, is_parsed_element_1.isParsedElement)(propertiesOrParent) || propertiesOrParent === null ? {} : propertiesOrParent); const parent = (0, is_parsed_element_1.isParsedElement)(propertiesOrParent) ? propertiesOrParent : _parent; (_a = instance.__tag) !== null && _a !== void 0 ? _a : (instance.__tag = tag); (_b = instance.__xmlns) !== null && _b !== void 0 ? _b : (instance.__xmlns = new Map()); (0, element_namespace_1.applyElementNamespaceMetadata)(instance); if (parent) { (0, link_to_parent_1.linkToParent)(instance, parent); } const parsers = (0, utilities_1.GetAllElementParserInstances)(constructor); for (const [key, value] of Object.entries(properties !== null && properties !== void 0 ? properties : {}).filter(([, value]) => value !== null && value !== undefined)) { const parser = parsers.find((p) => p.propertyKey === key); Reflect.set(instance, key, value); if (parser && (parser instanceof element_child_1.ElementChildParser || parser instanceof element_children_1.ElementChildrenParser)) { if (Array.isArray(value)) { value.forEach((v) => Reflect.set(v, '__parent', instance)); } else { Reflect.set(value, '__parent', instance); } } } return instance; } //# sourceMappingURL=create-element.js.map