mjml-parser-xml
Advanced tools
Comparing version 4.7.1 to 4.8.0
@@ -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 @@ } |
201
lib/index.js
@@ -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" | ||
} |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
15299
4
370
+ Addeddetect-node@2.0.4
+ Addeddetect-node@2.0.4(transitive)
+ Addeddom-serializer@1.4.1(transitive)
+ Addeddomhandler@3.3.04.3.1(transitive)
+ Addeddomutils@2.8.0(transitive)
+ Addedhtmlparser2@4.1.0(transitive)
- Removeddom-serializer@0.2.2(transitive)
- Removeddomelementtype@1.3.1(transitive)
- Removeddomhandler@2.4.2(transitive)
- Removeddomutils@1.7.0(transitive)
- Removedentities@1.1.2(transitive)
- Removedhtmlparser2@3.10.1(transitive)
- Removedinherits@2.0.4(transitive)
- Removedreadable-stream@3.6.2(transitive)
- Removedsafe-buffer@5.2.1(transitive)
- Removedstring_decoder@1.3.0(transitive)
- Removedutil-deprecate@1.0.2(transitive)
Updatedhtmlparser2@^4.1.0