about summary refs log tree commit diff
diff options
context:
space:
mode:
authorKoala Yeung <koalay@gmail.com>2017-05-06 23:05:13 +0800
committerEugen Rochko <eugen@zeonfederated.com>2017-05-06 17:05:13 +0200
commit99b9a0e5dea08d15a316f2556c2d6503b29e5d78 (patch)
tree41335afe9d593920ee163211b53b222e17c642a7
parentaa235318fc2c3456e4423fe77a0962f74397014e (diff)
translateionRunner: improve minimalist options (#2835)
* translateionRunner: improve minimalist options

* Properly added flags.
* Added alias: -h, -f

* translationRunner: improve logic and flow

* Show all error messages instead of validate availability / name
  format separately.

* translationRunner: check messageDirectory existance

* translationRunner: changed throw string to Error

* translationRunner: use short cut for boolean
-rw-r--r--config/webpack/translationRunner.js134
1 files changed, 84 insertions, 50 deletions
diff --git a/config/webpack/translationRunner.js b/config/webpack/translationRunner.js
index 937c2edd0..ed80ae2bf 100644
--- a/config/webpack/translationRunner.js
+++ b/config/webpack/translationRunner.js
@@ -1,20 +1,49 @@
 /*eslint no-console: "off"*/
 const manageTranslations = require('react-intl-translations-manager').default;
-const argv = require('minimist')(process.argv.slice(2));
 const fs = require('fs');
 
-const translationsDirectory = 'app/javascript/mastodon/locales';
-const localeFn = /^([a-z]{2,3}(|\-[A-Z]+))\.json$/;
-const reRFC5646 = /^[a-z]{2,3}(|\-[A-Z]+)$/;
-const availableLanguages = fs.readdirSync(`${process.cwd()}/${translationsDirectory}`).reduce((acc, fn) => {
-  if (fn.match(localeFn)) {
-    acc.push(fn.replace(localeFn, '$1'));
+const testRFC5626 = function (reRFC5646) {
+  return function (language) {
+    if (!language.match(reRFC5646)) {
+      throw new Error('Not RFC5626 name');
+    }
   }
-  return acc;
-}, []);
+}
 
-// print help message
-if (argv.help !== undefined) {
+const testAvailability = function (availableLanguages) {
+  return function (language) {
+    if ((argv.force !== true) && availableLanguages.indexOf(language) < 0) {
+      throw new Error('Not an available language');
+    }
+  }
+}
+
+const validateLanguages = function (languages, validators) {
+  let invalidLanguages = languages.reduce((acc, language) => {
+    try {
+      for (let validator of validators) {
+        validator(language);
+      }
+    } catch (error) {
+      acc.push({
+        language,
+        error,
+      });
+    }
+    return acc;
+  }, []);
+
+  if (invalidLanguages.length > 0) {
+    console.log(`\nError: Specified invalid LANGUAGES:`);
+    for (let {language, error} of invalidLanguages) {
+      console.error(`* ${language}: ${error}`);
+    }
+    console.log(`\nUse yarn "manage:translations -- --help" for usage information\n`);
+    process.exit(1);
+  }
+}
+
+const printHelpMessages = function () {
   console.log(
 `Usage: yarn manage:translations -- [OPTIONS] [LANGUAGES]
 
@@ -22,9 +51,9 @@ Manage javascript translation files in mastodon. Generates and update
 translations in translationsDirectory: ${translationsDirectory}
 
 OPTIONS
-  --help    show this message
-  --force   force using the provided languages. create files if not exists.
-            default: false
+  -h,--help    show this message
+  -f,--force   force using the provided languages. create files if not exists.
+               default: false
 
 LANGUAGES
 The RFC5646 language tag for the language you want to test or fix. If you want
@@ -33,50 +62,55 @@ to input multiple languages, separate them with space.
 Available languages:
 ${availableLanguages}
 `);
+}
+
+// parse arguments
+const argv = require('minimist')(process.argv.slice(2), {
+  'boolean': [
+    'force',
+    'help'
+  ],
+  'alias': {
+    'f': 'force',
+    'h': 'help',
+  },
+});
+const translationsDirectory = 'app/javascript/mastodon/locales';
+const messagesDirectory = 'build/messages';
+const localeFn = /^([a-z]{2,3}(|\-[A-Z]+))\.json$/;
+const reRFC5646 = /^[a-z]{2,3}(|\-[A-Z]+)$/;
+const availableLanguages = fs.readdirSync(`${process.cwd()}/${translationsDirectory}`).reduce((acc, fn) => {
+  if (fn.match(localeFn)) {
+    acc.push(fn.replace(localeFn, '$1'));
+  }
+  return acc;
+}, []);
+
+// print help message
+if (argv.help) {
+  printHelpMessages();
   process.exit(0);
 }
 
+// check if message directory exists
+if (!fs.existsSync(`${process.cwd()}/${messagesDirectory}`)) {
+  console.error(`\nError: messageDirectory not exists\n(${process.cwd()}/${messagesDirectory})\n`);
+  console.error(`Try to run "yarn build:development" first`);
+  process.exit(1);
+}
+
 // determine the languages list
 const languages = (argv._.length === 0) ? availableLanguages : argv._;
 
-// check if the languages provided are RFC5626 compliant
-(function() {
-  let invalidLanguages = languages.reduce((acc, language) => {
-    if (!language.match(reRFC5646)) {
-      acc.push(language);
-    }
-    return acc;
-  }, []);
-  if (invalidLanguages.length > 0) {
-    console.log(`Error:`);
-    for (let language of invalidLanguages) {
-      console.error(`* Not RFC5626 name: ${language}`);
-    }
-    console.log(`\nUse yarn "manage:translations -- --help" for usage information\n`);
-    process.exit(1);
-  }
-})();
-
-// make sure the language exists. Unless force to create locale file.
-if (argv.force !== true) {
-  let invalidLanguages = languages.reduce((acc, language) => {
-    if (availableLanguages.indexOf(language) < 0) {
-      acc.push(language);
-    }
-    return acc;
-  }, []);
-  if (invalidLanguages.length > 0) {
-    console.log(`Error:`);
-    for (let language of invalidLanguages) {
-      console.error(`* Language not available: ${language}`);
-    }
-    console.log(`\nIf you want to force creating the language(s) above, please add the --force option.\n`);
-    process.exit(1);
-  }
-}
+// validate languages
+validateLanguages(languages, [
+  testRFC5626(reRFC5646),
+  testAvailability(availableLanguages),
+]);
 
+// manage translations
 manageTranslations({
-  messagesDirectory: 'build/messages',
+  messagesDirectory,
   translationsDirectory,
   detectDuplicateIds: false,
   singleMessagesFile: true,