UNPKG

babel-plugin-react-intl-messages-generator

Version:

Extracts explicit texts from react components and generate a componentNameMessages.js files

155 lines (111 loc) 5.23 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _set = require('babel-runtime/core-js/set'); var _set2 = _interopRequireDefault(_set); var _symbol = require('babel-runtime/core-js/symbol'); var _symbol2 = _interopRequireDefault(_symbol); exports.default = function (_ref) { var t = _ref.types; // eslint-disable-line no-unused-vars function isTextIgnorable(text) { var hasWords = /^\w+/.test(text); // covers empty string var isNumber = /^\d+$/.test(text); return text.length === 1 || isNumber || !hasWords; } function generateDescriptorFromText(defaultMessage, path, state) { var file = state.file, _state$reactIntlMessa = state.reactIntlMessages, generatedDescriptors = _state$reactIntlMessa.generatedDescriptors, proxyTexts = _state$reactIntlMessa.proxyTexts; defaultMessage = defaultMessage.trim(); if (isTextIgnorable(defaultMessage) || proxyTexts.has(defaultMessage)) return; proxyTexts.add(defaultMessage); var prefixId = p.relative(process.cwd(), file.opts.filename).split('/').join('.').replace(/jsx?/, '..'); generatedDescriptors.push({ id: prefixId, defaultMessage: defaultMessage }); } function tagAsExtracted(path) { path.node[EXTRACTED_TAG] = true; } function wasExtracted(path) { return !!path.node[EXTRACTED_TAG]; } return { visitor: { Program: { enter: function enter(path, state) { state.reactIntlMessages = { generatedDescriptors: [], proxyTexts: new _set2.default() }; }, exit: function exit(path, state) { var file = state.file, opts = state.opts, reactIntlMessages = state.reactIntlMessages; var _file$opts = file.opts, basename = _file$opts.basename, filename = _file$opts.filename; var generatedDescriptors = reactIntlMessages.generatedDescriptors; file.metadata['react-intl-defineMessages'] = { generatedDescriptors: generatedDescriptors }; if (opts.messagesDir && generatedDescriptors.length > 0) { (function () { var relativePath = p.join(p.sep, p.relative(process.cwd(), filename)); var generatedMessagesFilename = p.join(opts.messagesDir, p.dirname(relativePath), basename + 'Messages.js'); var existingContent = void 0; if ((0, _fs.existsSync)(generatedMessagesFilename)) { existingContent = (0, _fs.readFileSync)(generatedMessagesFilename, 'utf-8'); } var namedDesriptors = generatedDescriptors.reduce(function (descriptorsWithKey, descriptor) { if (existingContent) { var defaultMessage = descriptor.defaultMessage; var messageExist = new RegExp('defaultMessage: \'' + defaultMessage + '\''); if (messageExist.test(existingContent)) { return descriptorsWithKey; } } descriptorsWithKey += (0, _utils.createDescriptorsWithKey)(descriptor); return descriptorsWithKey; }, ''); (0, _mkdirp.sync)(p.dirname(generatedMessagesFilename)); // updating existing file if (existingContent && namedDesriptors) { var oldDescriptors = (0, _utils.removeDefindeMessageFormat)(existingContent); var updatedNamedDescriptors = oldDescriptors + namedDesriptors; var updatedDescriptorFile = (0, _utils.defineMessageFormat)(updatedNamedDescriptors); (0, _fs.writeFileSync)(generatedMessagesFilename, updatedDescriptorFile); } // new file if (!existingContent && namedDesriptors) { var generatedDescriptorFile = (0, _utils.defineMessageFormat)(namedDesriptors); (0, _fs.writeFileSync)(generatedMessagesFilename, generatedDescriptorFile); } // else keep the file untouched })(); } } }, // Program ends JSXText: function JSXText(path, state) { if (wasExtracted(path)) { return; } generateDescriptorFromText(path.node.value, path, state); // Tag the AST node so we don't try to extract it twice. tagAsExtracted(path); } } }; }; var _path = require('path'); var p = _interopRequireWildcard(_path); var _fs = require('fs'); var _mkdirp = require('mkdirp'); var _utils = require('./utils'); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /* * Copyright 2017-Present, Peramanathan Sathyamoorthy. * Copyrights licensed under the New BSD License. * See the accompanying LICENSE file for terms. */ var EXTRACTED_TAG = (0, _symbol2.default)('DescriptorGenerated');