Socket
Socket
Sign inDemoInstall

jstoxml

Package Overview
Dependencies
Maintainers
1
Versions
74
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

jstoxml - npm Package Compare versions

Comparing version 1.1.3 to 1.2.0

2

dist/jstoxml-min.js

@@ -1,1 +0,1 @@

!function(e,t){if("function"==typeof define&&define.amd)define(["exports"],t);else if("undefined"!=typeof exports)t(exports);else{var n={exports:{}};t(n.exports),e.jstoxml=n.exports}}(this,function(e){"use strict";function t(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}Object.defineProperty(e,"__esModule",{value:!0});var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},r=["_selfCloseTag","_attrs"],o=r.join("|"),a=new RegExp(o,"g"),i=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.repeat(t)},c=function(e){return Array.isArray(e)?"array":"object"===(void 0===e?"undefined":n(e))&&null!==e&&e._name?"special-object":e instanceof Date?"date":null===e?"null":void 0===e?"undefined":n(e)},s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n="("+Object.keys(t).join("|")+")",r=new RegExp(n,"g");return String(e).replace(r,function(e,n){return t[n]||""})},u=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];return Array.isArray(e)?e.map(function(e){var n=Object.keys(e)[0],r=e[n],o=t?s(r,t):r;return""+n+(!0===o?"":'="'+o+'"')}):Object.keys(e).map(function(n){var r=t?s(e[n],t):e[n];return""+n+(!0===e[n]?"":'="'+r+'"')})},f=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n=u(e,t);return 0===n.length?"":" "+n.join(" ")},l=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).map(function(t){return{_name:t,_content:e[t]}})},d=function(e){var t=c(e);return"string"===t||"number"===t||"boolean"===t||"date"===t||"special-object"===t},b=function(e){return!e.match("<")},v=function(e,t,n){var r="";return e.header&&n&&(r="boolean"==typeof e.header?'<?xml version="1.0" encoding="UTF-8"?>':e.header,e.indent&&(r+="\n")),r};e.toXML=function e(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},u=o.depth?o.depth:0,y=i(o.indent,u),p=c(n),g=d(n),m=0===u&&(g||!g&&o._isFirstItem),h="";switch(p){case"special-object":var _=n._name,j=n._content;if(null===j){h=_;break}if(_.match(a))break;var k=Object.assign({},o,{depth:u+1}),O=e(j,k),x=c(O),A=b(O),S=""+(o.indent&&!m?"\n":"")+y,F="undefined"===x||""===O,I="boolean"==typeof n._selfCloseTag?F&&n._selfCloseTag:F,T=I?"/":"",w="<"+_+f(n._attrs,o.attributesFilter)+T+">",C=o.indent&&!A?"\n"+y:"";h=""+S+w+(I?"":""+O+C+"</"+_+">");break;case"object":var E=Object.keys(n);h=E.map(function(a,i){var s=Object.assign({},o,{_isFirstItem:0===i,_isLastItem:i+1===E.length}),u={_name:a};if("object"===c(n[a])&&(r.forEach(function(e){var t=n[a][e];void 0!==t&&(u[e]=t,delete n[a][e])}),void 0!==n[a]._content&&Object.keys(n[a]).length>1)){var f=Object.assign({},n[a]);delete f._content,u._content=[].concat(t(l(f)),[n[a]._content])}return void 0===u._content&&(u._content=n[a]),e(u,s)},o).join("");break;case"function":var L=n(o);h=e(L,o);break;case"array":h=n.map(function(t,r){var a=Object.assign({},o,{_isFirstItem:0===r,_isLastItem:r+1===n.length});return e(t,a)}).join("");break;case"number":case"string":case"boolean":case"date":case"null":default:h=s(n,o.filter)}return h=""+v(o,0,m)+h}});
!function(e,t){if("function"==typeof define&&define.amd)define(["exports"],t);else if("undefined"!=typeof exports)t(exports);else{var n={exports:{}};t(n.exports),e.jstoxml=n.exports}}(this,function(e){"use strict";function t(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}Object.defineProperty(e,"__esModule",{value:!0});var n=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=["_selfCloseTag","_attrs"],i=o.join("|"),a=new RegExp(i,"g"),c=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.repeat(t)},u=function(e){return Array.isArray(e)&&"array"||"object"===(void 0===e?"undefined":r(e))&&null!==e&&e._name&&"special-object"||e instanceof Date&&"date"||null===e&&"null"||(void 0===e?"undefined":r(e))},s=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new RegExp("("+Object.keys(t).join("|")+")","g");return String(e).replace(n,function(e,n){return t[n]||""})},f=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1];return Array.isArray(e)?e.map(function(e){var n=Object.keys(e)[0],r=e[n],o=t?s(r,t):r;return""+n+(!0===o?"":'="'+o+'"')}):Object.keys(e).map(function(n){var r=t?s(e[n],t):e[n];return""+n+(!0===e[n]?"":'="'+r+'"')})},l=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n=f(e,t);return 0===n.length?"":" "+n.join(" ")},d=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.keys(e).map(function(t){return{_name:t,_content:e[t]}})},v=["string","number","boolean","date","special-object"],p=function(e){return v.includes(u(e))},y=function(e){return!e.match("<")},b=function(e){var t=e.header,n=e.indent,r=(e.depth,e.isOutputStart),o="";return t&&r&&(o="boolean"==typeof t?'<?xml version="1.0" encoding="UTF-8"?>':t,n&&(o+="\n")),o};e.toXML=function e(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},f=i.depth,v=void 0===f?0:f,h=i.indent,m=i._isFirstItem,g=(i._isLastItem,i.attributesFilter),_=i.header,j=i.filter,O=c(h,v),k=u(r),x=p(r),A=0===v&&(x||!x&&m),S="";switch(k){case"special-object":var I=r._name,F=r._content;if(null===F){S=I;break}if(I.match(a))break;var w=e(F,n({},i,{depth:v+1})),L=u(w),T=y(w),C=""+(h&&!A?"\n":"")+O,E="undefined"===L||""===w,M="boolean"==typeof r._selfCloseTag?E&&r._selfCloseTag:E,P=M?"/":"",R="<"+I+l(r._attrs,g)+P+">",D=h&&!T?"\n"+O:"";S=""+C+R+(M?"":""+w+D+"</"+I+">");break;case"object":var U=Object.keys(r);S=U.map(function(a,c){var s=n({},i,{_isFirstItem:0===c,_isLastItem:c+1===U.length}),f={_name:a};if("object"===u(r[a])&&(o.forEach(function(e){var t=r[a][e];void 0!==t&&(f[e]=t,delete r[a][e])}),void 0!==r[a]._content&&Object.keys(r[a]).length>1)){var l=Object.assign({},r[a]);delete l._content,f._content=[].concat(t(d(l)),[r[a]._content])}return void 0===f._content&&(f._content=r[a]),e(f,s)},i).join("");break;case"function":var X=r(i);S=e(X,i);break;case"array":S=r.map(function(t,o){var a=n({},i,{_isFirstItem:0===o,_isLastItem:o+1===r.length});return e(t,a)}).join("");break;default:S=s(r,j)}return""+b({header:_,indent:h,depth:v,isOutputStart:A})+S}});

@@ -32,2 +32,16 @@ (function (global, factory) {

var _extends = Object.assign || function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {

@@ -47,5 +61,5 @@ return typeof obj;

var getIndentStr = function getIndentStr() {
var baseIndentStr = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var indent = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
var depth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
return baseIndentStr.repeat(depth);
return indent.repeat(depth);
};

@@ -58,16 +72,3 @@

var getType = function getType(val) {
var type = void 0;
if (Array.isArray(val)) {
type = 'array';
} else if ((typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' && val !== null && val._name) {
type = 'special-object';
} else if (val instanceof Date) {
type = 'date';
} else if (val === null) {
type = 'null';
} else {
type = typeof val === 'undefined' ? 'undefined' : _typeof(val);
}
return type;
return Array.isArray(val) && 'array' || (typeof val === 'undefined' ? 'undefined' : _typeof(val)) === 'object' && val !== null && val._name && 'special-object' || val instanceof Date && 'date' || val === null && 'null' || (typeof val === 'undefined' ? 'undefined' : _typeof(val));
};

@@ -84,6 +85,3 @@

var searches = Object.keys(filter);
var joinedSearches = searches.join('|');
var regexpStr = '(' + joinedSearches + ')';
var regexp = new RegExp(regexpStr, 'g');
var regexp = new RegExp('(' + Object.keys(filter).join('|') + ')', 'g');

@@ -99,3 +97,3 @@ return String(inputStr).replace(regexp, function (str, entity) {

* { foo: 'bar', baz: 'g' } -> 'foo="bar" baz="g"'
* [ { key: '⚡', val: true }, { foo: 'bar' } ] -> '⚡ foo="bar"'
* [ { ⚡: true }, { foo: 'bar' } ] -> '⚡ foo="bar"'
*/

@@ -136,3 +134,3 @@ var getAttributeKeyVals = function getAttributeKeyVals() {

/**
* Converts an attributes object to a string of keyval pairs.
* Converts an attributes object/array to a string of keyval pairs.
* Example:

@@ -183,5 +181,5 @@ * formatAttributes({ a: 1, b: 2 })

*/
var SIMPLE_TYPES = ['string', 'number', 'boolean', 'date', 'special-object'];
var isSimpleType = function isSimpleType(val) {
var valType = getType(val);
return valType === 'string' || valType === 'number' || valType === 'boolean' || valType === 'date' || valType === 'special-object';
return SIMPLE_TYPES.includes(getType(val));
};

@@ -199,11 +197,16 @@

*/
var defaultHeader = '<?xml version="1.0" encoding="UTF-8"?>';
var getHeaderString = function getHeaderString(config, depth, isOutputStart) {
var DEFAULT_XML_HEADER = '<?xml version="1.0" encoding="UTF-8"?>';
var getHeaderString = function getHeaderString(_ref) {
var header = _ref.header,
indent = _ref.indent,
depth = _ref.depth,
isOutputStart = _ref.isOutputStart;
var headerStr = '';
var shouldOutputHeader = config.header && isOutputStart;
var shouldOutputHeader = header && isOutputStart;
if (shouldOutputHeader) {
var shouldUseDefaultHeader = typeof config.header === 'boolean';
headerStr = shouldUseDefaultHeader ? defaultHeader : config.header;
var shouldUseDefaultHeader = typeof header === 'boolean';
headerStr = shouldUseDefaultHeader ? DEFAULT_XML_HEADER : header;
if (config.indent) headerStr += '\n';
if (indent) headerStr += '\n';
}

@@ -220,9 +223,15 @@

var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var _config$depth = config.depth,
depth = _config$depth === undefined ? 0 : _config$depth,
indent = config.indent,
_isFirstItem = config._isFirstItem,
_isLastItem = config._isLastItem,
attributesFilter = config.attributesFilter,
header = config.header,
filter = config.filter;
// Determine tree depth.
var depth = config.depth ? config.depth : 0;
// Determine indent string based on depth.
var indentStr = getIndentStr(config.indent, depth);
var indentStr = getIndentStr(indent, depth);
// For branching based on value type.

@@ -233,3 +242,3 @@ var valType = getType(obj);

// Determine if this is the start of the output. Needed for header and indenting.
var isOutputStart = depth === 0 && (isSimple || !isSimple && config._isFirstItem);
var isOutputStart = depth === 0 && (isSimple || !isSimple && _isFirstItem);

@@ -255,5 +264,4 @@ var outputStr = '';

// Process the nested new value and config.
var newConfig = Object.assign({}, config, { depth: depth + 1 });
var newVal = toXML(_content, newConfig);
// Process the nested new value and create new config.
var newVal = toXML(_content, _extends({}, config, { depth: depth + 1 }));
var newValType = getType(newVal);

@@ -263,3 +271,3 @@ var isNewValSimple = isSimpleXML(newVal);

// Pre-tag output (indent and line breaks).
var preIndentStr = config.indent && !isOutputStart ? '\n' : '';
var preIndentStr = indent && !isOutputStart ? '\n' : '';
var preTag = '' + preIndentStr + indentStr;

@@ -271,7 +279,7 @@

var selfCloseStr = shouldSelfClose ? '/' : '';
var attributesString = formatAttributes(obj._attrs, config.attributesFilter);
var attributesString = formatAttributes(obj._attrs, attributesFilter);
var tag = '<' + _name + attributesString + selfCloseStr + '>';
// Post-tag output (closing tag, indent, line breaks).
var preTagCloseStr = config.indent && !isNewValSimple ? '\n' + indentStr : '';
var preTagCloseStr = indent && !isNewValSimple ? '\n' + indentStr : '';
var postTag = !shouldSelfClose ? '' + newVal + preTagCloseStr + '</' + _name + '>' : '';

@@ -289,3 +297,3 @@

var outputArr = keys.map(function (key, index) {
var newConfig = Object.assign({}, config, {
var newConfig = _extends({}, config, {
_isFirstItem: index === 0,

@@ -350,3 +358,3 @@ _isLastItem: index + 1 === keys.length

var _outputArr = obj.map(function (singleVal, index) {
var newConfig = Object.assign({}, config, {
var newConfig = _extends({}, config, {
_isFirstItem: index === 0,

@@ -362,10 +370,6 @@ _isLastItem: index + 1 === obj.length

case 'number':
case 'string':
case 'boolean':
case 'date':
case 'null':
// number, string, boolean, date, null, etc
default:
{
outputStr = filterStr(obj, config.filter);
outputStr = filterStr(obj, filter);
break;

@@ -375,8 +379,6 @@ }

var headerStr = getHeaderString(config, depth, isOutputStart);
var headerStr = getHeaderString({ header: header, indent: indent, depth: depth, isOutputStart: isOutputStart });
outputStr = '' + headerStr + outputStr;
return outputStr;
return '' + headerStr + outputStr;
};
});

@@ -8,3 +8,3 @@ const privateVars = ['_selfCloseTag', '_attrs'];

*/
const getIndentStr = (baseIndentStr = '', depth = 0) => baseIndentStr.repeat(depth);
const getIndentStr = (indent = '', depth = 0) => indent.repeat(depth);

@@ -15,19 +15,9 @@ /**

*/
const getType = val => {
let type;
if (Array.isArray(val)) {
type = 'array';
} else if (typeof val === 'object' && val !== null && val._name) {
type = 'special-object';
} else if (val instanceof Date) {
type = 'date';
} else if (val === null) {
type = 'null';
} else {
type = typeof val;
}
const getType = val =>
Array.isArray(val) && 'array' ||
(typeof val === 'object' && val !== null && val._name && 'special-object') ||
(val instanceof Date && 'date') ||
val === null && 'null' ||
typeof val;
return type;
};
/**

@@ -39,6 +29,3 @@ * Replaces matching values in a string with a new value.

const filterStr = (inputStr = '', filter = {}) => {
const searches = Object.keys(filter);
const joinedSearches = searches.join('|');
const regexpStr = `(${joinedSearches})`;
const regexp = new RegExp(regexpStr, 'g');
const regexp = new RegExp(`(${ Object.keys(filter).join('|') })`, 'g');

@@ -52,3 +39,3 @@ return String(inputStr).replace(regexp, (str, entity) => filter[entity] || '');

* { foo: 'bar', baz: 'g' } -> 'foo="bar" baz="g"'
* [ { key: '⚡', val: true }, { foo: 'bar' } ] -> '⚡ foo="bar"'
* [ { ⚡: true }, { foo: 'bar' } ] -> '⚡ foo="bar"'
*/

@@ -86,3 +73,3 @@ const getAttributeKeyVals = (attributes = {}, filter) => {

/**
* Converts an attributes object to a string of keyval pairs.
* Converts an attributes object/array to a string of keyval pairs.
* Example:

@@ -125,7 +112,4 @@ * formatAttributes({ a: 1, b: 2 })

*/
const isSimpleType = val => {
const valType = getType(val);
return (valType === 'string' || valType === 'number' || valType === 'boolean' ||
valType === 'date' || valType === 'special-object');
};
const SIMPLE_TYPES = ['string', 'number', 'boolean', 'date', 'special-object'];
const isSimpleType = val => SIMPLE_TYPES.includes(getType(val));

@@ -140,11 +124,11 @@ /**

*/
const defaultHeader = '<?xml version="1.0" encoding="UTF-8"?>';
const getHeaderString = (config, depth, isOutputStart) => {
const DEFAULT_XML_HEADER = '<?xml version="1.0" encoding="UTF-8"?>';
const getHeaderString = ({ header, indent, depth, isOutputStart }) => {
let headerStr = '';
const shouldOutputHeader = config.header && isOutputStart;
const shouldOutputHeader = header && isOutputStart;
if (shouldOutputHeader) {
const shouldUseDefaultHeader = typeof config.header === 'boolean';
headerStr = (shouldUseDefaultHeader) ? defaultHeader : config.header;
const shouldUseDefaultHeader = typeof header === 'boolean';
headerStr = (shouldUseDefaultHeader) ? DEFAULT_XML_HEADER : header;
if (config.indent) headerStr += '\n';
if (indent) headerStr += '\n';
}

@@ -158,8 +142,19 @@

*/
export const toXML = (obj = {}, config = {}) => {
// Determine tree depth.
const depth = (config.depth) ? config.depth : 0;
export const toXML = (
obj = {},
config = {}
) => {
const {
// Tree depth
depth = 0,
indent,
_isFirstItem,
_isLastItem,
attributesFilter,
header,
filter
} = config;
// Determine indent string based on depth.
const indentStr = getIndentStr(config.indent, depth);
const indentStr = getIndentStr(indent, depth);

@@ -171,3 +166,3 @@ // For branching based on value type.

// Determine if this is the start of the output. Needed for header and indenting.
const isOutputStart = depth === 0 && (isSimple || (!isSimple && config._isFirstItem));
const isOutputStart = depth === 0 && (isSimple || (!isSimple && _isFirstItem));

@@ -190,5 +185,4 @@ let outputStr = '';

// Process the nested new value and config.
const newConfig = Object.assign({}, config, { depth: depth + 1 });
const newVal = toXML(_content, newConfig);
// Process the nested new value and create new config.
const newVal = toXML(_content, { ...config, depth: depth + 1 });
const newValType = getType(newVal);

@@ -198,3 +192,3 @@ const isNewValSimple = isSimpleXML(newVal);

// Pre-tag output (indent and line breaks).
const preIndentStr = (config.indent && !isOutputStart) ? '\n' : '';
const preIndentStr = (indent && !isOutputStart) ? '\n' : '';
const preTag = `${preIndentStr}${indentStr}`;

@@ -208,7 +202,7 @@

const selfCloseStr = (shouldSelfClose) ? '/' : '';
const attributesString = formatAttributes(obj._attrs, config.attributesFilter);
const attributesString = formatAttributes(obj._attrs, attributesFilter);
const tag = `<${_name}${attributesString}${selfCloseStr}>`;
// Post-tag output (closing tag, indent, line breaks).
const preTagCloseStr = (config.indent && !isNewValSimple) ? `\n${indentStr}` : '';
const preTagCloseStr = (indent && !isNewValSimple) ? `\n${indentStr}` : '';
const postTag = (!shouldSelfClose) ? `${newVal}${preTagCloseStr}</${_name}>` : '';

@@ -225,6 +219,7 @@

const outputArr = keys.map((key, index) => {
const newConfig = Object.assign({}, config, {
const newConfig = {
...config,
_isFirstItem: index === 0,
_isLastItem: ((index + 1) === keys.length)
});
};

@@ -287,6 +282,7 @@ const outputObj = { _name: key };

const outputArr = obj.map((singleVal, index) => {
const newConfig = Object.assign({}, config, {
const newConfig = {
...config,
_isFirstItem: index === 0,
_isLastItem: ((index + 1) === obj.length)
});
};
return toXML(singleVal, newConfig);

@@ -299,9 +295,5 @@ });

case 'number':
case 'string':
case 'boolean':
case 'date':
case 'null':
// number, string, boolean, date, null, etc
default: {
outputStr = filterStr(obj, config.filter);
outputStr = filterStr(obj, filter);
break;

@@ -311,7 +303,5 @@ }

const headerStr = getHeaderString(config, depth, isOutputStart);
const headerStr = getHeaderString({ header, indent, depth, isOutputStart });
outputStr = `${headerStr}${outputStr}`;
return outputStr;
return `${headerStr}${outputStr}`;
};
{
"name": "jstoxml",
"version": "1.1.3",
"version": "1.2.0",
"description": "Converts JavaScript/JSON to XML (for RSS, Podcasts, AMP, etc.)",

@@ -22,3 +22,3 @@ "homepage": "http://github.com/davidcalhoun/jstoxml",

"dist": "./dist.sh",
"test": "./node_modules/mocha/bin/mocha test.js"
"test": "rm -rf dist && ./dist.sh && ./node_modules/.bin/mocha test.js"
},

@@ -30,2 +30,3 @@ "dependencies": {},

"babel-plugin-transform-es2015-modules-umd": "^6.24.1",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-preset-es2015": "^6.24.1",

@@ -32,0 +33,0 @@ "mocha": "^3.5.3",

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc