index.js

import LANGUAGES_LIST from './data';

/**
 * @module ISO6391JP
 * @example
 * const ISO6391JP = require('iso-639-1-jp');
 */
export default class ISO6391JP {
  /**
   * 入力したisoコードの日本語名、ネイティブ表記、isoコードを配列で返す
   * @param {Array} codes isoコードを配列で渡す
   * @return {Array} 配列で渡された各isoコードの情報オブジェクトを配列に格納して返す
   * @example
   * console.log(ISO6391JP.getLanguages(['en', 'zh']))
   * // [{code:'en',name:'英語',nativeName:'English'},{code:'zh',name:'中国語',nativeName:'中文'}]
   */
  static getLanguages(codes = []) {
    return codes.map((code) => ({
      code,
      name: ISO6391JP.getName(code),
      nativeName: ISO6391JP.getNativeName(code),
    }));
  }

  /**
   * 引数に入力したisoコードの日本語名を返す
   * @param {string} code isoコードを文字列で渡す
   * @return {string} 引数で渡されたisoコードの日本語名を文字列で返す
   * @example
   * console.log(ISO6391JP.getName('zh')) // '中国語'
   */
  static getName(code) {
    return ISO6391JP.validate(code) ? LANGUAGES_LIST[code].name : '';
  }

  /**
   * 全てのisoコードの日本語名を返す
   * @return {Array} isoコードのアルファベット順に日本語名を配列で返す
   * @example
   * console.log(ISO6391JP.getAllNames()) // ['アファル語','アブハズ語', ... ,'ズールー語']
   */
  static getAllNames() {
    return Object.values(LANGUAGES_LIST).map((l) => l.name);
  }

  /**
   * 引数に入力したisoコードの名称をネイティブの言語で返す
   * @param {string} code isoコードを文字列で渡す
   * @return {string} 引数で渡されたisoコードをネイティブ表記の文字列で返す
   * @example
   * console.log(ISO6391JP.getNativeName('zh')) // '中文'
   */
  static getNativeName(code) {
    return ISO6391JP.validate(code) ? LANGUAGES_LIST[code].nativeName : '';
  }

  /**
   * 全てのisoコードのネイティブの名称を返す
   * @return {Array} isoコードのアルファベット順にネイティブ表記を配列で返す
   * @example
   * console.log(ISO6391JP.getAllNativeNames()) //['Afaraf','аҧсуа бызшәа', ... ,'isiZulu' ]
   */
  static getAllNativeNames() {
    return Object.values(LANGUAGES_LIST).map((l) => l.nativeName);
  }

  /**
   * 日本語、またはネイティブの言語で入力した言語名のisoコードを返す
   * @param {string} name 日本語名またはネイティブの言語名を文字列で渡す
   * @return {string} 引数で渡された言語のisoコードを文字列で返す
   * @example
   * console.log(ISO6391JP.getCode('中国語')) // 'zh'
   */
  static getCode(name) {
    const code = Object.keys(LANGUAGES_LIST).find((code) => {
      const language = LANGUAGES_LIST[code];

      return (
        language.name.toLowerCase() === name.toLowerCase() ||
        language.nativeName.toLowerCase() === name.toLowerCase()
      );
    });
    return code || '';
  }

  /**
   * 全てのisoコードを配列で返す
   * @return {Array} isoコードをアルファベット順に配列で返す
   * @example
   * console.log(ISO6391JP.getAllCodes()) //['aa','ab',...,'zu']
   */
  static getAllCodes() {
    return Object.keys(LANGUAGES_LIST);
  }

  /**
   * 入力したコードが[ISO-639-1]{@link https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes}に含まれているかの真偽値を返す
   * @param {string} code isoコードを文字列で渡す
   * @return {boolean} 引数で渡されたisoコードが存在すればtrue, 存在しなければfalseを返す
   * @example
   * console.log(ISO6391JP.validate('en')) // true
   * console.log(ISO6391JP.validate('xx')) // false
   */
  static validate(code) {
    return LANGUAGES_LIST.hasOwnProperty(code);
  }
}