Comparing version 4.0.0-alpha.3 to 4.0.0-alpha.4
@@ -6,231 +6,235 @@ 'use strict'; | ||
}); | ||
exports.watch = exports.validate = exports.renderStream = exports.renderFile = exports.renderFiles = exports.version = undefined; | ||
var _mjmlCore = require('mjml-core'); | ||
var _regenerator = require('babel-runtime/regenerator'); | ||
var _mjmlCore2 = _interopRequireDefault(_mjmlCore); | ||
var _regenerator2 = _interopRequireDefault(_regenerator); | ||
var _mjmlValidator = require('mjml-validator'); | ||
var _promise = require('babel-runtime/core-js/promise'); | ||
var _mjmlValidator2 = _interopRequireDefault(_mjmlValidator); | ||
var _promise2 = _interopRequireDefault(_promise); | ||
var _mjmlParserXml = require('mjml-parser-xml'); | ||
var _extends2 = require('babel-runtime/helpers/extends'); | ||
var _mjmlParserXml2 = _interopRequireDefault(_mjmlParserXml); | ||
var _extends3 = _interopRequireDefault(_extends2); | ||
var _fs = require('fs'); | ||
var _keys = require('babel-runtime/core-js/object/keys'); | ||
var _fs2 = _interopRequireDefault(_fs); | ||
var _keys2 = _interopRequireDefault(_keys); | ||
var _glob = require('glob'); | ||
var _assign = require('babel-runtime/core-js/object/assign'); | ||
var _glob2 = _interopRequireDefault(_glob); | ||
var _assign2 = _interopRequireDefault(_assign); | ||
var _path = require('path'); | ||
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); | ||
var _path2 = _interopRequireDefault(_path); | ||
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); | ||
var _chokidar = require('chokidar'); | ||
var _yargs = require('yargs'); | ||
var _chokidar2 = _interopRequireDefault(_chokidar); | ||
var _yargs2 = _interopRequireDefault(_yargs); | ||
var _difference = require('lodash/difference'); | ||
var _fp = require('lodash/fp'); | ||
var _difference2 = _interopRequireDefault(_difference); | ||
var _lodash = require('lodash'); | ||
var _fileContext = require('./helpers/fileContext'); | ||
var _mjmlCore = require('mjml-core'); | ||
var _fileContext2 = _interopRequireDefault(_fileContext); | ||
var _mjmlCore2 = _interopRequireDefault(_mjmlCore); | ||
var _promesify = require('./helpers/promesify'); | ||
var _readFile = require('./commands/readFile'); | ||
var _timePad = require('./helpers/timePad'); | ||
var _readFile2 = _interopRequireDefault(_readFile); | ||
var _timePad2 = _interopRequireDefault(_timePad); | ||
var _watchFiles = require('./commands/watchFiles'); | ||
var _package = require('../package.json'); | ||
var _watchFiles2 = _interopRequireDefault(_watchFiles); | ||
var _package2 = require('mjml-core/package.json'); | ||
var _readStream = require('./commands/readStream'); | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
var _readStream2 = _interopRequireDefault(_readStream); | ||
/* | ||
* The version number is the NPM | ||
* version number. It should be the same as the MJML engine | ||
*/ | ||
var _outputToFile = require('./commands/outputToFile'); | ||
var version = exports.version = function version() { | ||
return { core: _package2.version, cli: _package.version }; | ||
}; | ||
var _outputToFile2 = _interopRequireDefault(_outputToFile); | ||
/* | ||
* Minimal Error Handling | ||
*/ | ||
var availableErrorOutputFormat = { | ||
json: JSON.stringify, | ||
text: function text(errs) { | ||
return errs.map(function (e) { | ||
return e.formattedMessage; | ||
}).join('\n'); | ||
} | ||
}; | ||
var _outputToConsole = require('./commands/outputToConsole'); | ||
var error = function error(e) { | ||
return console.log(e.stack || e); | ||
}; // eslint-disable-line no-console | ||
var _outputToConsole2 = _interopRequireDefault(_outputToConsole); | ||
var isDirectory = function isDirectory(file) { | ||
try { | ||
var outputPath = _path2.default.resolve(process.cwd(), file); | ||
var _package = require('mjml-core/package.json'); | ||
return _fs2.default.statSync(outputPath).isDirectory(); | ||
} catch (e) { | ||
return false; | ||
} | ||
}; | ||
var _package2 = require('../package.json'); | ||
/* | ||
* Render an input promise | ||
*/ | ||
var render = function render(bufferPromise, _ref) { | ||
var min = _ref.min, | ||
output = _ref.output, | ||
stdout = _ref.stdout, | ||
fileName = _ref.fileName, | ||
level = _ref.level; | ||
var _defaultOptions = require('./helpers/defaultOptions'); | ||
var handleError = function handleError(message) { | ||
return fileName ? error('File: ' + fileName + ' \n' + message) : error(message); | ||
}; | ||
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | ||
return bufferPromise.then(function (mjml) { | ||
return (0, _mjmlCore2.default)(mjml.toString(), { minify: min, filePath: fileName, level: level }); | ||
}).then(function (result) { | ||
var html = result.html, | ||
errors = result.errors; | ||
// eslint-disable-line import/first | ||
exports.default = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { | ||
var EXIT_CODE, KEEP_OPEN, error, pickArgs, argv, config, inputArgs, outputArgs, inputOpt, outputOpt, inputFiles, inputs, convertedStream, failedStream; | ||
return _regenerator2.default.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
EXIT_CODE = 0; | ||
KEEP_OPEN = false; | ||
// non-blocking errors | ||
error = function error(msg) { | ||
console.error(msg); // eslint-disable-line no-console | ||
if (errors.length > 0) { | ||
handleError(availableErrorOutputFormat.text(errors)); | ||
} | ||
return process.exit(1); | ||
}; | ||
if (stdout) { | ||
process.stdout.write(html); | ||
} else { | ||
return (0, _promesify.write)(output, html); | ||
} | ||
}).catch(function (e) { | ||
error(e.getMessages ? e.getMessages() : e); | ||
throw e; | ||
}); | ||
}; | ||
pickArgs = function pickArgs(args) { | ||
return (0, _fp.flow)((0, _fp.pick)(args), (0, _fp.pickBy)(function (e) { | ||
return (0, _fp.negate)(_fp.isNil)(e) && !((0, _lodash.isArray)(e) && (0, _lodash.isEmpty)(e)); | ||
})); | ||
}; | ||
var outputFileName = function outputFileName(input, output) { | ||
var outputIsDirectory = isDirectory(output); | ||
argv = _yargs2.default.options({ | ||
r: { | ||
alias: 'read', | ||
describe: 'Compile MJML File(s)', | ||
type: 'array' | ||
}, | ||
w: { | ||
alias: 'watch', | ||
type: 'array', | ||
describe: 'Watch and compile MJML File(s) when modified' | ||
}, | ||
i: { | ||
alias: 'stdin', | ||
describe: 'Compiles MJML from input stream' | ||
}, | ||
s: { | ||
alias: 'stdout', | ||
describe: 'Output HTML to stdout' | ||
}, | ||
o: { | ||
alias: 'output', | ||
type: 'string', | ||
describe: 'Filename/Directory to output compiled files' | ||
}, | ||
c: { | ||
alias: 'config', | ||
type: 'object', | ||
describe: 'Option to pass to mjml-core' | ||
}, | ||
version: { | ||
alias: 'V' | ||
} | ||
}).help().version('mjml-core: ' + _package.version + '\nmjml-cli: ' + _package2.version).argv; | ||
config = (0, _assign2.default)(_defaultOptions.DEFAULT_OPTIONS, argv.c); | ||
inputArgs = pickArgs(['r', 'w', 'i', '_'])(argv); | ||
outputArgs = pickArgs(['o', 's'])(argv); | ||
[[(0, _keys2.default)(inputArgs).length > 1, 'No input arguments received'], [(0, _keys2.default)(inputArgs).length === 0, 'Too much input arguments received'], [(0, _keys2.default)(outputArgs).length > 1, 'Too much output arguments received'], [argv.w && argv.w.length > 1 && !argv.o, 'Need an output option when watching files'], [argv.w && argv.w.length > 1 && argv.o && !(0, _outputToFile.isDirectory)(argv.o) && argv.o !== '', 'Need an output option when watching files']].forEach(function (v) { | ||
return v[0] ? error(v[1]) : null; | ||
}); | ||
var _path$parse = _path2.default.parse(!output || outputIsDirectory ? input : output), | ||
ext = _path$parse.ext, | ||
name = _path$parse.name; | ||
inputOpt = (0, _keys2.default)(inputArgs)[0]; | ||
outputOpt = (0, _keys2.default)(outputArgs)[0] || 's'; | ||
inputFiles = (0, _lodash.isArray)(inputArgs[inputOpt]) ? inputArgs[inputOpt] : [inputArgs[inputOpt]]; | ||
inputs = []; | ||
_context.t0 = inputOpt; | ||
_context.next = _context.t0 === 'r' ? 16 : _context.t0 === '_' ? 16 : _context.t0 === 'w' ? 18 : _context.t0 === 'i' ? 21 : 27; | ||
break; | ||
var dir = outputIsDirectory ? output : './'; | ||
case 16: | ||
(0, _readFile.flatMapPaths)(inputFiles).forEach(function (file) { | ||
inputs.push((0, _readFile2.default)(file)); | ||
}); | ||
return _context.abrupt('break', 28); | ||
if (output && !outputIsDirectory) { | ||
var _path$parse2 = _path2.default.parse(output), | ||
outDir = _path$parse2.dir; | ||
case 18: | ||
(0, _watchFiles2.default)(inputFiles, argv); | ||
KEEP_OPEN = true; | ||
return _context.abrupt('break', 28); | ||
dir = outDir == '' ? dir : outDir; | ||
} | ||
case 21: | ||
_context.t1 = inputs; | ||
_context.next = 24; | ||
return (0, _readStream2.default)(); | ||
return _path2.default.format({ | ||
dir: dir, | ||
name: name.replace('.mjml', ''), | ||
ext: ext == '.mjml' ? '.html' : ext | ||
}); | ||
}; | ||
case 24: | ||
_context.t2 = _context.sent; | ||
/* | ||
* Turns an MJML input file into a pretty HTML file | ||
* min: boolean that specify the output format (pretty/minified) | ||
*/ | ||
var renderFiles = exports.renderFiles = function renderFiles(input, options) { | ||
return new Promise(function (resolve, reject) { | ||
(0, _glob2.default)(input, function (err, files) { | ||
var processedFiles = []; | ||
_context.t1.push.call(_context.t1, _context.t2); | ||
if (files.length > 1 && options.output && !isDirectory(options.output)) { | ||
throw new Error('Output destination should be a directory instead of a file'); | ||
} | ||
return _context.abrupt('break', 28); | ||
files.forEach(function (f) { | ||
processedFiles.push(renderFile(f, options)); | ||
}); | ||
case 27: | ||
error('Cli error !'); | ||
Promise.all(processedFiles).then(resolve).catch(reject); | ||
}); | ||
}); | ||
}; | ||
case 28: | ||
convertedStream = []; | ||
failedStream = []; | ||
var renderFile = exports.renderFile = function renderFile(file, _ref2) { | ||
var output = _ref2.output, | ||
level = _ref2.level, | ||
min = _ref2.min, | ||
stdout = _ref2.stdout; | ||
return render((0, _promesify.read)(_path2.default.resolve(process.cwd(), file)), { | ||
output: outputFileName(file, output), | ||
fileName: file, | ||
level: level, | ||
min: min, | ||
stdout: stdout | ||
}); | ||
}; | ||
/** | ||
* Render based on input stream | ||
*/ | ||
var renderStream = exports.renderStream = function renderStream(options) { | ||
return render((0, _promesify.readStdin)(process.stdin), options); | ||
}; | ||
inputs.forEach(function (i) { | ||
// eslint-disable-line array-callback-return | ||
try { | ||
convertedStream.push((0, _assign2.default)({}, i, { | ||
compiled: (0, _mjmlCore2.default)(i.mjml, (0, _extends3.default)({}, config, { filePath: i.file })) | ||
})); | ||
} catch (e) { | ||
EXIT_CODE = 2; | ||
/** | ||
* Validate an MJML document | ||
*/ | ||
var validate = exports.validate = function validate(input, _ref3) { | ||
var format = _ref3.format; | ||
return (0, _promesify.read)(input).then(function (content) { | ||
var MJMLDocument = (0, _mjmlParserXml2.default)(content.toString()); | ||
var report = (0, _mjmlValidator2.default)(MJMLDocument); | ||
var outputFormat = availableErrorOutputFormat[format] || availableErrorOutputFormat.text; | ||
failedStream.push({ file: i.file, error: e }); | ||
} | ||
}); | ||
error(outputFormat(report)); | ||
}).catch(function (e) { | ||
error('Error: ' + e); | ||
throw e; | ||
}); | ||
}; | ||
failedStream.forEach(function (_ref2) { | ||
var error = _ref2.error, | ||
file = _ref2.file; | ||
/* | ||
* Watch changes on a specific input file by calling render on each change | ||
*/ | ||
var watch = exports.watch = function watch(input, options) { | ||
console.log('Now watching: ' + input); // eslint-disable-line no-console | ||
renderFile(input, options); | ||
// eslint-disable-line array-callback-return | ||
console.error('' + (file ? 'File: ' + file + '\n' : null) + error); // eslint-disable-line no-console | ||
var dependencies = (0, _fileContext2.default)(input); | ||
var watcher = _chokidar2.default.watch(dependencies); | ||
if (config.stack) { | ||
console.error(error.stack); // eslint-disable-line no-console | ||
} | ||
}); | ||
watcher.on('change', function () { | ||
var now = new Date(); | ||
var newDependencies = (0, _fileContext2.default)(input); | ||
if (!KEEP_OPEN && convertedStream.length === 0) { | ||
error('Input file(s) failed to render'); | ||
} | ||
watcher.unwatch((0, _difference2.default)(dependencies, newDependencies)); | ||
watcher.add((0, _difference2.default)(newDependencies, dependencies)); | ||
_context.t3 = outputOpt; | ||
_context.next = _context.t3 === 'o' ? 36 : _context.t3 === 's' ? 39 : 41; | ||
break; | ||
dependencies = newDependencies; | ||
case 36: | ||
if (inputs.length > 1 && !(0, _outputToFile.isDirectory)(argv.o) && argv.o !== '') { | ||
error('Multiple input files, but output option should be either a directory or an empty string: ' + argv.o + ' given'); | ||
} | ||
console.log('[' + (0, _timePad2.default)(now.getHours()) + ':' + (0, _timePad2.default)(now.getMinutes()) + ':' + (0, _timePad2.default)(now.getSeconds()) + '] Reloading MJML'); // eslint-disable-line no-console | ||
renderFile(input, options); | ||
}); | ||
_promise2.default.all(convertedStream.map((0, _outputToFile2.default)(argv.o))).then(function () { | ||
if (!KEEP_OPEN) { | ||
process.exit(EXIT_CODE); | ||
} | ||
}).catch(function () { | ||
if (!KEEP_OPEN) { | ||
process.exit(1); | ||
} | ||
}); | ||
return _context.abrupt('break', 42); | ||
return watcher; | ||
}; | ||
case 39: | ||
_promise2.default.all(convertedStream.map(_outputToConsole2.default)).then(function () { | ||
return process.exit(EXIT_CODE); | ||
}).catch(function () { | ||
return process.exit(1); | ||
}); | ||
return _context.abrupt('break', 42); | ||
case 41: | ||
error('Cli error ! (No output option available)'); | ||
case 42: | ||
case 'end': | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, undefined); | ||
})); | ||
module.exports = exports['default']; |
@@ -7,4 +7,2 @@ 'use strict'; | ||
var _mjmlCore = require('mjml-core'); | ||
var _fs = require('fs'); | ||
@@ -20,16 +18,18 @@ | ||
var ensureMJMLFile = function ensureMJMLFile(file) { | ||
var includeRegexp = /<mj-include\s+path=['"](.*[.mjml]?)['"]\s*(\/>|>\s*<\/mj-include>)/g; | ||
var ensureIncludeIsMJMLFile = function ensureIncludeIsMJMLFile(file) { | ||
return file.trim().match(/.mjml/) && file || file + '.mjml'; | ||
}; | ||
var error = function error(e) { | ||
return console.log(e.stack || e); | ||
return console.error(e.stack || e); | ||
}; // eslint-disable-line no-console | ||
exports.default = function (baseFile) { | ||
var filesIncluded = [_path2.default.resolve(baseFile)]; | ||
var filesIncluded = []; | ||
var readIncludes = function readIncludes(dir, file, base) { | ||
var currentFile = _path2.default.resolve(_path2.default.join(dir, ensureMJMLFile(file))); | ||
var currentFile = _path2.default.resolve(dir ? _path2.default.join(dir, ensureIncludeIsMJMLFile(file)) : ensureIncludeIsMJMLFile(file)); | ||
var currentDirectory = _path2.default.dirname(currentFile); | ||
var includeRegexp = new RegExp(_mjmlCore.mjIncludeRegexp); | ||
var includes = new RegExp(includeRegexp); | ||
@@ -44,5 +44,5 @@ var content = void 0; | ||
var matchgroup = includeRegexp.exec(content); | ||
var matchgroup = includes.exec(content); | ||
while (matchgroup != null) { | ||
var includedFile = ensureMJMLFile(matchgroup[1]); | ||
var includedFile = ensureIncludeIsMJMLFile(matchgroup[1]); | ||
var includedFilePath = _path2.default.resolve(_path2.default.join(currentDirectory, includedFile)); | ||
@@ -53,7 +53,7 @@ | ||
readIncludes(_path2.default.dirname(currentFile), includedFile, currentFile); | ||
matchgroup = includeRegexp.exec(content); | ||
matchgroup = includes.exec(content); | ||
} | ||
}; | ||
readIncludes('.', baseFile, baseFile); | ||
readIncludes(null, baseFile, baseFile); | ||
@@ -60,0 +60,0 @@ return filesIncluded; |
{ | ||
"name": "mjml-cli", | ||
"description": "MJML: the only framework that makes responsive-email easy", | ||
"version": "4.0.0-alpha.3", | ||
"version": "4.0.0-alpha.4", | ||
"main": "bin/mjml", | ||
@@ -24,9 +24,8 @@ "bin": { | ||
"chokidar": "^1.6.1", | ||
"commander": "^2.11.0", | ||
"fs-promise": "^2.0.3", | ||
"glob": "^7.1.1", | ||
"lodash": "^4.17.4", | ||
"mjml-core": "^4.0.0-alpha.3", | ||
"mjml-parser-xml": "^4.0.0-alpha.3", | ||
"mjml-validator": "^4.0.0-alpha.3" | ||
"mjml-core": "^4.0.0-alpha.4", | ||
"mjml-parser-xml": "^4.0.0-alpha.4", | ||
"mjml-validator": "^4.0.0-alpha.4", | ||
"yargs": "^8.0.2" | ||
}, | ||
@@ -33,0 +32,0 @@ "devDependencies": { |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
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
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
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
131465
7
15
523
4
1
+ Addedyargs@^8.0.2
+ Addedansi-regex@2.1.13.0.1(transitive)
+ Addedcamelcase@4.1.0(transitive)
+ Addedcliui@3.2.0(transitive)
+ Addedcode-point-at@1.1.0(transitive)
+ Addedcross-spawn@5.1.0(transitive)
+ Addeddecamelize@1.2.0(transitive)
+ Addederror-ex@1.3.2(transitive)
+ Addedexeca@0.7.0(transitive)
+ Addedfind-up@2.1.0(transitive)
+ Addedget-caller-file@1.0.3(transitive)
+ Addedget-stream@3.0.0(transitive)
+ Addedhosted-git-info@2.8.9(transitive)
+ Addedinvert-kv@1.0.0(transitive)
+ Addedis-arrayish@0.2.1(transitive)
+ Addedis-core-module@2.15.1(transitive)
+ Addedis-fullwidth-code-point@1.0.02.0.0(transitive)
+ Addedis-stream@1.1.0(transitive)
+ Addedlcid@1.0.0(transitive)
+ Addedload-json-file@2.0.0(transitive)
+ Addedlocate-path@2.0.0(transitive)
+ Addedlru-cache@4.1.5(transitive)
+ Addedmem@1.1.0(transitive)
+ Addedmimic-fn@1.2.0(transitive)
+ Addednormalize-package-data@2.5.0(transitive)
+ Addednpm-run-path@2.0.2(transitive)
+ Addednumber-is-nan@1.0.1(transitive)
+ Addedos-locale@2.1.0(transitive)
+ Addedp-finally@1.0.0(transitive)
+ Addedp-limit@1.3.0(transitive)
+ Addedp-locate@2.0.0(transitive)
+ Addedp-try@1.0.0(transitive)
+ Addedparse-json@2.2.0(transitive)
+ Addedpath-exists@3.0.0(transitive)
+ Addedpath-key@2.0.1(transitive)
+ Addedpath-parse@1.0.7(transitive)
+ Addedpath-type@2.0.0(transitive)
+ Addedpify@2.3.0(transitive)
+ Addedpseudomap@1.0.2(transitive)
+ Addedread-pkg@2.0.0(transitive)
+ Addedread-pkg-up@2.0.0(transitive)
+ Addedrequire-main-filename@1.0.1(transitive)
+ Addedresolve@1.22.8(transitive)
+ Addedsemver@5.7.2(transitive)
+ Addedset-blocking@2.0.0(transitive)
+ Addedshebang-command@1.2.0(transitive)
+ Addedshebang-regex@1.0.0(transitive)
+ Addedsignal-exit@3.0.7(transitive)
+ Addedspdx-correct@3.2.0(transitive)
+ Addedspdx-exceptions@2.5.0(transitive)
+ Addedspdx-expression-parse@3.0.1(transitive)
+ Addedspdx-license-ids@3.0.20(transitive)
+ Addedstring-width@1.0.22.1.1(transitive)
+ Addedstrip-ansi@3.0.14.0.0(transitive)
+ Addedstrip-bom@3.0.0(transitive)
+ Addedstrip-eof@1.0.0(transitive)
+ Addedsupports-preserve-symlinks-flag@1.0.0(transitive)
+ Addedvalidate-npm-package-license@3.0.4(transitive)
+ Addedwhich@1.3.1(transitive)
+ Addedwhich-module@2.0.1(transitive)
+ Addedwrap-ansi@2.1.0(transitive)
+ Addedy18n@3.2.2(transitive)
+ Addedyallist@2.1.2(transitive)
+ Addedyargs@8.0.2(transitive)
+ Addedyargs-parser@7.0.0(transitive)
- Removedcommander@^2.11.0
- Removedfs-promise@^2.0.3
- Removedany-promise@1.3.0(transitive)
- Removedfs-extra@2.1.2(transitive)
- Removedfs-promise@2.0.3(transitive)
- Removedjsonfile@2.4.0(transitive)
- Removedmz@2.7.0(transitive)
- Removedobject-assign@4.1.1(transitive)
- Removedthenify@3.3.1(transitive)
- Removedthenify-all@1.6.0(transitive)
Updatedmjml-core@^4.0.0-alpha.4