Socket
Socket
Sign inDemoInstall

mjml-parser-xml

Package Overview
Dependencies
Maintainers
6
Versions
67
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

mjml-parser-xml - npm Package Compare versions

Comparing version 4.7.1 to 4.8.0

4

lib/helpers/cleanNode.js

@@ -8,3 +8,3 @@ "use strict";

});
exports["default"] = cleanNode;
exports.default = cleanNode;

@@ -17,3 +17,3 @@ var _forEach2 = _interopRequireDefault(require("lodash/forEach"));

if (node.children && node.children.length) {
(0, _forEach2["default"])(node.children, cleanNode);
(0, _forEach2.default)(node.children, cleanNode);
} else {

@@ -20,0 +20,0 @@ delete node.children;

@@ -8,3 +8,3 @@ "use strict";

});
exports["default"] = convertBooleansOnAttrs;
exports.default = convertBooleansOnAttrs;

@@ -18,3 +18,3 @@ var _mapValues2 = _interopRequireDefault(require("lodash/mapValues"));

function convertBooleansOnAttrs(attrs) {
return (0, _mapValues2["default"])(attrs, function (val) {
return (0, _mapValues2.default)(attrs, val => {
if (val === 'true') {

@@ -21,0 +21,0 @@ return true;

@@ -8,3 +8,3 @@ "use strict";

});
exports["default"] = setEmptyAttributes;
exports.default = setEmptyAttributes;

@@ -19,3 +19,3 @@ var _forEach2 = _interopRequireDefault(require("lodash/forEach"));

if (node.children) {
(0, _forEach2["default"])(node.children, setEmptyAttributes);
(0, _forEach2.default)(node.children, setEmptyAttributes);
}

@@ -22,0 +22,0 @@ }

@@ -8,8 +8,4 @@ "use strict";

});
exports["default"] = MJMLParser;
exports.default = MJMLParser;
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread2"));
var _flow2 = _interopRequireDefault(require("lodash/fp/flow"));

@@ -27,3 +23,3 @@

var _htmlparser = _interopRequireDefault(require("htmlparser2"));
var _htmlparser = require("htmlparser2");

@@ -40,6 +36,8 @@ var _path = _interopRequireDefault(require("path"));

var indexesForNewLine = function indexesForNewLine(xml) {
var regex = /\n/gi;
var indexes = [0];
const isNode = require('detect-node');
const indexesForNewLine = xml => {
const regex = /\n/gi;
const indexes = [0];
while (regex.exec(xml)) {

@@ -52,37 +50,24 @@ indexes.push(regex.lastIndex);

var isSelfClosing = function isSelfClosing(indexes, parser) {
return indexes.startIndex === parser.startIndex && indexes.endIndex === parser.endIndex;
};
const isSelfClosing = (indexes, parser) => indexes.startIndex === parser.startIndex && indexes.endIndex === parser.endIndex;
function MJMLParser(xml) {
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var includedIn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
var _options$addEmptyAttr = options.addEmptyAttributes,
addEmptyAttributes = _options$addEmptyAttr === void 0 ? true : _options$addEmptyAttr,
_options$components = options.components,
components = _options$components === void 0 ? {} : _options$components,
_options$convertBoole = options.convertBooleans,
convertBooleans = _options$convertBoole === void 0 ? true : _options$convertBoole,
_options$keepComments = options.keepComments,
keepComments = _options$keepComments === void 0 ? true : _options$keepComments,
_options$filePath = options.filePath,
filePath = _options$filePath === void 0 ? '.' : _options$filePath,
_options$actualPath = options.actualPath,
actualPath = _options$actualPath === void 0 ? '.' : _options$actualPath,
_options$ignoreInclud = options.ignoreIncludes,
ignoreIncludes = _options$ignoreInclud === void 0 ? false : _options$ignoreInclud,
_options$preprocessor = options.preprocessors,
preprocessors = _options$preprocessor === void 0 ? [] : _options$preprocessor;
var endingTags = (0, _flow2["default"])((0, _filter2["default"])(function (component) {
return component.endingTag;
}), (0, _map2["default"])(function (component) {
return component.getTagName();
}))((0, _objectSpread2["default"])({}, components));
var cwd = process.cwd();
function MJMLParser(xml, options = {}, includedIn = []) {
const {
addEmptyAttributes = true,
components = {},
convertBooleans = true,
keepComments = true,
filePath = '.',
actualPath = '.',
ignoreIncludes = false,
preprocessors = []
} = options;
const endingTags = (0, _flow2.default)((0, _filter2.default)(component => component.endingTag), (0, _map2.default)(component => component.getTagName()))({ ...components
});
let cwd = process.cwd();
if (filePath) {
if (isNode && filePath) {
try {
var isDir = _fs["default"].lstatSync(filePath).isDirectory();
const isDir = _fs.default.lstatSync(filePath).isDirectory();
cwd = isDir ? filePath : _path["default"].dirname(filePath);
cwd = isDir ? filePath : _path.default.dirname(filePath);
} catch (e) {

@@ -93,7 +78,7 @@ throw new Error('Specified filePath does not exist');

var mjml = null;
var cur = null;
var inInclude = !!includedIn.length;
var inEndingTag = 0;
var currentEndingTagIndexes = {
let mjml = null;
let cur = null;
let inInclude = !!includedIn.length;
let inEndingTag = 0;
const currentEndingTagIndexes = {
startIndex: 0,

@@ -103,29 +88,27 @@ endIndex: 0

var findTag = function findTag(tagName, tree) {
return (0, _find2["default"])(tree.children, {
tagName: tagName
});
};
const findTag = (tagName, tree) => (0, _find2.default)(tree.children, {
tagName
});
var lineIndexes = indexesForNewLine(xml);
const lineIndexes = indexesForNewLine(xml);
var handleInclude = function handleInclude(file, line) {
var partialPath = _path["default"].resolve(cwd, file);
const handleInclude = (file, line) => {
const partialPath = _path.default.resolve(cwd, file);
var curBeforeInclude = cur;
if ((0, _find2["default"])(cur.includedIn, {
const curBeforeInclude = cur;
if ((0, _find2.default)(cur.includedIn, {
file: partialPath
})) throw new Error("Circular inclusion detected on file : ".concat(partialPath));
var content;
})) throw new Error(`Circular inclusion detected on file : ${partialPath}`);
let content;
try {
content = _fs["default"].readFileSync(partialPath, 'utf8');
content = _fs.default.readFileSync(partialPath, 'utf8');
} catch (e) {
var newNode = {
line: line,
file: file,
absoluteFilePath: _path["default"].resolve(cwd, actualPath),
const newNode = {
line,
file,
absoluteFilePath: _path.default.resolve(cwd, actualPath),
parent: cur,
tagName: 'mj-raw',
content: "<!-- mj-include fails to read file : ".concat(file, " at ").concat(partialPath, " -->"),
content: `<!-- mj-include fails to read file : ${file} at ${partialPath} -->`,
children: [],

@@ -135,4 +118,4 @@ errors: [{

params: {
file: file,
partialPath: partialPath
file,
partialPath
}

@@ -145,19 +128,14 @@ }]

content = content.indexOf('<mjml>') === -1 ? "<mjml><mj-body>".concat(content, "</mj-body></mjml>") : content;
var partialMjml = MJMLParser(content, (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, options), {}, {
content = content.indexOf('<mjml>') === -1 ? `<mjml><mj-body>${content}</mj-body></mjml>` : content;
const partialMjml = MJMLParser(content, { ...options,
filePath: partialPath,
actualPath: partialPath
}), [].concat((0, _toConsumableArray2["default"])(cur.includedIn), [{
}, [...cur.includedIn, {
file: cur.absoluteFilePath,
line: line
}]));
line
}]);
var bindToTree = function bindToTree(children) {
var tree = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : cur;
return children.map(function (c) {
return (0, _objectSpread2["default"])((0, _objectSpread2["default"])({}, c), {}, {
parent: tree
});
});
};
const bindToTree = (children, tree = cur) => children.map(c => ({ ...c,
parent: tree
}));

@@ -168,12 +146,12 @@ if (partialMjml.tagName !== 'mjml') {

var body = findTag('mj-body', partialMjml);
var head = findTag('mj-head', partialMjml);
const body = findTag('mj-body', partialMjml);
const head = findTag('mj-head', partialMjml);
if (body) {
var boundChildren = bindToTree(body.children);
cur.children = [].concat((0, _toConsumableArray2["default"])(cur.children), (0, _toConsumableArray2["default"])(boundChildren));
const boundChildren = bindToTree(body.children);
cur.children = [...cur.children, ...boundChildren];
}
if (head) {
var curHead = findTag('mj-head', mjml);
let curHead = findTag('mj-head', mjml);

@@ -183,3 +161,3 @@ if (!curHead) {

file: actualPath,
absoluteFilePath: _path["default"].resolve(cwd, actualPath),
absoluteFilePath: _path.default.resolve(cwd, actualPath),
parent: mjml,

@@ -193,5 +171,4 @@ tagName: 'mj-head',

var _boundChildren = bindToTree(head.children, curHead);
curHead.children = [].concat((0, _toConsumableArray2["default"])(curHead.children), (0, _toConsumableArray2["default"])(_boundChildren));
const boundChildren = bindToTree(head.children, curHead);
curHead.children = [...curHead.children, ...boundChildren];
} // must restore cur to the cur before include started

@@ -203,5 +180,5 @@

var parser = new _htmlparser["default"].Parser({
onopentag: function onopentag(name, attrs) {
var isAnEndingTag = endingTags.indexOf(name) !== -1;
const parser = new _htmlparser.Parser({
onopentag: (name, attrs) => {
const isAnEndingTag = endingTags.indexOf(name) !== -1;

@@ -223,8 +200,6 @@ if (inEndingTag > 0) {

var line = (0, _findLastIndex2["default"])(lineIndexes, function (i) {
return i <= parser.startIndex;
}) + 1;
const line = (0, _findLastIndex2.default)(lineIndexes, i => i <= parser.startIndex) + 1;
if (name === 'mj-include') {
if (ignoreIncludes) return;
if (ignoreIncludes || !isNode) return;
inInclude = true;

@@ -237,10 +212,10 @@ handleInclude(decodeURIComponent(attrs.path), line);

// "true" and "false" will be converted to bools
attrs = (0, _convertBooleansOnAttrs["default"])(attrs);
attrs = (0, _convertBooleansOnAttrs.default)(attrs);
}
var newNode = {
const newNode = {
file: actualPath,
absoluteFilePath: _path["default"].resolve(cwd, actualPath),
line: line,
includedIn: includedIn,
absoluteFilePath: isNode ? _path.default.resolve(cwd, actualPath) : actualPath,
line,
includedIn,
parent: cur,

@@ -260,3 +235,3 @@ tagName: name,

},
onclosetag: function onclosetag(name) {
onclosetag: name => {
if (endingTags.indexOf(name) !== -1) {

@@ -269,4 +244,4 @@ inEndingTag -= 1;

if (!isSelfClosing(currentEndingTagIndexes, parser)) {
var partialVal = xml.substring(currentEndingTagIndexes.endIndex + 1, parser.endIndex).trim();
var val = partialVal.substring(0, partialVal.lastIndexOf("</".concat(name)));
const partialVal = xml.substring(currentEndingTagIndexes.endIndex + 1, parser.endIndex).trim();
const val = partialVal.substring(0, partialVal.lastIndexOf(`</${name}`));
if (val) cur.content = val.trim();

@@ -287,10 +262,10 @@ }

},
ontext: function ontext(text) {
ontext: text => {
if (inEndingTag > 0) return;
if (text && text.trim() && cur) {
cur.content = "".concat(cur && cur.content || '').concat(text.trim()).trim();
cur.content = `${cur && cur.content || ''}${text.trim()}`.trim();
}
},
oncomment: function oncomment(data) {
oncomment: data => {
if (inEndingTag > 0) return;

@@ -300,8 +275,6 @@

cur.children.push({
line: (0, _findLastIndex2["default"])(lineIndexes, function (i) {
return i <= parser.startIndex;
}) + 1,
line: (0, _findLastIndex2.default)(lineIndexes, i => i <= parser.startIndex) + 1,
tagName: 'mj-raw',
content: "<!-- ".concat(data.trim(), " -->"),
includedIn: includedIn
content: `<!-- ${data.trim()} -->`,
includedIn
});

@@ -317,14 +290,14 @@ }

xml = (0, _flow2["default"])(preprocessors)(xml);
xml = (0, _flow2.default)(preprocessors)(xml);
parser.write(xml);
parser.end();
if (!(0, _isObject2["default"])(mjml)) {
if (!(0, _isObject2.default)(mjml)) {
throw new Error('Parsing failed. Check your mjml.');
}
(0, _cleanNode["default"])(mjml); // Assign "attributes" property if not set
(0, _cleanNode.default)(mjml); // Assign "attributes" property if not set
if (addEmptyAttributes) {
(0, _setEmptyAttributes["default"])(mjml);
(0, _setEmptyAttributes.default)(mjml);
}

@@ -331,0 +304,0 @@

{
"name": "mjml-parser-xml",
"description": "mjml-parser-xml",
"version": "4.7.1",
"version": "4.8.0",
"main": "lib/index.js",

@@ -26,3 +26,4 @@ "files": [

"@babel/runtime": "^7.8.7",
"htmlparser2": "^3.9.2",
"detect-node": "2.0.4",
"htmlparser2": "^4.1.0",
"lodash": "^4.17.15"

@@ -33,7 +34,7 @@ },

"chai": "^4.1.1",
"mjml": "4.7.1",
"mjml-core": "4.7.1",
"mjml": "4.8.0",
"mjml-core": "4.8.0",
"rimraf": "^3.0.2"
},
"gitHead": "6bb3e08efb912765d5195d35dc19ce61cdd6306a"
"gitHead": "6037a02810ea9a0cb62965ba81712fdf536b958b"
}
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