123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427 |
- (function (global, factory) {
- if (typeof define === "function" && define.amd) {
- define(["exports"], factory);
- } else if (typeof exports !== "undefined") {
- factory(exports);
- } else {
- var mod = {
- exports: {}
- };
- factory(mod.exports);
- global.jstoxml = mod.exports;
- }
- })(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : this, function (_exports) {
- "use strict";
- Object.defineProperty(_exports, "__esModule", {
- value: true
- });
- _exports.toXML = _exports.default = void 0;
- function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
- function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
- function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
- function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
- function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
- var ARRAY = "array";
- var BOOLEAN = "boolean";
- var DATE = "date";
- var NULL = "null";
- var NUMBER = "number";
- var OBJECT = "object";
- var SPECIAL_OBJECT = "special-object";
- var STRING = "string";
- var PRIVATE_VARS = ["_selfCloseTag", "_attrs"];
- var PRIVATE_VARS_REGEXP = new RegExp(PRIVATE_VARS.join("|"), "g");
- /**
- * Determines the indent string based on current tree depth.
- */
- var getIndentStr = function getIndentStr() {
- var indent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
- var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
- return indent.repeat(depth);
- };
- /**
- * Sugar function supplementing JS's quirky typeof operator, plus some extra help to detect
- * "special objects" expected by jstoxml.
- * Example:
- * getType(new Date());
- * -> 'date'
- */
- var getType = function getType(val) {
- return Array.isArray(val) && ARRAY || _typeof(val) === OBJECT && val !== null && val._name && SPECIAL_OBJECT || val instanceof Date && DATE || val === null && NULL || _typeof(val);
- };
- /**
- * Replaces matching values in a string with a new value.
- * Example:
- * filterStr('foo&bar', { '&': '&' });
- * -> 'foo&bar'
- */
- var filterStr = function filterStr() {
- var inputStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : "";
- var filter = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- // Passthrough/no-op for nonstrings (e.g. number, boolean).
- if (typeof inputStr !== "string") {
- return inputStr;
- }
- var regexp = new RegExp("(".concat(Object.keys(filter).join("|"), ")(?!(\\w|#)*;)"), "g");
- return String(inputStr).replace(regexp, function (str, entity) {
- return filter[entity] || "";
- });
- };
- /**
- * Maps an object or array of arribute keyval pairs to a string.
- * Examples:
- * { foo: 'bar', baz: 'g' } -> 'foo="bar" baz="g"'
- * [ { ⚡: true }, { foo: 'bar' } ] -> '⚡ foo="bar"'
- */
- var getAttributeKeyVals = function getAttributeKeyVals() {
- var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var filter = arguments.length > 1 ? arguments[1] : undefined;
- var keyVals = [];
- if (Array.isArray(attributes)) {
- // Array containing complex objects and potentially duplicate attributes.
- keyVals = attributes.map(function (attr) {
- var key = Object.keys(attr)[0];
- var val = attr[key];
- var filteredVal = filter ? filterStr(val, filter) : val;
- var valStr = filteredVal === true ? "" : "=\"".concat(filteredVal, "\"");
- return "".concat(key).concat(valStr);
- });
- } else {
- var keys = Object.keys(attributes);
- keyVals = keys.map(function (key) {
- // Simple object - keyval pairs.
- // For boolean true, simply output the key.
- var filteredVal = filter ? filterStr(attributes[key], filter) : attributes[key];
- var valStr = attributes[key] === true ? "" : "=\"".concat(filteredVal, "\"");
- return "".concat(key).concat(valStr);
- });
- }
- return keyVals;
- };
- /**
- * Converts an attributes object/array to a string of keyval pairs.
- * Example:
- * formatAttributes({ a: 1, b: 2 })
- * -> 'a="1" b="2"'
- */
- var formatAttributes = function formatAttributes() {
- var attributes = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var filter = arguments.length > 1 ? arguments[1] : undefined;
- var keyVals = getAttributeKeyVals(attributes, filter);
- if (keyVals.length === 0) return "";
- var keysValsJoined = keyVals.join(" ");
- return " ".concat(keysValsJoined);
- };
- /**
- * Converts an object to a jstoxml array.
- * Example:
- * objToArray({ foo: 'bar', baz: 2 });
- * ->
- * [
- * {
- * _name: 'foo',
- * _content: 'bar'
- * },
- * {
- * _name: 'baz',
- * _content: 2
- * }
- * ]
- */
- var objToArray = function objToArray() {
- var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- return Object.keys(obj).map(function (key) {
- return {
- _name: key,
- _content: obj[key]
- };
- });
- };
- /**
- * Determines if a value is a primitive JavaScript value (not including Symbol).
- * Example:
- * isPrimitive(4);
- * -> true
- */
- var PRIMITIVE_TYPES = [STRING, NUMBER, BOOLEAN];
- var isPrimitive = function isPrimitive(val) {
- return PRIMITIVE_TYPES.includes(getType(val));
- };
- /**
- * Determines if a value is a simple primitive type that can fit onto one line. Needed for
- * determining any needed indenting and line breaks.
- * Example:
- * isSimpleType(new Date());
- * -> true
- */
- var SIMPLE_TYPES = [].concat(PRIMITIVE_TYPES, [DATE, SPECIAL_OBJECT]);
- var isSimpleType = function isSimpleType(val) {
- return SIMPLE_TYPES.includes(getType(val));
- };
- /**
- * Determines if an XML string is a simple primitive, or contains nested data.
- * Example:
- * isSimpleXML('<foo />');
- * -> false
- */
- var isSimpleXML = function isSimpleXML(xmlStr) {
- return !xmlStr.match("<");
- };
- /**
- * Assembles an XML header as defined by the config.
- */
- var DEFAULT_XML_HEADER = '<?xml version="1.0" encoding="UTF-8"?>';
- var getHeaderString = function getHeaderString(_ref) {
- var header = _ref.header,
- indent = _ref.indent,
- isOutputStart = _ref.isOutputStart;
- var shouldOutputHeader = header && isOutputStart;
- if (!shouldOutputHeader) return "";
- var shouldUseDefaultHeader = _typeof(header) === BOOLEAN; // return `${shouldUseDefaultHeader ? DEFAULT_XML_HEADER : header}${indent ? "\n" : ""
- // }`;
- return shouldUseDefaultHeader ? DEFAULT_XML_HEADER : header;
- };
- /**
- * Recursively traverses an object tree and converts the output to an XML string.
- * Example:
- * toXML({ foo: 'bar' });
- * -> <foo>bar</foo>
- */
- var defaultEntityFilter = {
- "<": "<",
- ">": ">",
- "&": "&"
- };
- var toXML = function toXML() {
- var obj = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
- var _config$depth = config.depth,
- depth = _config$depth === void 0 ? 0 : _config$depth,
- indent = config.indent,
- _isFirstItem = config._isFirstItem,
- _config$_isOutputStar = config._isOutputStart,
- _isOutputStart = _config$_isOutputStar === void 0 ? true : _config$_isOutputStar,
- header = config.header,
- _config$attributesFil = config.attributesFilter,
- rawAttributesFilter = _config$attributesFil === void 0 ? {} : _config$attributesFil,
- _config$filter = config.filter,
- rawFilter = _config$filter === void 0 ? {} : _config$filter;
- var shouldTurnOffAttributesFilter = typeof rawAttributesFilter === 'boolean' && !rawAttributesFilter;
- var attributesFilter = shouldTurnOffAttributesFilter ? {} : _objectSpread(_objectSpread(_objectSpread({}, defaultEntityFilter), {
- '"': """
- }), rawAttributesFilter);
- var shouldTurnOffFilter = typeof rawFilter === 'boolean' && !rawFilter;
- var filter = shouldTurnOffFilter ? {} : _objectSpread(_objectSpread({}, defaultEntityFilter), rawFilter); // Determine indent string based on depth.
- var indentStr = getIndentStr(indent, depth); // For branching based on value type.
- var valType = getType(obj);
- var headerStr = getHeaderString({
- header: header,
- indent: indent,
- depth: depth,
- isOutputStart: _isOutputStart
- });
- var isOutputStart = _isOutputStart && !headerStr && _isFirstItem && depth === 0;
- var outputStr = "";
- switch (valType) {
- case "special-object":
- {
- // Processes a specially-formatted object used by jstoxml.
- var _name = obj._name,
- _content = obj._content; // Output text content without a tag wrapper.
- if (_content === null) {
- outputStr = _name;
- break;
- } // Handles arrays of primitive values. (#33)
- var isArrayOfPrimitives = Array.isArray(_content) && _content.every(isPrimitive);
- if (isArrayOfPrimitives) {
- var primitives = _content.map(function (a) {
- return toXML({
- _name: _name,
- _content: a
- }, _objectSpread(_objectSpread({}, config), {}, {
- depth: depth,
- _isOutputStart: false
- }));
- });
- return primitives.join('');
- } // Don't output private vars (such as _attrs).
- if (_name.match(PRIVATE_VARS_REGEXP)) break; // Process the nested new value and create new config.
- var newVal = toXML(_content, _objectSpread(_objectSpread({}, config), {}, {
- depth: depth + 1,
- _isOutputStart: isOutputStart
- }));
- var newValType = getType(newVal);
- var isNewValSimple = isSimpleXML(newVal); // Pre-tag output (indent and line breaks).
- var preIndentStr = indent && !isOutputStart ? "\n" : "";
- var preTag = "".concat(preIndentStr).concat(indentStr); // Special handling for comments, preserving preceding line breaks/indents.
- if (_name === '_comment') {
- outputStr += "".concat(preTag, "<!-- ").concat(_content, " -->");
- break;
- } // Tag output.
- var valIsEmpty = newValType === "undefined" || newVal === "";
- var shouldSelfClose = _typeof(obj._selfCloseTag) === BOOLEAN ? valIsEmpty && obj._selfCloseTag : valIsEmpty;
- var selfCloseStr = shouldSelfClose ? "/" : "";
- var attributesString = formatAttributes(obj._attrs, attributesFilter);
- var tag = "<".concat(_name).concat(attributesString).concat(selfCloseStr, ">"); // Post-tag output (closing tag, indent, line breaks).
- var preTagCloseStr = indent && !isNewValSimple ? "\n".concat(indentStr) : "";
- var postTag = !shouldSelfClose ? "".concat(newVal).concat(preTagCloseStr, "</").concat(_name, ">") : "";
- outputStr += "".concat(preTag).concat(tag).concat(postTag);
- break;
- }
- case "object":
- {
- // Iterates over keyval pairs in an object, converting each item to a special-object.
- var keys = Object.keys(obj);
- var outputArr = keys.map(function (key, index) {
- var newConfig = _objectSpread(_objectSpread({}, config), {}, {
- _isFirstItem: index === 0,
- _isLastItem: index + 1 === keys.length,
- _isOutputStart: isOutputStart
- });
- var outputObj = {
- _name: key
- };
- if (getType(obj[key]) === "object") {
- // Sub-object contains an object.
- // Move private vars up as needed. Needed to support certain types of objects
- // E.g. { foo: { _attrs: { a: 1 } } } -> <foo a="1"/>
- PRIVATE_VARS.forEach(function (privateVar) {
- var val = obj[key][privateVar];
- if (typeof val !== "undefined") {
- outputObj[privateVar] = val;
- delete obj[key][privateVar];
- }
- });
- var hasContent = typeof obj[key]._content !== "undefined";
- if (hasContent) {
- // _content has sibling keys, so pass as an array (edge case).
- // E.g. { foo: 'bar', _content: { baz: 2 } } -> <foo>bar</foo><baz>2</baz>
- if (Object.keys(obj[key]).length > 1) {
- var newContentObj = Object.assign({}, obj[key]);
- delete newContentObj._content;
- outputObj._content = [].concat(_toConsumableArray(objToArray(newContentObj)), [obj[key]._content]);
- }
- }
- } // Fallthrough: just pass the key as the content for the new special-object.
- if (typeof outputObj._content === "undefined") outputObj._content = obj[key];
- var xml = toXML(outputObj, newConfig, key);
- return xml;
- }, config);
- outputStr = outputArr.join('');
- break;
- }
- case "function":
- {
- // Executes a user-defined function and returns output.
- var fnResult = obj(config);
- outputStr = toXML(fnResult, config);
- break;
- }
- case "array":
- {
- // Iterates and converts each value in an array.
- var _outputArr = obj.map(function (singleVal, index) {
- var newConfig = _objectSpread(_objectSpread({}, config), {}, {
- _isFirstItem: index === 0,
- _isLastItem: index + 1 === obj.length,
- _isOutputStart: isOutputStart
- });
- return toXML(singleVal, newConfig);
- });
- outputStr = _outputArr.join('');
- break;
- }
- // number, string, boolean, date, null, etc
- default:
- {
- outputStr = filterStr(obj, filter);
- break;
- }
- }
- return "".concat(headerStr).concat(outputStr);
- };
- _exports.toXML = toXML;
- var _default = {
- toXML: toXML
- };
- _exports.default = _default;
- });
|