mos
Version:
A pluggable module that injects content into your markdown files via hidden JavaScript snippets
195 lines (142 loc) • 7.22 kB
JavaScript
'use strict';
var _extends2 = require('babel-runtime/helpers/extends');
var _extends3 = _interopRequireDefault(_extends2);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray');
var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2);
var _set = require('babel-runtime/core-js/set');
var _set2 = _interopRequireDefault(_set);
var _updateNotifier = require('update-notifier');
var _updateNotifier2 = _interopRequireDefault(_updateNotifier);
var _meow = require('meow');
var _meow2 = _interopRequireDefault(_meow);
var _processFiles = require('./process-files');
var _processFiles2 = _interopRequireDefault(_processFiles);
var _normalizeNewline = require('normalize-newline');
var _normalizeNewline2 = _interopRequireDefault(_normalizeNewline);
var _relative = require('relative');
var _relative2 = _interopRequireDefault(_relative);
var _normalizePath = require('normalize-path');
var _normalizePath2 = _interopRequireDefault(_normalizePath);
var _chalk = require('chalk');
var _chalk2 = _interopRequireDefault(_chalk);
var _fs = require('fs');
var _fs2 = _interopRequireDefault(_fs);
var _path = require('path');
var _path2 = _interopRequireDefault(_path);
var _tape = require('tape');
var _tape2 = _interopRequireDefault(_tape);
var _tapDiff = require('@zkochan/tap-diff');
var _tapDiff2 = _interopRequireDefault(_tapDiff);
var _readPkgUp = require('@zkochan/read-pkg-up');
var _readPkgUp2 = _interopRequireDefault(_readPkgUp);
var _rcfile = require('rcfile');
var _rcfile2 = _interopRequireDefault(_rcfile);
var _mosProcessor = require('mos-processor');
var _mosProcessor2 = _interopRequireDefault(_mosProcessor);
var _defaultPlugins = require('./default-plugins');
var _defaultPlugins2 = _interopRequireDefault(_defaultPlugins);
var _resolve = require('resolve');
var _resolve2 = _interopRequireDefault(_resolve);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var cwd = process.cwd();
var stdout = process.stdout;
var cli = (0, _meow2.default)(['Usage', ' mos [test] [files]', '', 'Options', ' --init Add mos to your project', ' --help, -h Display usage', ' --version, -v Display version', ' --tap Generate TAP output when testing markdown files', '', ' -x="<exclude-pattern>"', ' Exclude pattern', '', 'Examples', ' mos', ' mos test', ' mos test README.md', ' mos --init', ' mos --init README.md', '', 'Tips:', ' Add `mos test` to your `scripts.test` property in `package.json`'].join('\n'), {
alias: {
help: 'h',
version: 'v'
}
});
(0, _updateNotifier2.default)({ pkg: cli.pkg }).notify();
if (cli.flags.init) {
require('mos-init')();
} else {
(function () {
var highlightPath = _chalk2.default.bgBlack.yellow;
var isTest = ~['test', 't'].indexOf((cli.input[0] || '').toLowerCase());
var processMD = function processMD(md) {
return (0, _readPkgUp2.default)({ cwd: md.filePath }).then(function (result) {
var pkg = result.pkg;
var config = (0, _rcfile2.default)('mos', { cwd: _path2.default.dirname(md.filePath) });
var allDeps = new _set2.default([].concat((0, _toConsumableArray3.default)((0, _keys2.default)(pkg.dependencies || {})), (0, _toConsumableArray3.default)((0, _keys2.default)(pkg.devDependencies || {}))));
var pkgPlugins = (config.plugins || []).map(function (plugin) {
return plugin instanceof Array ? { name: plugin[0], options: plugin[1] || {} } : { name: plugin, options: {} };
}).map(function (plugin) {
var namespacedName = 'mos-plugin-' + plugin.name;
if (allDeps.has(namespacedName)) {
return (0, _extends3.default)({}, plugin, { name: namespacedName });
}
if (allDeps.has(plugin.name)) {
return plugin;
}
throw new Error(plugin.name + ' is not in the dependencies');
}).map(function (plugin) {
return (0, _extends3.default)({}, plugin, { path: _resolve2.default.sync(plugin.name, { basedir: _path2.default.dirname(md.filePath) }) });
}).map(function (plugin) {
return (0, _extends3.default)({}, plugin, { path: (0, _normalizePath2.default)(plugin.path) });
}).map(function (plugin) {
return (0, _extends3.default)({}, plugin, { register: require(plugin.path) });
});
var defaultPluginsWithOpts = _defaultPlugins2.default.reduce(function (defPlugins, defPlugin) {
var defPluginName = defPlugin.attributes.pkg && defPlugin.attributes.pkg.name || defPlugin.attributes.name;
var options = config[defPluginName] || config[defPluginName.replace(/^mos-plugin-/, '')];
if (options === false) {
return defPlugins;
}
return [].concat((0, _toConsumableArray3.default)(defPlugins), [{
register: defPlugin,
options: options
}]);
}, []);
return (0, _mosProcessor2.default)(md, [].concat((0, _toConsumableArray3.default)(defaultPluginsWithOpts), (0, _toConsumableArray3.default)(pkgPlugins)));
}).then(function (processor) {
return processor.process();
});
};
var mdExtensions = ['markdown', 'mdown', 'mkdn', 'mkd', 'md'];
var files = cli.input[isTest ? 1 : 0];
var pattern = files ? _path2.default.resolve(cwd, files) : _path2.default.resolve(cwd, '{/**/,/}*.{' + mdExtensions.join() + '}');
var ignorePattern = cli.flags.x ? _path2.default.resolve(cwd, cli.flags.x) : null;
if (isTest) {
if (cli.flags.tap !== true) {
_tape2.default.createStream().pipe((0, _tapDiff2.default)()).pipe(stdout);
}
(0, _tape2.default)('markdown', function (t) {
(0, _processFiles2.default)({
process: processMD,
pattern: pattern,
ignorePattern: ignorePattern,
afterEachRender: function afterEachRender(opts) {
var relativePath = (0, _normalizePath2.default)(getRelativePath(opts.filePath));
t.equal((0, _normalizeNewline2.default)(opts.newMD), (0, _normalizeNewline2.default)(opts.currentMD), relativePath);
}
}).then(function () {
return t.end();
}).catch(function (err) {
throw err;
});
});
} else {
(0, _processFiles2.default)({
process: processMD,
pattern: pattern,
ignorePattern: ignorePattern,
afterEachRender: function afterEachRender(opts) {
if ((0, _normalizeNewline2.default)(opts.newMD) !== (0, _normalizeNewline2.default)(opts.currentMD)) {
_fs2.default.writeFileSync(opts.filePath, opts.newMD, {
encoding: 'utf8'
});
var relativePath = (0, _normalizePath2.default)(getRelativePath(opts.filePath));
console.log('updated', highlightPath(relativePath));
}
}
}).catch(function (err) {
throw err;
});
}
})();
}
function getRelativePath(filePath) {
return (0, _relative2.default)(cwd, filePath);
}