UNPKG

rollup-umd-scripts

Version:

CLI for rollup-umd projects

488 lines (380 loc) 15.5 kB
'use strict'; 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; })()(); };