rollup-umd-scripts
Version:
CLI for rollup-umd projects
488 lines (380 loc) • 15.5 kB
JavaScript
;
var _stringify = require('babel-runtime/core-js/json/stringify');
var _stringify2 = _interopRequireDefault(_stringify);
var _regenerator = require('babel-runtime/regenerator');
var _regenerator2 = _interopRequireDefault(_regenerator);
var _getIterator2 = require('babel-runtime/core-js/get-iterator');
var _getIterator3 = _interopRequireDefault(_getIterator2);
var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator');
var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2);
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _promise = require('babel-runtime/core-js/promise');
var _promise2 = _interopRequireDefault(_promise);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/* eslint-disable no-undef, no-param-reassign, global-require, no-unused-vars, no-console, no-restricted-syntax, no-await-in-loop */
/**
* This script will extract the internationalization messages from all components
and package them in the translation json files in the translations file.
*/
var fs = require('fs');
var path = require('path');
var nodeGlob = require('glob');
var shell = require('shelljs');
var _require = require('babel-core'),
transform = _require.transform;
var _require2 = require('kopaxgroup-cli-helpers'),
animateProgress = _require2.animateProgress,
addCheckMark = _require2.addCheckMark;
require('shelljs/global');
// Glob to match all js files except test files
var FILES_TO_PARSE = 'src/**/!(*.test).js';
var newLine = function newLine() {
return process.stdout.write('\n');
};
// Progress Logger
var progress = void 0;
var task = function task(message) {
progress = animateProgress(message);
process.stdout.write(message);
return function (error) {
if (error) {
process.stderr.write(error);
}
clearTimeout(progress);
return addCheckMark(function () {
return newLine();
});
};
};
// Wrap async functions below into a promise
var glob = function glob(pattern) {
return new _promise2.default(function (resolve, reject) {
nodeGlob(pattern, function (error, value) {
return error ? reject(error) : resolve(value);
});
});
};
var readFile = function readFile(fileName) {
return new _promise2.default(function (resolve, reject) {
fs.readFile(fileName, function (error, value) {
return error ? reject(error) : resolve(value);
});
});
};
var writeFile = function writeFile(fileName, data) {
return new _promise2.default(function (resolve, reject) {
fs.writeFile(fileName, data, function (error, value) {
return error ? reject(error) : resolve(value);
});
});
};
var doSpawn = function doSpawn(cmd) {
return new _promise2.default(function (resolve, reject) {
spawn(cmd, function (error, value) {
return error ? reject(error) : resolve(value);
});
});
};
// Store existing translations into memory
var oldLocaleMappings = [];
var localeMappings = [];
var setOldLocalMappings = function setOldLocalMappings(argv, locales) {
// Loop to run once per locale
locales.forEach(function (locale) {
oldLocaleMappings[locale] = {};
localeMappings[locale] = {};
// File to store translation messages into
var translationFileName = argv.target + '/' + locale + '.json';
try {
// Parse the old translation message JSON files
var messages = JSON.parse(fs.readFileSync(translationFileName));
var messageKeys = (0, _keys2.default)(messages);
messageKeys.forEach(function (messageKey) {
oldLocaleMappings[locale][messageKey] = messages[messageKey];
});
} catch (error) {
if (error.code !== 'ENOENT') {
process.stderr.write('There was an error loading this translation file: ' + translationFileName + '\n' + error);
}
}
});
};
var extractFromFile = function () {
var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee(argv, fileName, defaultLocale, locales, presets, plugins) {
var code, _ref2, result, _iteratorNormalCompletion, _didIteratorError, _iteratorError, _iterator, _step, message, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, locale, oldLocaleMapping, newMsg;
return _regenerator2.default.wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_context.prev = 0;
_context.next = 3;
return readFile(fileName);
case 3:
code = _context.sent;
_context.next = 6;
return transform(code, { presets: presets, plugins: plugins });
case 6:
_ref2 = _context.sent;
result = _ref2.metadata;
// object-shorthand
_iteratorNormalCompletion = true;
_didIteratorError = false;
_iteratorError = undefined;
_context.prev = 11;
_iterator = (0, _getIterator3.default)(result['react-intl'].messages);
case 13:
if (_iteratorNormalCompletion = (_step = _iterator.next()).done) {
_context.next = 37;
break;
}
message = _step.value;
_iteratorNormalCompletion2 = true;
_didIteratorError2 = false;
_iteratorError2 = undefined;
_context.prev = 18;
for (_iterator2 = (0, _getIterator3.default)(locales); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
locale = _step2.value;
oldLocaleMapping = oldLocaleMappings[locale][message.id];
// Merge old translations into the babel extracted instances where react-intl is used
newMsg = locale === defaultLocale ? message.defaultMessage : '';
localeMappings[locale][message.id] = oldLocaleMapping || newMsg;
}
_context.next = 26;
break;
case 22:
_context.prev = 22;
_context.t0 = _context['catch'](18);
_didIteratorError2 = true;
_iteratorError2 = _context.t0;
case 26:
_context.prev = 26;
_context.prev = 27;
if (!_iteratorNormalCompletion2 && _iterator2.return) {
_iterator2.return();
}
case 29:
_context.prev = 29;
if (!_didIteratorError2) {
_context.next = 32;
break;
}
throw _iteratorError2;
case 32:
return _context.finish(29);
case 33:
return _context.finish(26);
case 34:
_iteratorNormalCompletion = true;
_context.next = 13;
break;
case 37:
_context.next = 43;
break;
case 39:
_context.prev = 39;
_context.t1 = _context['catch'](11);
_didIteratorError = true;
_iteratorError = _context.t1;
case 43:
_context.prev = 43;
_context.prev = 44;
if (!_iteratorNormalCompletion && _iterator.return) {
_iterator.return();
}
case 46:
_context.prev = 46;
if (!_didIteratorError) {
_context.next = 49;
break;
}
throw _iteratorError;
case 49:
return _context.finish(46);
case 50:
return _context.finish(43);
case 51:
_context.next = 56;
break;
case 53:
_context.prev = 53;
_context.t2 = _context['catch'](0);
process.stderr.write('Error transforming file: ' + fileName + '\n' + _context.t2);
case 56:
case 'end':
return _context.stop();
}
}
}, _callee, undefined, [[0, 53], [11, 39, 43, 51], [18, 22, 26, 34], [27,, 29, 33], [44,, 46, 50]]);
}));
return function extractFromFile(_x, _x2, _x3, _x4, _x5, _x6) {
return _ref.apply(this, arguments);
};
}();
exports.command = 'extract';
exports.desc = 'Extract intl messages to json files.';
exports.builder = function (yargs) {
return yargs.option('path', {
alias: 'p',
describe: 'path',
default: process.cwd()
}).option('target', {
alias: 't',
describe: 'Output target directory',
default: 'translation'
});
};
exports.handler = function (argv) {
switch (argv.path[0]) {
case '/':
break;
default:
argv.path = argv.path[1] === '/' ? path.join(process.cwd(), argv.path.slice(2)) : path.join(process.cwd(), argv.path);
break;
}
var pkg = require(path.join(argv.path, 'package.json'));
var babelRcPath = path.join(argv.path, '.babelrc');
var babelrc = fs.existsSync(babelRcPath) ? JSON.parse(fs.readFileSync(babelRcPath, 'utf-8')) : { presets: ['react-app'] };
var presets = babelrc.presets;
var plugins = babelrc.plugins || [];
plugins.push(['react-intl']);
if (!pkg.dependencies['react-intl']) {
console.log('[Error] - You must use a intl declination to use this command!');
return;
}
if (!pkg.translation) {
console.log('[Error] - You must run "intl install" at least once before running this command!');
return;
}
(function () {
var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() {
var _this = this;
var memoryTaskDone, files, extractTaskDone, _loop, _iteratorNormalCompletion3, _didIteratorError3, _iteratorError3, _iterator3, _step3, locale;
return _regenerator2.default.wrap(function _callee2$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
memoryTaskDone = task('Storing language files in memory');
_context3.next = 3;
return glob(FILES_TO_PARSE);
case 3:
files = _context3.sent;
memoryTaskDone();
extractTaskDone = task('Run extraction on all files');
if (!(presets.indexOf('react-app') !== -1 && (0, _keys2.default)(pkg.devDependencies || {}).indexOf('babel-preset-react-app') === -1)) {
_context3.next = 16;
break;
}
console.log('\nRequired dependencies will be installed: babel-cli babel-plugin-react-intl babel-preset-react-app\n');
_context3.prev = 8;
_context3.next = 11;
return doSpawn('npm install --prefix ' + argv.path + ' babel-cli babel-plugin-react-intl babel-preset-react-app --save-dev');
case 11:
_context3.next = 16;
break;
case 13:
_context3.prev = 13;
_context3.t0 = _context3['catch'](8);
throw _context3.t0;
case 16:
setOldLocalMappings(argv, pkg.translation.locales);
// Run extraction on all files that match the glob on line 16
_context3.next = 19;
return _promise2.default.all(files.map(function (fileName) {
return extractFromFile(argv, fileName, pkg.translation.locale, pkg.translation.locales, presets, plugins);
}));
case 19:
extractTaskDone();
if (!fs.existsSync(argv.target)) {
shell.mkdir('-p', argv.target);
}
_loop = /*#__PURE__*/_regenerator2.default.mark(function _loop(locale) {
var translationFileName, _localeTaskDone, messages, prettified;
return _regenerator2.default.wrap(function _loop$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
translationFileName = argv.target + '/' + locale + '.json';
_context2.prev = 1;
_localeTaskDone = task('Writing translation messages for ' + locale + ' to: ' + translationFileName);
// Sort the translation JSON file so that git diffing is easier
// Otherwise the translation messages will jump around every time we extract
messages = {};
(0, _keys2.default)(localeMappings[locale]).sort().forEach(function (key) {
messages[key] = localeMappings[locale][key];
});
// Write to file the JSON representation of the translation messages
prettified = (0, _stringify2.default)(messages, null, 2) + '\n';
_context2.next = 8;
return writeFile(translationFileName, prettified);
case 8:
_localeTaskDone();
_context2.next = 14;
break;
case 11:
_context2.prev = 11;
_context2.t0 = _context2['catch'](1);
localeTaskDone('There was an error saving this translation file: ' + translationFileName + '\n \n' + _context2.t0);
case 14:
case 'end':
return _context2.stop();
}
}
}, _loop, _this, [[1, 11]]);
});
_iteratorNormalCompletion3 = true;
_didIteratorError3 = false;
_iteratorError3 = undefined;
_context3.prev = 25;
_iterator3 = (0, _getIterator3.default)(pkg.translation.locales);
case 27:
if (_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done) {
_context3.next = 33;
break;
}
locale = _step3.value;
return _context3.delegateYield(_loop(locale), 't1', 30);
case 30:
_iteratorNormalCompletion3 = true;
_context3.next = 27;
break;
case 33:
_context3.next = 39;
break;
case 35:
_context3.prev = 35;
_context3.t2 = _context3['catch'](25);
_didIteratorError3 = true;
_iteratorError3 = _context3.t2;
case 39:
_context3.prev = 39;
_context3.prev = 40;
if (!_iteratorNormalCompletion3 && _iterator3.return) {
_iterator3.return();
}
case 42:
_context3.prev = 42;
if (!_didIteratorError3) {
_context3.next = 45;
break;
}
throw _iteratorError3;
case 45:
return _context3.finish(42);
case 46:
return _context3.finish(39);
case 47:
process.exit();
case 48:
case 'end':
return _context3.stop();
}
}
}, _callee2, this, [[8, 13], [25, 35, 39, 47], [40,, 42, 46]]);
}));
function main() {
return _ref3.apply(this, arguments);
}
return main;
})()();
};