From dfbea6b4329e43c9ce62c6568d35944d564eed80 Mon Sep 17 00:00:00 2001 From: Lukas Eipert Date: Tue, 5 Feb 2019 14:27:38 +0100 Subject: Use ES6 modules for gettext extractor --- .eslintrc.yml | 4 ++ .../javascripts/locale/ensure_single_line.js | 25 -------- .../javascripts/locale/ensure_single_line.mjs | 25 ++++++++ app/assets/javascripts/locale/index.js | 2 +- config/initializers/gettext_rails_i18n_patch.rb | 2 +- scripts/frontend/extract_gettext_all.js | 72 --------------------- scripts/frontend/extract_gettext_all.mjs | 74 ++++++++++++++++++++++ spec/javascripts/locale/ensure_single_line_spec.js | 2 +- 8 files changed, 106 insertions(+), 100 deletions(-) delete mode 100644 app/assets/javascripts/locale/ensure_single_line.js create mode 100644 app/assets/javascripts/locale/ensure_single_line.mjs delete mode 100644 scripts/frontend/extract_gettext_all.js create mode 100644 scripts/frontend/extract_gettext_all.mjs diff --git a/.eslintrc.yml b/.eslintrc.yml index b0794bb7434..8d1e3956d0e 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -34,3 +34,7 @@ rules: vue/no-use-v-if-with-v-for: off vue/no-v-html: off vue/use-v-on-exact: off + import/extensions: + - error + - ignorePackages + - js: never diff --git a/app/assets/javascripts/locale/ensure_single_line.js b/app/assets/javascripts/locale/ensure_single_line.js deleted file mode 100644 index 47c52fe6c50..00000000000 --- a/app/assets/javascripts/locale/ensure_single_line.js +++ /dev/null @@ -1,25 +0,0 @@ -/* eslint-disable import/no-commonjs */ - -const SPLIT_REGEX = /\s*[\r\n]+\s*/; - -/** - * - * strips newlines from strings and replaces them with a single space - * - * @example - * - * ensureSingleLine('foo \n bar') === 'foo bar' - * - * @param {String} str - * @returns {String} - */ -module.exports = function ensureSingleLine(str) { - // This guard makes the function significantly faster - if (str.includes('\n') || str.includes('\r')) { - return str - .split(SPLIT_REGEX) - .filter(s => s !== '') - .join(' '); - } - return str; -}; diff --git a/app/assets/javascripts/locale/ensure_single_line.mjs b/app/assets/javascripts/locale/ensure_single_line.mjs new file mode 100644 index 00000000000..01e3e6d7987 --- /dev/null +++ b/app/assets/javascripts/locale/ensure_single_line.mjs @@ -0,0 +1,25 @@ +/* eslint-disable import/no-commonjs */ + +const SPLIT_REGEX = /\s*[\r\n]+\s*/; + +/** + * + * strips newlines from strings and replaces them with a single space + * + * @example + * + * ensureSingleLine('foo \n bar') === 'foo bar' + * + * @param {String} str + * @returns {String} + */ +export default function ensureSingleLine(str) { + // This guard makes the function significantly faster + if (str.includes('\n') || str.includes('\r')) { + return str + .split(SPLIT_REGEX) + .filter(s => s !== '') + .join(' '); + } + return str; +} diff --git a/app/assets/javascripts/locale/index.js b/app/assets/javascripts/locale/index.js index 1ae3362c4bc..7e4efce6785 100644 --- a/app/assets/javascripts/locale/index.js +++ b/app/assets/javascripts/locale/index.js @@ -1,5 +1,5 @@ import Jed from 'jed'; -import ensureSingleLine from './ensure_single_line'; +import ensureSingleLine from './ensure_single_line.mjs'; import sprintf from './sprintf'; const languageCode = () => document.querySelector('html').getAttribute('lang') || 'en'; diff --git a/config/initializers/gettext_rails_i18n_patch.rb b/config/initializers/gettext_rails_i18n_patch.rb index c1342f48ebd..b9e7f207cc9 100644 --- a/config/initializers/gettext_rails_i18n_patch.rb +++ b/config/initializers/gettext_rails_i18n_patch.rb @@ -49,7 +49,7 @@ module GettextI18nRailsJs end def load_messages - `node scripts/frontend/extract_gettext_all.js --all` + `node --experimental-modules scripts/frontend/extract_gettext_all.mjs --all` end end end diff --git a/scripts/frontend/extract_gettext_all.js b/scripts/frontend/extract_gettext_all.js deleted file mode 100644 index 725522a3540..00000000000 --- a/scripts/frontend/extract_gettext_all.js +++ /dev/null @@ -1,72 +0,0 @@ -const argumentsParser = require('commander'); - -const { GettextExtractor, JsExtractors } = require('gettext-extractor'); -const { - decorateJSParserWithVueSupport, - decorateExtractorWithHelpers, -} = require('gettext-extractor-vue'); -const ensureSingleLine = require('../../app/assets/javascripts/locale/ensure_single_line.js'); - -const args = argumentsParser - .option('-f, --file ', 'Extract message from one single file') - .option('-a, --all', 'Extract message from all js/vue files') - .parse(process.argv); - -const extractor = decorateExtractorWithHelpers(new GettextExtractor()); - -extractor.addMessageTransformFunction(ensureSingleLine); - -const jsParser = extractor.createJsParser([ - // Place all the possible expressions to extract here: - JsExtractors.callExpression('__', { - arguments: { - text: 0, - }, - }), - JsExtractors.callExpression('n__', { - arguments: { - text: 0, - textPlural: 1, - }, - }), - JsExtractors.callExpression('s__', { - arguments: { - text: 0, - }, - }), -]); - -const vueParser = decorateJSParserWithVueSupport(jsParser); - -function printJson() { - const messages = extractor.getMessages().reduce((result, message) => { - let text = message.text; - if (message.textPlural) { - text += `\u0000${message.textPlural}`; - } - - message.references.forEach(reference => { - const filename = reference.replace(/:\d+$/, ''); - - if (!Array.isArray(result[filename])) { - result[filename] = []; - } - - result[filename].push([text, reference]); - }); - - return result; - }, {}); - - console.log(JSON.stringify(messages)); -} - -if (args.file) { - vueParser.parseFile(args.file).then(() => printJson()); -} else if (args.all) { - vueParser.parseFilesGlob('{ee/app,app}/assets/javascripts/**/*.{js,vue}').then(() => printJson()); -} else { - console.warn('ERROR: Please use the script correctly:'); - args.outputHelp(); - process.exit(1); -} diff --git a/scripts/frontend/extract_gettext_all.mjs b/scripts/frontend/extract_gettext_all.mjs new file mode 100644 index 00000000000..3687b11c2fa --- /dev/null +++ b/scripts/frontend/extract_gettext_all.mjs @@ -0,0 +1,74 @@ +import argumentsParser from 'commander'; + +import GE from 'gettext-extractor'; +const { GettextExtractor, JsExtractors } = GE; + +import GettextExtractorVue from 'gettext-extractor-vue'; + +const { decorateExtractorWithHelpers, decorateJSParserWithVueSupport } = GettextExtractorVue; + +import ensureSingleLine from '../../app/assets/javascripts/locale/ensure_single_line.mjs'; + +const args = argumentsParser + .option('-f, --file ', 'Extract message from one single file') + .option('-a, --all', 'Extract message from all js/vue files') + .parse(process.argv); + +const extractor = decorateExtractorWithHelpers(new GettextExtractor()); + +extractor.addMessageTransformFunction(ensureSingleLine); + +const jsParser = extractor.createJsParser([ + // Place all the possible expressions to extract here: + JsExtractors.callExpression('__', { + arguments: { + text: 0, + }, + }), + JsExtractors.callExpression('n__', { + arguments: { + text: 0, + textPlural: 1, + }, + }), + JsExtractors.callExpression('s__', { + arguments: { + text: 0, + }, + }), +]); + +const vueParser = decorateJSParserWithVueSupport(jsParser); + +function printJson() { + const messages = extractor.getMessages().reduce((result, message) => { + let text = message.text; + if (message.textPlural) { + text += `\u0000${message.textPlural}`; + } + + message.references.forEach(reference => { + const filename = reference.replace(/:\d+$/, ''); + + if (!Array.isArray(result[filename])) { + result[filename] = []; + } + + result[filename].push([text, reference]); + }); + + return result; + }, {}); + + console.log(JSON.stringify(messages)); +} + +if (args.file) { + vueParser.parseFile(args.file).then(() => printJson()); +} else if (args.all) { + vueParser.parseFilesGlob('{ee/app,app}/assets/javascripts/**/*.{js,vue}').then(() => printJson()); +} else { + console.warn('ERROR: Please use the script correctly:'); + args.outputHelp(); + process.exit(1); +} diff --git a/spec/javascripts/locale/ensure_single_line_spec.js b/spec/javascripts/locale/ensure_single_line_spec.js index 20b04cab9c8..26fa118995f 100644 --- a/spec/javascripts/locale/ensure_single_line_spec.js +++ b/spec/javascripts/locale/ensure_single_line_spec.js @@ -1,4 +1,4 @@ -import ensureSingleLine from '~/locale/ensure_single_line'; +import ensureSingleLine from '~/locale/ensure_single_line.mjs'; describe('locale', () => { describe('ensureSingleLine', () => { -- cgit v1.2.1