Socket
Socket
Sign inDemoInstall

mjml-cli

Package Overview
Dependencies
Maintainers
5
Versions
123
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

mjml-cli - npm Package Compare versions

Comparing version 4.0.0-alpha.3 to 4.0.0-alpha.4

lib/commands/outputToConsole.js

350

lib/client.js

@@ -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

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