From edb5197ab0181164b385bccf449843c689b225cc Mon Sep 17 00:00:00 2001 From: Sergey Bystrov Date: Tue, 26 Jan 2021 19:24:08 +0300 Subject: [PATCH 01/12] Added declension support for numbers --- .gitignore | 1 + src/defaultOptions.ts | 2 + src/dev/test.dev.ts | 6 + src/functions/combineResultData.ts | 8 +- src/functions/convertsEachScaleToWords.ts | 65 +++++---- src/textValues.ts | 124 ++++++++++++++---- .../interfaces/ConvertInterfaces.ts | 3 + src/units/declensions.ts | 22 ++++ src/units/functions/addIntegerNamesForms.ts | 17 --- src/units/functions/getFractionalNameForms.ts | 5 +- src/units/functions/getSlashNumberUnitName.ts | 5 +- src/units/functions/getUnitName.ts | 42 ++++++ src/units/genders.ts | 16 +++ src/units/integer.ts | 15 --- src/units/unitNames.ts | 3 + 15 files changed, 247 insertions(+), 87 deletions(-) create mode 100644 src/units/declensions.ts delete mode 100644 src/units/functions/addIntegerNamesForms.ts create mode 100644 src/units/functions/getUnitName.ts create mode 100644 src/units/genders.ts delete mode 100644 src/units/integer.ts diff --git a/.gitignore b/.gitignore index 8225baa..af5c3ba 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ /node_modules /dist +.idea diff --git a/src/defaultOptions.ts b/src/defaultOptions.ts index b907fc5..cadef62 100644 --- a/src/defaultOptions.ts +++ b/src/defaultOptions.ts @@ -1,4 +1,5 @@ import {ConvertOptions} from 'typeScript/interfaces/ConvertInterfaces'; +import declensions from "./units/declensions"; const defaultOptions: ConvertOptions = { /* currency - Название валюты ('rub', 'usd', 'eur') @@ -19,6 +20,7 @@ const defaultOptions: ConvertOptions = { integer: true, fractional: true, }, + declension: declensions.NOMINATIVE }; export default defaultOptions; diff --git a/src/dev/test.dev.ts b/src/dev/test.dev.ts index 37c21a6..a21541e 100644 --- a/src/dev/test.dev.ts +++ b/src/dev/test.dev.ts @@ -1,4 +1,5 @@ import numberToWordsRu from 'index'; +import declensions from "../units/declensions"; console.log('numberToWordsRu :>> ', numberToWordsRu.convert('-2564,6565', { currency: 'number', @@ -6,4 +7,9 @@ console.log('numberToWordsRu :>> ', numberToWordsRu.convert('-2564,6565', { integer: true, fractional: true, }, + showCurrency: { + integer: true, + fractional: true + }, + declension: declensions.NOMINATIVE })); diff --git a/src/functions/combineResultData.ts b/src/functions/combineResultData.ts index 5b0b9e6..96392d5 100644 --- a/src/functions/combineResultData.ts +++ b/src/functions/combineResultData.ts @@ -51,12 +51,13 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str convertedNumberArr[1] = convertsEachScaleToWords( numberToScales(modifiedNumberArray[1]), currencyObject.currencyNounGender.integer, + options.declension ).result; } else { // Если раделитель - дробная черта // Род числа всегда женский ('одна', 'две') convertedNumberArr[1] = - convertsEachScaleToWords(numberToScales(modifiedNumberArray[1]), 1).result; + convertsEachScaleToWords(numberToScales(modifiedNumberArray[1]), 1, options.declension).result; } } // Если нужно отображать валюту числа @@ -67,6 +68,7 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str convertsEachScaleToWords( numberToScales(modifiedNumberArray[1]), currencyObject.currencyNounGender.integer, + options.declension ).unitNameForm ]; } @@ -84,6 +86,7 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str convertsEachScaleToWords( numberToScales(modifiedNumberArray[1]), currencyObject.currencyNounGender.integer, + options.declension ).unitNameForm, ); } else { @@ -91,6 +94,7 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str convertedNumberArr[3] = convertsEachScaleToWords( numberToScales(modifiedNumberArray[3]), currencyObject.currencyNounGender.fractionalPart, + options.declension ).result; } } else { @@ -116,6 +120,7 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str convertsEachScaleToWords( numberToScales(modifiedNumberArray[3]), currencyObject.currencyNounGender.fractionalPart, + options.declension ).unitNameForm ]; } @@ -129,6 +134,7 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str convertsEachScaleToWords(numberToScales( modifiedNumberArray[3]), currencyObject.currencyNounGender.fractionalPart, + options.declension ).unitNameForm ]; } diff --git a/src/functions/convertsEachScaleToWords.ts b/src/functions/convertsEachScaleToWords.ts index 0c81453..f58e17e 100644 --- a/src/functions/convertsEachScaleToWords.ts +++ b/src/functions/convertsEachScaleToWords.ts @@ -1,13 +1,23 @@ -import textValues from 'textValues'; +import textValues, {DeclensionNumberNames, numberNames} from 'textValues'; import {ConvertedScalesToWords} from 'typeScript/interfaces/ConvertedScalesToWords'; +import genders, {Gender} from "../units/genders"; +import {Declension, declensions} from "../units/declensions"; +import getUnitName from "../units/functions/getUnitName"; + +const convertDigitToWord = (digit: number, values: DeclensionNumberNames, declension: Declension, gender: Gender) => { + const declensionValues = values[declension]; + const word = declensionValues[digit]; + return "object" === typeof word ? word[gender] : word; +}; /** * Конвертировать массив числа в текст. * @param {Array} numberScaleArr - Массив числа. * @param {number} currencyNounGender - Род валюты. + * @param {Declension} declension - Падеж. * @return {Object} Конвертированный результат и падеж для валюты. */ -const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = 0): ConvertedScalesToWords => { +const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = 0, declension: Declension = declensions.NOMINATIVE): ConvertedScalesToWords => { let convertedResult = ''; let unitNameForm; // Падеж названия единиц измерения // Для каждого класса числа @@ -30,35 +40,36 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = ) { return; } + // Определить род числа + // если тысячный разряд - то женский + // если единичный разряд - берем из валюты + // иначе - мужской + let gender: Gender = genders.MALE; + if (currentNumberScale === 2) { + // Если текущий класс - тысячные + gender = genders.FEMALE; + } else if (currentNumberScale === 1) { + // Если текущий класс - единицы + if (currencyNounGender === 1) { + // Если у валюты указан женский род (напр. копейка) + gender = genders.FEMALE; + } else if (currencyNounGender === 2) { + // Если у валюты указан средний род + gender = genders.NEUTER; + } + } + // Определить сотни - digit1text = textValues.numberNames[4][digit1]; + digit1text = convertDigitToWord(digit1, numberNames.hundreds, declension, gender); // Определить десятки и единицы // Если в разряде десятков стоит "1" if (digit2 === 1) { - digit2text = textValues.tensNames[digit3]; + digit2text = convertDigitToWord(digit3, numberNames.tenToNineteen, declension, gender); // Если в раздяде десятков стоит не "1" } else { - digit2text = textValues.numberNames[3][digit2]; - digit3text = textValues.numberNames[0][digit3]; - // Определить РОД названия единиц (один/одна, два/две, одно/два) - // Если текущий класс - тысячные - if (currentNumberScale === 2) { - // Поменять род названия единиц (один -> одна, два -> две) - digit3text = textValues.numberNames[1][digit3]; - } - // Если текущий класс - единицы - if (currentNumberScale === 1) { - // Если у валюты указан женский род (напр. копейка) - if (currencyNounGender === 1) { - // Поменять род названия единиц (один -> одна, два -> две) - digit3text = textValues.numberNames[1][digit3]; - } - // Если у валюты указан средний род - if (currencyNounGender === 2) { - // Поменять род названия единиц (один -> одно, два -> два) - digit3text = textValues.numberNames[2][digit3]; - } - } + digit2text = convertDigitToWord(digit2, numberNames.tens, declension, gender); + digit3text = convertDigitToWord(digit3, numberNames.numbers, declension, gender); + // Определить ПАДЕЖ названия единиц измерения (рубль/рубля/рублей) // Если цифра в разряде единиц от 1 до 4 if (digit3 >= 1 && digit3 <= 4) { @@ -74,7 +85,9 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = } } // Указать падеж для названия класса единиц - const unitName = textValues.integerUnits[currentNumberScale - 1][unitNameForm]; + let unitDeclension = (((digit3 >= 5 && digit3 <= 9) || digit2 === 1 || digit3 ===0) && declension === declensions.NOMINATIVE) ? declensions.GENITIVE : declension + let isPlural = !(digit3 === 1 && digit2 !== 1); + let unitName = getUnitName(currentNumberScale - 1, unitDeclension, isPlural); // Убрать ненужный "ноль" if (digit3 === 0 && (digit1 > 0 || digit2 > 0)) { digit3text = ''; diff --git a/src/textValues.ts b/src/textValues.ts index ac84b4f..58df04b 100644 --- a/src/textValues.ts +++ b/src/textValues.ts @@ -1,45 +1,121 @@ -import integerUnits from 'units/integer'; +import genders from 'units/genders'; import slashNumberForms from 'units/slashNumberForms'; import getFractionalNameForms from 'units/functions/getFractionalNameForms'; import getSlashNumberUnitName from 'units/functions/getSlashNumberUnitName'; import {stringCurrencies} from 'units/stringCurrencies'; import {CurrencyStringValues} from 'typeScript/interfaces/CurrencyStringValues'; import {SlashNumberForms} from 'typeScript/interfaces/SlashNumberForms'; +import {declensions} from "./units/declensions"; + +type DeclensionNumberName = string | { + [key: string]: string +} + +export interface DeclensionNumberNames { + [key: string]: [ + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName, + DeclensionNumberName]; +} + +interface NumberNames { + numbers: DeclensionNumberNames, + tenToNineteen: DeclensionNumberNames, + tens: DeclensionNumberNames, + hundreds: DeclensionNumberNames +} interface TextValues { minus: string, - numberNames: string[][], - tensNames: string[], - integerUnits: string[][], + numberNames: NumberNames, slashNumberUnits: SlashNumberForms, currency: CurrencyStringValues, getFractionalUnits: Function, getSlashNumberUnitsNames: Function, } +// Правила взяты отсюда http://www.fio.ru/pravila/grammatika/sklonenie-imen-chislitelnykh/ +export const numberNames: NumberNames = { + numbers: { + [declensions.NOMINATIVE]: ['ноль', + { + [genders.MALE]: 'один', + [genders.NEUTER]: 'одно', + [genders.FEMALE]: 'одна', + }, + { + [genders.MALE]:'два', + [genders.NEUTER]:'два', + [genders.FEMALE]:'две', + }, 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], + [declensions.GENITIVE]: ['ноль', + { + [genders.MALE]: 'одного', + [genders.NEUTER]: 'одного', + [genders.FEMALE]: 'одной', + }, 'двух', 'трех', 'четырех', 'пяти', 'шести', 'семи', 'восьми', 'девяти'], + [declensions.DATIVE]: ['нолю', + { + [genders.MALE]: 'одному', + [genders.NEUTER]: 'одному', + [genders.FEMALE]: 'одной', + }, 'двум', 'трем', 'четырем', 'пяти', 'шести', 'семи', 'восьми', 'девяти'], + [declensions.ACCUSATIVE]: ['ноль', + { + [genders.MALE]: 'один', + [genders.NEUTER]: 'одного', + [genders.FEMALE]: 'одну', + }, 'двух', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], + [declensions.INSTRUMENTAL]: ['нолем', + { + [genders.MALE]: 'одним', + [genders.NEUTER]: 'одним', + [genders.FEMALE]: 'одной', + }, 'двумя', 'тремя', 'четырьмя', 'пятью', 'шестью', 'семью', 'восемью', 'девятью'], + [declensions.PREPOSITIONAL]: ['ноле', + { + [genders.MALE]: 'одном', + [genders.NEUTER]: 'одном', + [genders.FEMALE]: 'одной', + }, 'двух', 'трех', 'четырех', 'пяти', 'шести', 'семи', 'восьми', 'девяти'], + }, + tenToNineteen: { + [declensions.NOMINATIVE]: ['десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'], + [declensions.GENITIVE]: ['десяти', 'одиннадцати', 'двенадцати', 'тринадцати', 'четырнадцати', 'пятнадцати', 'шестнадцати', 'семнадцати', 'восемнадцати', 'девятнадцати'], + [declensions.DATIVE]: ['десяти', 'одиннадцати', 'двенадцати', 'тринадцати', 'четырнадцати', 'пятнадцати', 'шестнадцати', 'семнадцати', 'восемнадцати', 'девятнадцати'], + [declensions.ACCUSATIVE]: ['десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'], + [declensions.INSTRUMENTAL]: ['десятью', 'одиннадцатью', 'двенадцатью', 'тринадцатью', 'четырнадцатью', 'пятнадцатью', 'шестнадцатью', 'семнадцатью', 'восемнадцатью', 'девятнадцатью'], + [declensions.PREPOSITIONAL]: ['десяти', 'одиннадцати', 'двенадцати', 'тринадцати', 'четырнадцати', 'пятнадцати', 'шестнадцати', 'семнадцати', 'восемнадцати', 'девятнадцати'], + }, + tens: { + [declensions.NOMINATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], + [declensions.GENITIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятьдесяти', 'шестьдесяти', 'семьдесяти', 'восемьдесяти', 'девяноста'], + [declensions.DATIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятьдесяти', 'шестьдесяти', 'семьдесяти', 'восемьдесяти', 'девяноста'], + [declensions.ACCUSATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], + [declensions.INSTRUMENTAL]: ['', '', 'двадцатью', 'тридцатью', 'сорока', 'пятьдесятью', 'шестьдесятью', 'семьдесятью', 'восемьдесятью', 'девяноста'], + [declensions.PREPOSITIONAL]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятьдесяти', 'шестьдесяти', 'семьдесяти', 'восемьдесяти', 'девяноста'], + }, + hundreds: { + [declensions.NOMINATIVE]: ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'], + [declensions.GENITIVE]: ['', 'ста', 'двухсот', 'трехсот', 'четырехсот', 'пятисот', 'шестисот', 'семисот', 'восемисот', 'девятисот'], + [declensions.DATIVE]: ['', 'ста', 'двумстам', 'тремстам', 'четыремстам', 'пятистам', 'шестистам', 'семистам', 'восемистам', 'девятистам'], + [declensions.ACCUSATIVE]: ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'], + [declensions.INSTRUMENTAL]: ['', 'ста', 'двумястами', 'тремястами', 'четырьмястами', 'пятьюстами', 'шестьюстами', 'семьюстами', 'восемьюстами', 'девятьюстами'], + [declensions.PREPOSITIONAL]: ['', 'ста', 'двухстах', 'трехстах', 'четырехстах', 'пятистах', 'шестистах', 'семистах', 'восемистах', 'девятистах'] + } +}; + const textValues: TextValues = { minus: 'минус', - numberNames: [ - ['ноль', 'один', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], - ['ноль', 'одна', 'две', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], - ['ноль', 'одно', 'два', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], - ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], - ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'], - ], - tensNames: [ - 'десять', - 'одиннадцать', - 'двенадцать', - 'тринадцать', - 'четырнадцать', - 'пятнадцать', - 'шестнадцать', - 'семнадцать', - 'восемнадцать', - 'девятнадцать', - ], - integerUnits: integerUnits, slashNumberUnits: slashNumberForms, + numberNames, currency: stringCurrencies, getFractionalUnits: getFractionalNameForms, getSlashNumberUnitsNames: getSlashNumberUnitName, diff --git a/src/typeScript/interfaces/ConvertInterfaces.ts b/src/typeScript/interfaces/ConvertInterfaces.ts index 8f4b150..a00a7a7 100644 --- a/src/typeScript/interfaces/ConvertInterfaces.ts +++ b/src/typeScript/interfaces/ConvertInterfaces.ts @@ -1,3 +1,5 @@ +import {Declension} from "../../units/declensions"; + export interface CurrencySettings { /** * Integer currency name forms\ @@ -56,4 +58,5 @@ export interface ConvertOptions { integer?: boolean; fractional?: boolean; }, + declension?: Declension } diff --git a/src/units/declensions.ts b/src/units/declensions.ts new file mode 100644 index 0000000..557a3ef --- /dev/null +++ b/src/units/declensions.ts @@ -0,0 +1,22 @@ +export type Declension = + | 'nominative' + | 'genitive' + | 'dative' + | 'accusative' + | 'instrumental' + | 'prepositional' + +export interface Declensions { + [key: string]: Declension, +} + +export const declensions: Declensions = { + NOMINATIVE: 'nominative', // именительный + GENITIVE: 'genitive', // родительный + DATIVE: 'dative', // дательный + ACCUSATIVE: 'accusative', // винительный + INSTRUMENTAL: 'instrumental', // творительный + PREPOSITIONAL: 'prepositional' // предложный +}; + +export default declensions; diff --git a/src/units/functions/addIntegerNamesForms.ts b/src/units/functions/addIntegerNamesForms.ts deleted file mode 100644 index 870168a..0000000 --- a/src/units/functions/addIntegerNamesForms.ts +++ /dev/null @@ -1,17 +0,0 @@ -import unitNames from 'units/unitNames'; - -const integerWordEndings = ['', 'а', 'ов']; - -/** - * Добавить падежи к каждому классу числа. - * @return {Array} Падежи для каждого класса числа. [['квадриллион', 'квадриллиона', 'квадриллионов'], ...]. - */ -const addIntegerNamesForms = (): string[][] => { - return unitNames.map((unitName) => { - return integerWordEndings.map((wordEnding) => { - return unitName + wordEnding; - }); - }); -}; - -export default addIntegerNamesForms; diff --git a/src/units/functions/getFractionalNameForms.ts b/src/units/functions/getFractionalNameForms.ts index 03a2a92..ae5f291 100644 --- a/src/units/functions/getFractionalNameForms.ts +++ b/src/units/functions/getFractionalNameForms.ts @@ -1,9 +1,10 @@ -import integer from 'units/integer'; import { fractional, fractionalWordEndings, fractionalWordPrefixes, } from 'units/fractional'; +import getUnitName from "units/functions/getUnitName"; +import declensions from "../declensions"; /** * Получить падежи дробной части числа. @@ -32,7 +33,7 @@ const getFractionalNameForms = (index: number): string[] => { // Сгенерировать массив result = fractionalWordEndings.map((ending) => { return fractionalWordPrefixes[classScaleIndex] - + integer[classIndex][0] + + getUnitName(classIndex, declensions.NOMINATIVE, false) + ending; }); } diff --git a/src/units/functions/getSlashNumberUnitName.ts b/src/units/functions/getSlashNumberUnitName.ts index ed60855..89e1405 100644 --- a/src/units/functions/getSlashNumberUnitName.ts +++ b/src/units/functions/getSlashNumberUnitName.ts @@ -1,4 +1,5 @@ -import integer from 'units/integer'; +import declensions from "../declensions"; +import getUnitName from "units/functions/getUnitName"; const slashNumberUnitsForms = [ ['', ''], @@ -27,7 +28,7 @@ const getSlashNumberUnitName = (scaleIndex = 2): string[] => { } else { // Добавить окончания return slashNumberUnitEndings.map((ending) => { - return integer[scaleIndex - 1][0] + ending; + return getUnitName(scaleIndex - 1, declensions.NOMINATIVE, false) + ending; }); } return result; diff --git a/src/units/functions/getUnitName.ts b/src/units/functions/getUnitName.ts new file mode 100644 index 0000000..181f9e5 --- /dev/null +++ b/src/units/functions/getUnitName.ts @@ -0,0 +1,42 @@ +import {Declension, declensions} from "../declensions"; +import unitNames from 'units/unitNames'; + +const integerWordEndings = { + [declensions.NOMINATIVE]: ['', 'а'], + [declensions.GENITIVE]: ['а', 'ов'], + [declensions.DATIVE]: ['у', 'ам'], + [declensions.ACCUSATIVE]: ['', 'ы'], + [declensions.INSTRUMENTAL]: ['ом', 'ами'], + [declensions.PREPOSITIONAL]: ['е', 'ах'], +}; + +type UnitName = { + [key: string]: [string, string]; +}; + +let thousandNames: UnitName = { + [declensions.NOMINATIVE]: ['тысяча', 'тысячи'], + [declensions.GENITIVE]: ['тысячи', 'тысяч'], + [declensions.DATIVE]: ['тысяче', 'тысячам'], + [declensions.ACCUSATIVE]: ['тысячу', 'тысячи'], + [declensions.INSTRUMENTAL]: ['тысячей', 'тысячами'], + [declensions.PREPOSITIONAL]: ['тысяче', 'тысячах'], +}; + +const getUnitName = (scale: number, declension: Declension, isPlural: boolean) => { + if (scale === 0) { + // Для единиц не отображаем названия + return '' + } else if (scale === 1) { + // Тысячи + return thousandNames[declension][isPlural ? 1 : 0]; + } + + // Миллионы и так далее + const ending = integerWordEndings[declension][isPlural ? 1 : 0]; + const base = unitNames[scale - 2]; + + return base ? base + ending : ''; +}; + +export default getUnitName; diff --git a/src/units/genders.ts b/src/units/genders.ts new file mode 100644 index 0000000..ca58462 --- /dev/null +++ b/src/units/genders.ts @@ -0,0 +1,16 @@ +export type Gender = + | 'MALE' + | 'FEMALE' + | 'NEUTER' + +export interface Genders { + [key: string]: Gender, +} + +const genders: Genders = { + MALE: 'MALE', + FEMALE: 'FEMALE', + NEUTER: 'NEUTER' +}; + +export default genders; diff --git a/src/units/integer.ts b/src/units/integer.ts deleted file mode 100644 index 055bd74..0000000 --- a/src/units/integer.ts +++ /dev/null @@ -1,15 +0,0 @@ -import addIntegerNamesForms from 'units/functions/addIntegerNamesForms'; - -export let integer = [ - ['', '', ''], - ['тысяча', 'тысячи', 'тысяч'], // [1, 2-4, 5-9] - ['миллион', 'миллиона', 'миллионов'], - ['миллиард', 'милиарда', 'миллиардов'], - ['триллион', 'триллиона', 'триллионов'], - // ... -]; - -// Дополнить массив "integer" всеми оставшимися значениями -integer = integer.concat(addIntegerNamesForms()); - -export default integer; diff --git a/src/units/unitNames.ts b/src/units/unitNames.ts index d1e0770..9acaeea 100644 --- a/src/units/unitNames.ts +++ b/src/units/unitNames.ts @@ -1,4 +1,7 @@ const unitNames = [ + 'миллион', + 'миллиард', + 'триллион', 'квадриллион', 'квинтиллион', 'секстиллион', From cb7845a6d763dfffb6c3797448cecfe6657dab52 Mon Sep 17 00:00:00 2001 From: Sergey Bystrov Date: Tue, 26 Jan 2021 22:57:33 +0300 Subject: [PATCH 02/12] Added declension support for currencies (rouble) --- src/dev/test.dev.ts | 4 +-- src/functions/combineResultData.ts | 36 ++++++++++++------- src/functions/convertsEachScaleToWords.ts | 18 ++++++++-- src/functions/getCurrencyObject.ts | 6 +++- .../interfaces/ConvertInterfaces.ts | 18 ++++++++++ .../interfaces/ConvertedScalesToWords.ts | 4 +++ src/units/stringCurrencies.ts | 17 +++++++++ 7 files changed, 84 insertions(+), 19 deletions(-) diff --git a/src/dev/test.dev.ts b/src/dev/test.dev.ts index a21541e..432110e 100644 --- a/src/dev/test.dev.ts +++ b/src/dev/test.dev.ts @@ -1,5 +1,4 @@ import numberToWordsRu from 'index'; -import declensions from "../units/declensions"; console.log('numberToWordsRu :>> ', numberToWordsRu.convert('-2564,6565', { currency: 'number', @@ -10,6 +9,5 @@ console.log('numberToWordsRu :>> ', numberToWordsRu.convert('-2564,6565', { showCurrency: { integer: true, fractional: true - }, - declension: declensions.NOMINATIVE + } })); diff --git a/src/functions/combineResultData.ts b/src/functions/combineResultData.ts index 96392d5..a4b3130 100644 --- a/src/functions/combineResultData.ts +++ b/src/functions/combineResultData.ts @@ -64,13 +64,19 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str if (options.showCurrency.integer === true) { // Если разделитель - не дробная черта if (modifiedNumberArray[2] !== '/') { - convertedNumberArr[2] = currencyObject.currencyNameCases[ - convertsEachScaleToWords( - numberToScales(modifiedNumberArray[1]), + const convertResult = convertsEachScaleToWords( + numberToScales(modifiedNumberArray[1]), currencyObject.currencyNounGender.integer, options.declension - ).unitNameForm - ]; + ); + + if (currencyObject.currencyNameDeclensions) { + // Если у валюты определены падежи + convertedNumberArr[2] = currencyObject.currencyNameDeclensions[convertResult.unitDeclension][convertResult.isPlural ? 1 : 0]; + } else { + // Если у валюты старая настройка (без падежей) + convertedNumberArr[2] = currencyObject.currencyNameCases[convertResult.unitNameForm]; + } } } } @@ -116,13 +122,19 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str if (options.showCurrency.fractional === true) { // Если валюта - не 'number' if (options.currency !== 'number') { - convertedNumberArr[4] = currencyObject.fractionalPartNameCases[ - convertsEachScaleToWords( - numberToScales(modifiedNumberArray[3]), - currencyObject.currencyNounGender.fractionalPart, - options.declension - ).unitNameForm - ]; + const convertResult = convertsEachScaleToWords( + numberToScales(modifiedNumberArray[3]), + currencyObject.currencyNounGender.fractionalPart, + options.declension + ); + + if (currencyObject.fractionalPartNameDeclensions) { + // Если у валюты определены падежи + convertedNumberArr[4] = currencyObject.fractionalPartNameDeclensions[convertResult.unitDeclension][convertResult.isPlural ? 1 : 0]; + } else { + // Если у валюты старая настройка (без падежей) + convertedNumberArr[4] = currencyObject.fractionalPartNameCases[convertResult.unitNameForm]; + } } // Если не указана валюта if (options.currency === 'number') { diff --git a/src/functions/convertsEachScaleToWords.ts b/src/functions/convertsEachScaleToWords.ts index f58e17e..eba5343 100644 --- a/src/functions/convertsEachScaleToWords.ts +++ b/src/functions/convertsEachScaleToWords.ts @@ -20,6 +20,9 @@ const convertDigitToWord = (digit: number, values: DeclensionNumberNames, declen const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = 0, declension: Declension = declensions.NOMINATIVE): ConvertedScalesToWords => { let convertedResult = ''; let unitNameForm; // Падеж названия единиц измерения + let unitDeclension = declension; // Падеж названия единиц измерения + let isPlural = false; // Множественность названия единиц измерения + // Для каждого класса числа numberScaleArr.forEach((numberScale, arrIndex) => { unitNameForm = 2; // Падеж названия единиц измерения по умолчанию (рублей) @@ -38,6 +41,10 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = && digit2 === 0 && digit3 === 0 ) { + // Не забываем указать падеж и число + unitDeclension = declension === declensions.NOMINATIVE ? declensions.GENITIVE : declension; + isPlural = true; + return; } // Определить род числа @@ -84,10 +91,12 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = } } } + // Указать падеж для названия класса единиц - let unitDeclension = (((digit3 >= 5 && digit3 <= 9) || digit2 === 1 || digit3 ===0) && declension === declensions.NOMINATIVE) ? declensions.GENITIVE : declension - let isPlural = !(digit3 === 1 && digit2 !== 1); - let unitName = getUnitName(currentNumberScale - 1, unitDeclension, isPlural); + unitDeclension = (((digit3 >= 5 && digit3 <= 9) || digit2 === 1 || digit3 ===0) && declension === declensions.NOMINATIVE) ? declensions.GENITIVE : declension + isPlural = !(digit3 === 1 && digit2 !== 1); + + const unitName = getUnitName(currentNumberScale - 1, unitDeclension, isPlural); // Убрать ненужный "ноль" if (digit3 === 0 && (digit1 > 0 || digit2 > 0)) { digit3text = ''; @@ -99,10 +108,13 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = // Добавить текущий разобранный класс к общему результату convertedResult += ` ${scaleResult}`; }); + // Вернуть полученный результат и форму падежа для валюты return { result: convertedResult.trim(), unitNameForm: unitNameForm, + unitDeclension, + isPlural }; }; diff --git a/src/functions/getCurrencyObject.ts b/src/functions/getCurrencyObject.ts index a711315..984dce1 100644 --- a/src/functions/getCurrencyObject.ts +++ b/src/functions/getCurrencyObject.ts @@ -33,10 +33,14 @@ const getCurrencyObject = (convertOptions?: ConvertOptions): CurrencySettings => const defaultCurrencyObject = textValues.currency[defaultCurrencyName]; // Обновить объект валюты новым объектом валюты const updatedCurrencyObject: CurrencySettings = updateObjectDeep(defaultCurrencyObject, convertOptions.currency); + // Удалить падежи + updatedCurrencyObject.currencyNameDeclensions = null; + updatedCurrencyObject.fractionalPartNameDeclensions = null; + // Если объект оформлен правильно if ( typeof updatedCurrencyObject === 'object' && - Object.keys(updatedCurrencyObject).length === 4 && + Object.keys(updatedCurrencyObject).length === 6 && updatedCurrencyObject.currencyNameCases.length === 3 && updatedCurrencyObject.fractionalPartNameCases.length === 3 && typeof updatedCurrencyObject.currencyNounGender === 'object' && diff --git a/src/typeScript/interfaces/ConvertInterfaces.ts b/src/typeScript/interfaces/ConvertInterfaces.ts index a00a7a7..83224a2 100644 --- a/src/typeScript/interfaces/ConvertInterfaces.ts +++ b/src/typeScript/interfaces/ConvertInterfaces.ts @@ -8,12 +8,30 @@ export interface CurrencySettings { */ currencyNameCases?: [string, string, string], + /** + * Integer currency name forms\ + * for declensions + */ + currencyNameDeclensions?: { + [key: string]: [string, string] + }, + /** * Fractional number currency name forms\ * for gidits [1, 2-4, 5-9]\ * e.g. ['копейка', 'копейки', 'копеек'] */ fractionalPartNameCases?: [string, string, string], + + /** + * Fractional number currency name forms\ + * for declensions + */ + fractionalPartNameDeclensions?: { + [key: string]: [string, string] + }, + + currencyNounGender?: { /** * 0 => 'один', 1 => 'одна', 2 => 'одно'\ diff --git a/src/typeScript/interfaces/ConvertedScalesToWords.ts b/src/typeScript/interfaces/ConvertedScalesToWords.ts index 2085d7d..d47fd22 100644 --- a/src/typeScript/interfaces/ConvertedScalesToWords.ts +++ b/src/typeScript/interfaces/ConvertedScalesToWords.ts @@ -1,4 +1,8 @@ +import {Declension} from "../../units/declensions"; + export interface ConvertedScalesToWords { result: string, unitNameForm: number, + unitDeclension: Declension, + isPlural: boolean }; diff --git a/src/units/stringCurrencies.ts b/src/units/stringCurrencies.ts index 5f285b6..cfced5f 100644 --- a/src/units/stringCurrencies.ts +++ b/src/units/stringCurrencies.ts @@ -1,4 +1,5 @@ import {CurrencyStringValues} from 'typeScript/interfaces/CurrencyStringValues'; +import {declensions} from "./declensions"; const defaultParams = { fractionalPartMinLength: 2, @@ -16,7 +17,23 @@ export const stringCurrencies: CurrencyStringValues = { rub: { ...defaultParams, currencyNameCases: ['рубль', 'рубля', 'рублей'], + currencyNameDeclensions: { + [declensions.NOMINATIVE]: ['рубль', 'рубля'], + [declensions.GENITIVE]: ['рубля', 'рублей'], + [declensions.DATIVE]: ['рублю', 'рублям'], + [declensions.ACCUSATIVE]: ['рубль', 'рубли'], + [declensions.INSTRUMENTAL]: ['рублём', 'рублями'], + [declensions.PREPOSITIONAL]: ['рубле', 'рублях'], + }, fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + fractionalPartNameDeclensions: { + [declensions.NOMINATIVE]: ['копейка', 'копейки'], + [declensions.GENITIVE]: ['копейки', 'копеек'], + [declensions.DATIVE]: ['копейке', 'копейкам'], + [declensions.ACCUSATIVE]: ['копейку', 'копейки'], + [declensions.INSTRUMENTAL]: ['копейкой', 'копейками'], + [declensions.PREPOSITIONAL]: ['копейках', 'копейках'], + }, currencyNounGender: { integer: 0, // Мужской род fractionalPart: 1, // Женский род From fe733559ab187f0003c974e44602102853d17155 Mon Sep 17 00:00:00 2001 From: Sergey Bystrov Date: Tue, 26 Jan 2021 23:51:20 +0300 Subject: [PATCH 03/12] Fixed tens declensions --- src/textValues.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/textValues.ts b/src/textValues.ts index 58df04b..87b45ac 100644 --- a/src/textValues.ts +++ b/src/textValues.ts @@ -96,11 +96,11 @@ export const numberNames: NumberNames = { }, tens: { [declensions.NOMINATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], - [declensions.GENITIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятьдесяти', 'шестьдесяти', 'семьдесяти', 'восемьдесяти', 'девяноста'], - [declensions.DATIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятьдесяти', 'шестьдесяти', 'семьдесяти', 'восемьдесяти', 'девяноста'], + [declensions.GENITIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восмидесяти', 'девяноста'], + [declensions.DATIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восмидесяти', 'девяноста'], [declensions.ACCUSATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], [declensions.INSTRUMENTAL]: ['', '', 'двадцатью', 'тридцатью', 'сорока', 'пятьдесятью', 'шестьдесятью', 'семьдесятью', 'восемьдесятью', 'девяноста'], - [declensions.PREPOSITIONAL]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятьдесяти', 'шестьдесяти', 'семьдесяти', 'восемьдесяти', 'девяноста'], + [declensions.PREPOSITIONAL]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восмидесяти', 'девяноста'], }, hundreds: { [declensions.NOMINATIVE]: ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'], From 5ba8a8e3ca7d0717e36ed1c0df13cd51b66479e1 Mon Sep 17 00:00:00 2001 From: Sergey Bystrov Date: Wed, 27 Jan 2021 00:12:42 +0300 Subject: [PATCH 04/12] Fixed 80-s and 1000-s declensions --- src/functions/convertsEachScaleToWords.ts | 4 ++-- src/textValues.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/functions/convertsEachScaleToWords.ts b/src/functions/convertsEachScaleToWords.ts index eba5343..9b9db9b 100644 --- a/src/functions/convertsEachScaleToWords.ts +++ b/src/functions/convertsEachScaleToWords.ts @@ -41,8 +41,8 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = && digit2 === 0 && digit3 === 0 ) { - // Не забываем указать падеж и число - unitDeclension = declension === declensions.NOMINATIVE ? declensions.GENITIVE : declension; + // Для чисел с пустой единичной частою - всегда родительный падеж во множественном числе + unitDeclension = declensions.GENITIVE; isPlural = true; return; diff --git a/src/textValues.ts b/src/textValues.ts index 87b45ac..334f875 100644 --- a/src/textValues.ts +++ b/src/textValues.ts @@ -96,11 +96,11 @@ export const numberNames: NumberNames = { }, tens: { [declensions.NOMINATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], - [declensions.GENITIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восмидесяти', 'девяноста'], - [declensions.DATIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восмидесяти', 'девяноста'], + [declensions.GENITIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], + [declensions.DATIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], [declensions.ACCUSATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], [declensions.INSTRUMENTAL]: ['', '', 'двадцатью', 'тридцатью', 'сорока', 'пятьдесятью', 'шестьдесятью', 'семьдесятью', 'восемьдесятью', 'девяноста'], - [declensions.PREPOSITIONAL]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восмидесяти', 'девяноста'], + [declensions.PREPOSITIONAL]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], }, hundreds: { [declensions.NOMINATIVE]: ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'], From 60c498f4482a8a8d4363b16a194109a818a82a44 Mon Sep 17 00:00:00 2001 From: Sergey Bystrov Date: Wed, 27 Jan 2021 00:56:40 +0300 Subject: [PATCH 05/12] Tests for declensions added --- src/functions/convertsEachScaleToWords.ts | 13 +- src/textValues.ts | 9 +- src/units/stringCurrencies.ts | 4 +- test/index.test.js | 236 ++++++++++++++++++++++ 4 files changed, 256 insertions(+), 6 deletions(-) diff --git a/src/functions/convertsEachScaleToWords.ts b/src/functions/convertsEachScaleToWords.ts index 9b9db9b..abba160 100644 --- a/src/functions/convertsEachScaleToWords.ts +++ b/src/functions/convertsEachScaleToWords.ts @@ -44,7 +44,6 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = // Для чисел с пустой единичной частою - всегда родительный падеж во множественном числе unitDeclension = declensions.GENITIVE; isPlural = true; - return; } // Определить род числа @@ -93,9 +92,19 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = } // Указать падеж для названия класса единиц - unitDeclension = (((digit3 >= 5 && digit3 <= 9) || digit2 === 1 || digit3 ===0) && declension === declensions.NOMINATIVE) ? declensions.GENITIVE : declension + unitDeclension = declension; isPlural = !(digit3 === 1 && digit2 !== 1); + if (declension === declensions.NOMINATIVE || declension === declensions.ACCUSATIVE) { + if (digit1 === 0 && digit2 === 0 && digit3 === 0) { + // Для чисел с пустой единичной частою - всегда родительный падеж во множественном числе + unitDeclension = declensions.GENITIVE; + isPlural = true; + } else if ((digit3 >= 5 && digit3 <= 9) || digit2 === 1 || digit3 === 0) { + unitDeclension = declensions.GENITIVE; + } + } + const unitName = getUnitName(currentNumberScale - 1, unitDeclension, isPlural); // Убрать ненужный "ноль" if (digit3 === 0 && (digit1 > 0 || digit2 > 0)) { diff --git a/src/textValues.ts b/src/textValues.ts index 334f875..759f66d 100644 --- a/src/textValues.ts +++ b/src/textValues.ts @@ -72,7 +72,12 @@ export const numberNames: NumberNames = { [genders.MALE]: 'один', [genders.NEUTER]: 'одного', [genders.FEMALE]: 'одну', - }, 'двух', 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], + }, + { + [genders.MALE]:'два', + [genders.NEUTER]:'два', + [genders.FEMALE]:'две', + }, 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], [declensions.INSTRUMENTAL]: ['нолем', { [genders.MALE]: 'одним', @@ -99,7 +104,7 @@ export const numberNames: NumberNames = { [declensions.GENITIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], [declensions.DATIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], [declensions.ACCUSATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], - [declensions.INSTRUMENTAL]: ['', '', 'двадцатью', 'тридцатью', 'сорока', 'пятьдесятью', 'шестьдесятью', 'семьдесятью', 'восемьдесятью', 'девяноста'], + [declensions.INSTRUMENTAL]: ['', '', 'двадцатью', 'тридцатью', 'сорока', 'пятьюдесятью', 'шестьюдесятью', 'семьюдесятью', 'восьмьюдесятью', 'девяноста'], [declensions.PREPOSITIONAL]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], }, hundreds: { diff --git a/src/units/stringCurrencies.ts b/src/units/stringCurrencies.ts index cfced5f..a58b345 100644 --- a/src/units/stringCurrencies.ts +++ b/src/units/stringCurrencies.ts @@ -21,8 +21,8 @@ export const stringCurrencies: CurrencyStringValues = { [declensions.NOMINATIVE]: ['рубль', 'рубля'], [declensions.GENITIVE]: ['рубля', 'рублей'], [declensions.DATIVE]: ['рублю', 'рублям'], - [declensions.ACCUSATIVE]: ['рубль', 'рубли'], - [declensions.INSTRUMENTAL]: ['рублём', 'рублями'], + [declensions.ACCUSATIVE]: ['рубль', 'рубля'], + [declensions.INSTRUMENTAL]: ['рублем', 'рублями'], [declensions.PREPOSITIONAL]: ['рубле', 'рублях'], }, fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], diff --git a/test/index.test.js b/test/index.test.js index 2a1ef0a..5d4658a 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -866,3 +866,239 @@ test('Проверка округления числа', () => { expect(numberToWordsRu.convert('999.995')).toBe('Одна тысяча рублей 00 копеек'); expect(numberToWordsRu.convert('15999.995')).toBe('Шестнадцать тысяч рублей 00 копеек'); }); + +describe('Проверка падежей', () => { + test('Родительный', () => { + expect(numberToWordsRu.convert('1', {declension: 'genitive'})).toBe('Одного рубля 00 копеек'); + expect(numberToWordsRu.convert('2', {declension: 'genitive'})).toBe('Двух рублей 00 копеек'); + expect(numberToWordsRu.convert('3', {declension: 'genitive'})).toBe('Трех рублей 00 копеек'); + expect(numberToWordsRu.convert('4', {declension: 'genitive'})).toBe('Четырех рублей 00 копеек'); + expect(numberToWordsRu.convert('5', {declension: 'genitive'})).toBe('Пяти рублей 00 копеек'); + expect(numberToWordsRu.convert('10', {declension: 'genitive'})).toBe('Десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('11', {declension: 'genitive'})).toBe('Одиннадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('12', {declension: 'genitive'})).toBe('Двенадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('13', {declension: 'genitive'})).toBe('Тринадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('14', {declension: 'genitive'})).toBe('Четырнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('15', {declension: 'genitive'})).toBe('Пятнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('16', {declension: 'genitive'})).toBe('Шестнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('17', {declension: 'genitive'})).toBe('Семнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('18', {declension: 'genitive'})).toBe('Восемнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('19', {declension: 'genitive'})).toBe('Девятнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('20', {declension: 'genitive'})).toBe('Двадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('21', {declension: 'genitive'})).toBe('Двадцати одного рубля 00 копеек'); + expect(numberToWordsRu.convert('30', {declension: 'genitive'})).toBe('Тридцати рублей 00 копеек'); + expect(numberToWordsRu.convert('32', {declension: 'genitive'})).toBe('Тридцати двух рублей 00 копеек'); + expect(numberToWordsRu.convert('40', {declension: 'genitive'})).toBe('Сорока рублей 00 копеек'); + expect(numberToWordsRu.convert('43', {declension: 'genitive'})).toBe('Сорока трех рублей 00 копеек'); + expect(numberToWordsRu.convert('50', {declension: 'genitive'})).toBe('Пятидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('54', {declension: 'genitive'})).toBe('Пятидесяти четырех рублей 00 копеек'); + expect(numberToWordsRu.convert('60', {declension: 'genitive'})).toBe('Шестидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('70', {declension: 'genitive'})).toBe('Семидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('80', {declension: 'genitive'})).toBe('Восьмидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('90', {declension: 'genitive'})).toBe('Девяноста рублей 00 копеек'); + expect(numberToWordsRu.convert('99', {declension: 'genitive'})).toBe('Девяноста девяти рублей 00 копеек'); + expect(numberToWordsRu.convert('100', {declension: 'genitive'})).toBe('Ста рублей 00 копеек'); + expect(numberToWordsRu.convert('101', {declension: 'genitive'})).toBe('Ста одного рубля 00 копеек'); + expect(numberToWordsRu.convert('110', {declension: 'genitive'})).toBe('Ста десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('200', {declension: 'genitive'})).toBe('Двухсот рублей 00 копеек'); + expect(numberToWordsRu.convert('201', {declension: 'genitive'})).toBe('Двухсот одного рубля 00 копеек'); + expect(numberToWordsRu.convert('210', {declension: 'genitive'})).toBe('Двухсот десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('500', {declension: 'genitive'})).toBe('Пятисот рублей 00 копеек'); + expect(numberToWordsRu.convert('501', {declension: 'genitive'})).toBe('Пятисот одного рубля 00 копеек'); + expect(numberToWordsRu.convert('510', {declension: 'genitive'})).toBe('Пятисот десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('1000', {declension: 'genitive'})).toBe('Одной тысячи рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', {declension: 'genitive'})).toBe('Одной тысячи одного рубля 00 копеек'); + expect(numberToWordsRu.convert('1002', {declension: 'genitive'})).toBe('Одной тысячи двух рублей 00 копеек'); + expect(numberToWordsRu.convert('1005', {declension: 'genitive'})).toBe('Одной тысячи пяти рублей 00 копеек'); + expect(numberToWordsRu.convert('1100', {declension: 'genitive'})).toBe('Одной тысячи ста рублей 00 копеек'); + expect(numberToWordsRu.convert('1000000', {declension: 'genitive'})).toBe('Одного миллиона рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', {declension: 'genitive'})).toBe('Девятисот восьмидесяти семи миллионов шестисот пятидесяти четырех тысяч трехсот двадцати одного рубля 00 копеек'); + }); + test('Дательный', () => { + expect(numberToWordsRu.convert('1', {declension: 'dative'})).toBe('Одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('2', {declension: 'dative'})).toBe('Двум рублям 00 копейкам'); + expect(numberToWordsRu.convert('3', {declension: 'dative'})).toBe('Трем рублям 00 копейкам'); + expect(numberToWordsRu.convert('4', {declension: 'dative'})).toBe('Четырем рублям 00 копейкам'); + expect(numberToWordsRu.convert('5', {declension: 'dative'})).toBe('Пяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('10', {declension: 'dative'})).toBe('Десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('11', {declension: 'dative'})).toBe('Одиннадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('12', {declension: 'dative'})).toBe('Двенадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('13', {declension: 'dative'})).toBe('Тринадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('14', {declension: 'dative'})).toBe('Четырнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('15', {declension: 'dative'})).toBe('Пятнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('16', {declension: 'dative'})).toBe('Шестнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('17', {declension: 'dative'})).toBe('Семнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('18', {declension: 'dative'})).toBe('Восемнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('19', {declension: 'dative'})).toBe('Девятнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('20', {declension: 'dative'})).toBe('Двадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('21', {declension: 'dative'})).toBe('Двадцати одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('30', {declension: 'dative'})).toBe('Тридцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('32', {declension: 'dative'})).toBe('Тридцати двум рублям 00 копейкам'); + expect(numberToWordsRu.convert('40', {declension: 'dative'})).toBe('Сорока рублям 00 копейкам'); + expect(numberToWordsRu.convert('43', {declension: 'dative'})).toBe('Сорока трем рублям 00 копейкам'); + expect(numberToWordsRu.convert('50', {declension: 'dative'})).toBe('Пятидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('54', {declension: 'dative'})).toBe('Пятидесяти четырем рублям 00 копейкам'); + expect(numberToWordsRu.convert('60', {declension: 'dative'})).toBe('Шестидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('70', {declension: 'dative'})).toBe('Семидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('80', {declension: 'dative'})).toBe('Восьмидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('90', {declension: 'dative'})).toBe('Девяноста рублям 00 копейкам'); + expect(numberToWordsRu.convert('99', {declension: 'dative'})).toBe('Девяноста девяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('100', {declension: 'dative'})).toBe('Ста рублям 00 копейкам'); + expect(numberToWordsRu.convert('101', {declension: 'dative'})).toBe('Ста одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('110', {declension: 'dative'})).toBe('Ста десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('200', {declension: 'dative'})).toBe('Двумстам рублям 00 копейкам'); + expect(numberToWordsRu.convert('201', {declension: 'dative'})).toBe('Двумстам одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('210', {declension: 'dative'})).toBe('Двумстам десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('500', {declension: 'dative'})).toBe('Пятистам рублям 00 копейкам'); + expect(numberToWordsRu.convert('501', {declension: 'dative'})).toBe('Пятистам одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('510', {declension: 'dative'})).toBe('Пятистам десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('1000', {declension: 'dative'})).toBe('Одной тысяче рублей 00 копейкам'); + expect(numberToWordsRu.convert('1001', {declension: 'dative'})).toBe('Одной тысяче одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('1002', {declension: 'dative'})).toBe('Одной тысяче двум рублям 00 копейкам'); + expect(numberToWordsRu.convert('1005', {declension: 'dative'})).toBe('Одной тысяче пяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('1100', {declension: 'dative'})).toBe('Одной тысяче ста рублям 00 копейкам'); + expect(numberToWordsRu.convert('1000000', {declension: 'dative'})).toBe('Одному миллиону рублей 00 копейкам'); + expect(numberToWordsRu.convert('987654321', {declension: 'dative'})).toBe('Девятистам восьмидесяти семи миллионам шестистам пятидесяти четырем тысячам тремстам двадцати одному рублю 00 копейкам'); + }); + + test('Винительный', () => { + expect(numberToWordsRu.convert('1', {declension: 'accusative'})).toBe('Один рубль 00 копеек'); + expect(numberToWordsRu.convert('2', {declension: 'accusative'})).toBe('Два рубля 00 копеек'); + expect(numberToWordsRu.convert('3', {declension: 'accusative'})).toBe('Три рубля 00 копеек'); + expect(numberToWordsRu.convert('4', {declension: 'accusative'})).toBe('Четыре рубля 00 копеек'); + expect(numberToWordsRu.convert('5', {declension: 'accusative'})).toBe('Пять рублей 00 копеек'); + expect(numberToWordsRu.convert('10', {declension: 'accusative'})).toBe('Десять рублей 00 копеек'); + expect(numberToWordsRu.convert('11', {declension: 'accusative'})).toBe('Одиннадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('12', {declension: 'accusative'})).toBe('Двенадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('13', {declension: 'accusative'})).toBe('Тринадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('14', {declension: 'accusative'})).toBe('Четырнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('15', {declension: 'accusative'})).toBe('Пятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('16', {declension: 'accusative'})).toBe('Шестнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('17', {declension: 'accusative'})).toBe('Семнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('18', {declension: 'accusative'})).toBe('Восемнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('19', {declension: 'accusative'})).toBe('Девятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('20', {declension: 'accusative'})).toBe('Двадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('21', {declension: 'accusative'})).toBe('Двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert('30', {declension: 'accusative'})).toBe('Тридцать рублей 00 копеек'); + expect(numberToWordsRu.convert('32', {declension: 'accusative'})).toBe('Тридцать два рубля 00 копеек'); + expect(numberToWordsRu.convert('40', {declension: 'accusative'})).toBe('Сорок рублей 00 копеек'); + expect(numberToWordsRu.convert('43', {declension: 'accusative'})).toBe('Сорок три рубля 00 копеек'); + expect(numberToWordsRu.convert('50', {declension: 'accusative'})).toBe('Пятьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('54', {declension: 'accusative'})).toBe('Пятьдесят четыре рубля 00 копеек'); + expect(numberToWordsRu.convert('60', {declension: 'accusative'})).toBe('Шестьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('70', {declension: 'accusative'})).toBe('Семьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('80', {declension: 'accusative'})).toBe('Восемьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('90', {declension: 'accusative'})).toBe('Девяносто рублей 00 копеек'); + expect(numberToWordsRu.convert('99', {declension: 'accusative'})).toBe('Девяносто девять рублей 00 копеек'); + expect(numberToWordsRu.convert('100', {declension: 'accusative'})).toBe('Сто рублей 00 копеек'); + expect(numberToWordsRu.convert('101', {declension: 'accusative'})).toBe('Сто один рубль 00 копеек'); + expect(numberToWordsRu.convert('110', {declension: 'accusative'})).toBe('Сто десять рублей 00 копеек'); + expect(numberToWordsRu.convert('200', {declension: 'accusative'})).toBe('Двести рублей 00 копеек'); + expect(numberToWordsRu.convert('201', {declension: 'accusative'})).toBe('Двести один рубль 00 копеек'); + expect(numberToWordsRu.convert('210', {declension: 'accusative'})).toBe('Двести десять рублей 00 копеек'); + expect(numberToWordsRu.convert('500', {declension: 'accusative'})).toBe('Пятьсот рублей 00 копеек'); + expect(numberToWordsRu.convert('501', {declension: 'accusative'})).toBe('Пятьсот один рубль 00 копеек'); + expect(numberToWordsRu.convert('510', {declension: 'accusative'})).toBe('Пятьсот десять рублей 00 копеек'); + expect(numberToWordsRu.convert('1000', {declension: 'accusative'})).toBe('Одну тысячу рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', {declension: 'accusative'})).toBe('Одну тысячу один рубль 00 копеек'); + expect(numberToWordsRu.convert('1002', {declension: 'accusative'})).toBe('Одну тысячу два рубля 00 копеек'); + expect(numberToWordsRu.convert('1005', {declension: 'accusative'})).toBe('Одну тысячу пять рублей 00 копеек'); + expect(numberToWordsRu.convert('1100', {declension: 'accusative'})).toBe('Одну тысячу сто рублей 00 копеек'); + expect(numberToWordsRu.convert('1000000', {declension: 'accusative'})).toBe('Один миллион рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', {declension: 'accusative'})).toBe('Девятьсот восемьдесят семь миллионов шестьсот пятьдесят четыре тысячи триста двадцать один рубль 00 копеек'); + }); + + test('Творительный', () => { + expect(numberToWordsRu.convert('1', {declension: 'instrumental'})).toBe('Одним рублем 00 копейками'); + expect(numberToWordsRu.convert('2', {declension: 'instrumental'})).toBe('Двумя рублями 00 копейками'); + expect(numberToWordsRu.convert('3', {declension: 'instrumental'})).toBe('Тремя рублями 00 копейками'); + expect(numberToWordsRu.convert('4', {declension: 'instrumental'})).toBe('Четырьмя рублями 00 копейками'); + expect(numberToWordsRu.convert('5', {declension: 'instrumental'})).toBe('Пятью рублями 00 копейками'); + expect(numberToWordsRu.convert('10', {declension: 'instrumental'})).toBe('Десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('11', {declension: 'instrumental'})).toBe('Одиннадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('12', {declension: 'instrumental'})).toBe('Двенадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('13', {declension: 'instrumental'})).toBe('Тринадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('14', {declension: 'instrumental'})).toBe('Четырнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('15', {declension: 'instrumental'})).toBe('Пятнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('16', {declension: 'instrumental'})).toBe('Шестнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('17', {declension: 'instrumental'})).toBe('Семнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('18', {declension: 'instrumental'})).toBe('Восемнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('19', {declension: 'instrumental'})).toBe('Девятнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('20', {declension: 'instrumental'})).toBe('Двадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('21', {declension: 'instrumental'})).toBe('Двадцатью одним рублем 00 копейками'); + expect(numberToWordsRu.convert('30', {declension: 'instrumental'})).toBe('Тридцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('32', {declension: 'instrumental'})).toBe('Тридцатью двумя рублями 00 копейками'); + expect(numberToWordsRu.convert('40', {declension: 'instrumental'})).toBe('Сорока рублями 00 копейками'); + expect(numberToWordsRu.convert('43', {declension: 'instrumental'})).toBe('Сорока тремя рублями 00 копейками'); + expect(numberToWordsRu.convert('50', {declension: 'instrumental'})).toBe('Пятьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('54', {declension: 'instrumental'})).toBe('Пятьюдесятью четырьмя рублями 00 копейками'); + expect(numberToWordsRu.convert('60', {declension: 'instrumental'})).toBe('Шестьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('70', {declension: 'instrumental'})).toBe('Семьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('80', {declension: 'instrumental'})).toBe('Восьмьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('90', {declension: 'instrumental'})).toBe('Девяноста рублями 00 копейками'); + expect(numberToWordsRu.convert('99', {declension: 'instrumental'})).toBe('Девяноста девятью рублями 00 копейками'); + expect(numberToWordsRu.convert('100', {declension: 'instrumental'})).toBe('Ста рублями 00 копейками'); + expect(numberToWordsRu.convert('101', {declension: 'instrumental'})).toBe('Ста одним рублем 00 копейками'); + expect(numberToWordsRu.convert('110', {declension: 'instrumental'})).toBe('Ста десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('200', {declension: 'instrumental'})).toBe('Двумястами рублями 00 копейками'); + expect(numberToWordsRu.convert('201', {declension: 'instrumental'})).toBe('Двумястами одним рублем 00 копейками'); + expect(numberToWordsRu.convert('210', {declension: 'instrumental'})).toBe('Двумястами десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('500', {declension: 'instrumental'})).toBe('Пятьюстами рублями 00 копейками'); + expect(numberToWordsRu.convert('501', {declension: 'instrumental'})).toBe('Пятьюстами одним рублем 00 копейками'); + expect(numberToWordsRu.convert('510', {declension: 'instrumental'})).toBe('Пятьюстами десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('1000', {declension: 'instrumental'})).toBe('Одной тысячей рублей 00 копейками'); + expect(numberToWordsRu.convert('1001', {declension: 'instrumental'})).toBe('Одной тысячей одним рублем 00 копейками'); + expect(numberToWordsRu.convert('1002', {declension: 'instrumental'})).toBe('Одной тысячей двумя рублями 00 копейками'); + expect(numberToWordsRu.convert('1005', {declension: 'instrumental'})).toBe('Одной тысячей пятью рублями 00 копейками'); + expect(numberToWordsRu.convert('1100', {declension: 'instrumental'})).toBe('Одной тысячей ста рублями 00 копейками'); + expect(numberToWordsRu.convert('1000000', {declension: 'instrumental'})).toBe('Одним миллионом рублей 00 копейками'); + expect(numberToWordsRu.convert('987654321', {declension: 'instrumental'})).toBe('Девятьюстами восьмьюдесятью семью миллионами шестьюстами пятьюдесятью четырьмя тысячами тремястами двадцатью одним рублем 00 копейками'); + }); + + test('Предложный', () => { + expect(numberToWordsRu.convert('1', {declension: 'prepositional'})).toBe('Одном рубле 00 копейках'); + expect(numberToWordsRu.convert('2', {declension: 'prepositional'})).toBe('Двух рублях 00 копейках'); + expect(numberToWordsRu.convert('3', {declension: 'prepositional'})).toBe('Трех рублях 00 копейках'); + expect(numberToWordsRu.convert('4', {declension: 'prepositional'})).toBe('Четырех рублях 00 копейках'); + expect(numberToWordsRu.convert('5', {declension: 'prepositional'})).toBe('Пяти рублях 00 копейках'); + expect(numberToWordsRu.convert('10', {declension: 'prepositional'})).toBe('Десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('11', {declension: 'prepositional'})).toBe('Одиннадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('12', {declension: 'prepositional'})).toBe('Двенадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('13', {declension: 'prepositional'})).toBe('Тринадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('14', {declension: 'prepositional'})).toBe('Четырнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('15', {declension: 'prepositional'})).toBe('Пятнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('16', {declension: 'prepositional'})).toBe('Шестнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('17', {declension: 'prepositional'})).toBe('Семнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('18', {declension: 'prepositional'})).toBe('Восемнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('19', {declension: 'prepositional'})).toBe('Девятнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('20', {declension: 'prepositional'})).toBe('Двадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('21', {declension: 'prepositional'})).toBe('Двадцати одном рубле 00 копейках'); + expect(numberToWordsRu.convert('30', {declension: 'prepositional'})).toBe('Тридцати рублях 00 копейках'); + expect(numberToWordsRu.convert('32', {declension: 'prepositional'})).toBe('Тридцати двух рублях 00 копейках'); + expect(numberToWordsRu.convert('40', {declension: 'prepositional'})).toBe('Сорока рублях 00 копейках'); + expect(numberToWordsRu.convert('43', {declension: 'prepositional'})).toBe('Сорока трех рублях 00 копейках'); + expect(numberToWordsRu.convert('50', {declension: 'prepositional'})).toBe('Пятидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('54', {declension: 'prepositional'})).toBe('Пятидесяти четырех рублях 00 копейках'); + expect(numberToWordsRu.convert('60', {declension: 'prepositional'})).toBe('Шестидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('70', {declension: 'prepositional'})).toBe('Семидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('80', {declension: 'prepositional'})).toBe('Восьмидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('90', {declension: 'prepositional'})).toBe('Девяноста рублях 00 копейках'); + expect(numberToWordsRu.convert('99', {declension: 'prepositional'})).toBe('Девяноста девяти рублях 00 копейках'); + expect(numberToWordsRu.convert('100', {declension: 'prepositional'})).toBe('Ста рублях 00 копейках'); + expect(numberToWordsRu.convert('101', {declension: 'prepositional'})).toBe('Ста одном рубле 00 копейках'); + expect(numberToWordsRu.convert('110', {declension: 'prepositional'})).toBe('Ста десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('200', {declension: 'prepositional'})).toBe('Двухстах рублях 00 копейках'); + expect(numberToWordsRu.convert('201', {declension: 'prepositional'})).toBe('Двухстах одном рубле 00 копейках'); + expect(numberToWordsRu.convert('210', {declension: 'prepositional'})).toBe('Двухстах десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('500', {declension: 'prepositional'})).toBe('Пятистах рублях 00 копейках'); + expect(numberToWordsRu.convert('501', {declension: 'prepositional'})).toBe('Пятистах одном рубле 00 копейках'); + expect(numberToWordsRu.convert('510', {declension: 'prepositional'})).toBe('Пятистах десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('1000', {declension: 'prepositional'})).toBe('Одной тысяче рублей 00 копейках'); + expect(numberToWordsRu.convert('1001', {declension: 'prepositional'})).toBe('Одной тысяче одном рубле 00 копейках'); + expect(numberToWordsRu.convert('1002', {declension: 'prepositional'})).toBe('Одной тысяче двух рублях 00 копейках'); + expect(numberToWordsRu.convert('1005', {declension: 'prepositional'})).toBe('Одной тысяче пяти рублях 00 копейках'); + expect(numberToWordsRu.convert('1100', {declension: 'prepositional'})).toBe('Одной тысяче ста рублях 00 копейках'); + expect(numberToWordsRu.convert('1000000', {declension: 'prepositional'})).toBe('Одном миллионе рублей 00 копейках'); + expect(numberToWordsRu.convert('987654321', {declension: 'prepositional'})).toBe('Девятистах восьмидесяти семи миллионах шестистах пятидесяти четырех тысячах трехстах двадцати одном рубле 00 копейках'); + }); +}); From 91faf3c338c48db5eb53a4a33af1613ce5b5c912 Mon Sep 17 00:00:00 2001 From: Anton Moskovskiy Date: Sun, 31 Jan 2021 15:18:08 +0500 Subject: [PATCH 06/12] small fixes --- src/defaultOptions.ts | 4 +- src/functions/combineResultData.ts | 4 +- src/functions/convertsEachScaleToWords.ts | 44 ++++++----- src/textValues.ts | 73 ++++++++++++------- .../interfaces/ConvertInterfaces.ts | 8 +- .../interfaces/ConvertedScalesToWords.ts | 2 +- src/units/declensions.ts | 4 +- src/units/functions/getFractionalNameForms.ts | 2 +- src/units/functions/getSlashNumberUnitName.ts | 2 +- src/units/functions/getUnitName.ts | 20 +++-- src/units/genders.ts | 6 +- src/units/stringCurrencies.ts | 38 +++++++++- test/index.test.js | 54 +++++++------- 13 files changed, 164 insertions(+), 97 deletions(-) diff --git a/src/defaultOptions.ts b/src/defaultOptions.ts index cadef62..cbc0fab 100644 --- a/src/defaultOptions.ts +++ b/src/defaultOptions.ts @@ -1,11 +1,12 @@ import {ConvertOptions} from 'typeScript/interfaces/ConvertInterfaces'; -import declensions from "./units/declensions"; +import declensions from "units/declensions"; const defaultOptions: ConvertOptions = { /* currency - Название валюты ('rub', 'usd', 'eur') или 'number' или объект со своей валютой */ currency: 'rub', + declension: declensions.NOMINATIVE, roundNumber: -1, convertMinusSignToWord: true, showNumberParts: { @@ -20,7 +21,6 @@ const defaultOptions: ConvertOptions = { integer: true, fractional: true, }, - declension: declensions.NOMINATIVE }; export default defaultOptions; diff --git a/src/functions/combineResultData.ts b/src/functions/combineResultData.ts index a4b3130..cf410d6 100644 --- a/src/functions/combineResultData.ts +++ b/src/functions/combineResultData.ts @@ -74,7 +74,7 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str // Если у валюты определены падежи convertedNumberArr[2] = currencyObject.currencyNameDeclensions[convertResult.unitDeclension][convertResult.isPlural ? 1 : 0]; } else { - // Если у валюты старая настройка (без падежей) + // Если у валюты не определены падежи convertedNumberArr[2] = currencyObject.currencyNameCases[convertResult.unitNameForm]; } } @@ -132,7 +132,7 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str // Если у валюты определены падежи convertedNumberArr[4] = currencyObject.fractionalPartNameDeclensions[convertResult.unitDeclension][convertResult.isPlural ? 1 : 0]; } else { - // Если у валюты старая настройка (без падежей) + /// Если у валюты не определены падежи convertedNumberArr[4] = currencyObject.fractionalPartNameCases[convertResult.unitNameForm]; } } diff --git a/src/functions/convertsEachScaleToWords.ts b/src/functions/convertsEachScaleToWords.ts index abba160..4d23a7a 100644 --- a/src/functions/convertsEachScaleToWords.ts +++ b/src/functions/convertsEachScaleToWords.ts @@ -1,27 +1,35 @@ -import textValues, {DeclensionNumberNames, numberNames} from 'textValues'; +import {DeclensionNumberNames, numberNames} from 'textValues'; +import genders, {Gender} from "units/genders"; +import {Declension, declensions} from "units/declensions"; +import getUnitName from "units/functions/getUnitName"; import {ConvertedScalesToWords} from 'typeScript/interfaces/ConvertedScalesToWords'; -import genders, {Gender} from "../units/genders"; -import {Declension, declensions} from "../units/declensions"; -import getUnitName from "../units/functions/getUnitName"; +/** + * Конвертировать одну цифру в слово. + * @param {number} digit - Цифра для конвертирования. + * @param {DeclensionNumberNames} values - Подходящий объект с падежами для конвертирования цифры. + * @param {Declension} declension - Выбранный падеж. + * @param {Gender} gender - Род для цирфы. + * @return {string} Цирфа (в видео слова) в правильном падеже (напр. "сто", "двадцать", "две" и др.) + */ const convertDigitToWord = (digit: number, values: DeclensionNumberNames, declension: Declension, gender: Gender) => { const declensionValues = values[declension]; const word = declensionValues[digit]; - return "object" === typeof word ? word[gender] : word; + return (typeof word === "object") ? word[gender] : word; }; /** * Конвертировать массив числа в текст. - * @param {Array} numberScaleArr - Массив числа. - * @param {number} currencyNounGender - Род валюты. + * @param {Array} numberScaleArr - Массив числа ['009', '876', '543', ...]. + * @param {number} currencyNounGender - Род валюты (мужской/средний/женский). * @param {Declension} declension - Падеж. - * @return {Object} Конвертированный результат и падеж для валюты. + * @return {Object} Конвертированный результат (текст) и параметры падежа для валюты. */ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = 0, declension: Declension = declensions.NOMINATIVE): ConvertedScalesToWords => { let convertedResult = ''; - let unitNameForm; // Падеж названия единиц измерения - let unitDeclension = declension; // Падеж названия единиц измерения - let isPlural = false; // Множественность названия единиц измерения + let unitNameForm; // Падеж названия единиц измерения (валюты, др. объекты) + let unitDeclension = declension; // Падеж названия единиц измерения (валюты, др. объекты) + let isPlural = false; // Множественность названия единиц измерения (валюты, др. объекты) // Для каждого класса числа numberScaleArr.forEach((numberScale, arrIndex) => { @@ -41,18 +49,18 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = && digit2 === 0 && digit3 === 0 ) { - // Для чисел с пустой единичной частою - всегда родительный падеж во множественном числе + // Для чисел с пустой единичной частью - всегда родительный падеж во множественном числе unitDeclension = declensions.GENITIVE; isPlural = true; return; } - // Определить род числа - // если тысячный разряд - то женский - // если единичный разряд - берем из валюты - // иначе - мужской + /* Определить род числа + если класс тысяч - то женский + если класс единиц - берем из валюты + иначе - мужской */ let gender: Gender = genders.MALE; if (currentNumberScale === 2) { - // Если текущий класс - тысячные + // Если текущий класс - тысячи gender = genders.FEMALE; } else if (currentNumberScale === 1) { // Если текущий класс - единицы @@ -121,7 +129,7 @@ const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = // Вернуть полученный результат и форму падежа для валюты return { result: convertedResult.trim(), - unitNameForm: unitNameForm, + unitNameForm, unitDeclension, isPlural }; diff --git a/src/textValues.ts b/src/textValues.ts index 759f66d..9442ccf 100644 --- a/src/textValues.ts +++ b/src/textValues.ts @@ -1,15 +1,15 @@ import genders from 'units/genders'; +import {declensions} from "units/declensions"; import slashNumberForms from 'units/slashNumberForms'; +import {stringCurrencies} from 'units/stringCurrencies'; import getFractionalNameForms from 'units/functions/getFractionalNameForms'; import getSlashNumberUnitName from 'units/functions/getSlashNumberUnitName'; -import {stringCurrencies} from 'units/stringCurrencies'; import {CurrencyStringValues} from 'typeScript/interfaces/CurrencyStringValues'; import {SlashNumberForms} from 'typeScript/interfaces/SlashNumberForms'; -import {declensions} from "./units/declensions"; type DeclensionNumberName = string | { - [key: string]: string -} + [key: string]: string, +}; export interface DeclensionNumberNames { [key: string]: [ @@ -22,15 +22,16 @@ export interface DeclensionNumberNames { DeclensionNumberName, DeclensionNumberName, DeclensionNumberName, - DeclensionNumberName]; -} + DeclensionNumberName, + ]; +}; interface NumberNames { numbers: DeclensionNumberNames, tenToNineteen: DeclensionNumberNames, tens: DeclensionNumberNames, - hundreds: DeclensionNumberNames -} + hundreds: DeclensionNumberNames, +}; interface TextValues { minus: string, @@ -39,12 +40,13 @@ interface TextValues { currency: CurrencyStringValues, getFractionalUnits: Function, getSlashNumberUnitsNames: Function, -} +}; // Правила взяты отсюда http://www.fio.ru/pravila/grammatika/sklonenie-imen-chislitelnykh/ export const numberNames: NumberNames = { numbers: { - [declensions.NOMINATIVE]: ['ноль', + [declensions.NOMINATIVE]: [ + 'ноль', { [genders.MALE]: 'один', [genders.NEUTER]: 'одно', @@ -54,42 +56,59 @@ export const numberNames: NumberNames = { [genders.MALE]:'два', [genders.NEUTER]:'два', [genders.FEMALE]:'две', - }, 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], - [declensions.GENITIVE]: ['ноль', + }, + 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', + ], + [declensions.GENITIVE]: [ + 'ноля', { [genders.MALE]: 'одного', [genders.NEUTER]: 'одного', [genders.FEMALE]: 'одной', - }, 'двух', 'трех', 'четырех', 'пяти', 'шести', 'семи', 'восьми', 'девяти'], - [declensions.DATIVE]: ['нолю', + }, + 'двух', 'трёх', 'четырёх', 'пяти', 'шести', 'семи', 'восьми', 'девяти', + ], + [declensions.DATIVE]: [ + 'нолю', { [genders.MALE]: 'одному', [genders.NEUTER]: 'одному', [genders.FEMALE]: 'одной', - }, 'двум', 'трем', 'четырем', 'пяти', 'шести', 'семи', 'восьми', 'девяти'], - [declensions.ACCUSATIVE]: ['ноль', + }, + 'двум', 'трём', 'четырём', 'пяти', 'шести', 'семи', 'восьми', 'девяти', + ], + [declensions.ACCUSATIVE]: [ + 'ноль', { [genders.MALE]: 'один', - [genders.NEUTER]: 'одного', + [genders.NEUTER]: 'одно', [genders.FEMALE]: 'одну', }, { [genders.MALE]:'два', [genders.NEUTER]:'два', [genders.FEMALE]:'две', - }, 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять'], - [declensions.INSTRUMENTAL]: ['нолем', + }, + 'три', 'четыре', 'пять', 'шесть', 'семь', 'восемь', 'девять', + ], + [declensions.INSTRUMENTAL]: [ + 'нолём', { [genders.MALE]: 'одним', [genders.NEUTER]: 'одним', [genders.FEMALE]: 'одной', - }, 'двумя', 'тремя', 'четырьмя', 'пятью', 'шестью', 'семью', 'восемью', 'девятью'], - [declensions.PREPOSITIONAL]: ['ноле', + }, + 'двумя', 'тремя', 'четырьмя', 'пятью', 'шестью', 'семью', 'восемью', 'девятью', + ], + [declensions.PREPOSITIONAL]: [ + 'ноле', { [genders.MALE]: 'одном', [genders.NEUTER]: 'одном', [genders.FEMALE]: 'одной', - }, 'двух', 'трех', 'четырех', 'пяти', 'шести', 'семи', 'восьми', 'девяти'], + }, + 'двух', 'трёх', 'четырёх', 'пяти', 'шести', 'семи', 'восьми', 'девяти', + ], }, tenToNineteen: { [declensions.NOMINATIVE]: ['десять', 'одиннадцать', 'двенадцать', 'тринадцать', 'четырнадцать', 'пятнадцать', 'шестнадцать', 'семнадцать', 'восемнадцать', 'девятнадцать'], @@ -104,17 +123,17 @@ export const numberNames: NumberNames = { [declensions.GENITIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], [declensions.DATIVE]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], [declensions.ACCUSATIVE]: ['', '', 'двадцать', 'тридцать', 'сорок', 'пятьдесят', 'шестьдесят', 'семьдесят', 'восемьдесят', 'девяносто'], - [declensions.INSTRUMENTAL]: ['', '', 'двадцатью', 'тридцатью', 'сорока', 'пятьюдесятью', 'шестьюдесятью', 'семьюдесятью', 'восьмьюдесятью', 'девяноста'], + [declensions.INSTRUMENTAL]: ['', '', 'двадцатью', 'тридцатью', 'сорока', 'пятьюдесятью', 'шестьюдесятью', 'семьюдесятью', 'восемьюдесятью', 'девяноста'], [declensions.PREPOSITIONAL]: ['', '', 'двадцати', 'тридцати', 'сорока', 'пятидесяти', 'шестидесяти', 'семидесяти', 'восьмидесяти', 'девяноста'], }, hundreds: { [declensions.NOMINATIVE]: ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'], - [declensions.GENITIVE]: ['', 'ста', 'двухсот', 'трехсот', 'четырехсот', 'пятисот', 'шестисот', 'семисот', 'восемисот', 'девятисот'], - [declensions.DATIVE]: ['', 'ста', 'двумстам', 'тремстам', 'четыремстам', 'пятистам', 'шестистам', 'семистам', 'восемистам', 'девятистам'], + [declensions.GENITIVE]: ['', 'ста', 'двухсот', 'трёхсот', 'четырёхсот', 'пятисот', 'шестисот', 'семисот', 'восьмисот', 'девятисот'], + [declensions.DATIVE]: ['', 'ста', 'двумстам', 'трёмстам', 'четырёмстам', 'пятистам', 'шестистам', 'семистам', 'восьмистам', 'девятистам'], [declensions.ACCUSATIVE]: ['', 'сто', 'двести', 'триста', 'четыреста', 'пятьсот', 'шестьсот', 'семьсот', 'восемьсот', 'девятьсот'], [declensions.INSTRUMENTAL]: ['', 'ста', 'двумястами', 'тремястами', 'четырьмястами', 'пятьюстами', 'шестьюстами', 'семьюстами', 'восемьюстами', 'девятьюстами'], - [declensions.PREPOSITIONAL]: ['', 'ста', 'двухстах', 'трехстах', 'четырехстах', 'пятистах', 'шестистах', 'семистах', 'восемистах', 'девятистах'] - } + [declensions.PREPOSITIONAL]: ['', 'ста', 'двухстах', 'трёхстах', 'четырёхстах', 'пятистах', 'шестистах', 'семистах', 'восьмистах', 'девятистах'] + }, }; const textValues: TextValues = { diff --git a/src/typeScript/interfaces/ConvertInterfaces.ts b/src/typeScript/interfaces/ConvertInterfaces.ts index 83224a2..9d58b2c 100644 --- a/src/typeScript/interfaces/ConvertInterfaces.ts +++ b/src/typeScript/interfaces/ConvertInterfaces.ts @@ -1,4 +1,4 @@ -import {Declension} from "../../units/declensions"; +import {Declension} from "units/declensions"; export interface CurrencySettings { /** @@ -13,7 +13,7 @@ export interface CurrencySettings { * for declensions */ currencyNameDeclensions?: { - [key: string]: [string, string] + [key in Declension]?: [string, string]; }, /** @@ -28,7 +28,7 @@ export interface CurrencySettings { * for declensions */ fractionalPartNameDeclensions?: { - [key: string]: [string, string] + [key in Declension]?: [string, string]; }, @@ -62,6 +62,7 @@ export interface ConvertOptions { * Default: `rub` */ currency?: 'rub' | 'usd' | 'eur' | 'number' | CurrencySettings, + declension?: Declension, roundNumber?: number, convertMinusSignToWord?: boolean; showNumberParts?: { @@ -76,5 +77,4 @@ export interface ConvertOptions { integer?: boolean; fractional?: boolean; }, - declension?: Declension } diff --git a/src/typeScript/interfaces/ConvertedScalesToWords.ts b/src/typeScript/interfaces/ConvertedScalesToWords.ts index d47fd22..8487154 100644 --- a/src/typeScript/interfaces/ConvertedScalesToWords.ts +++ b/src/typeScript/interfaces/ConvertedScalesToWords.ts @@ -1,4 +1,4 @@ -import {Declension} from "../../units/declensions"; +import {Declension} from "units/declensions"; export interface ConvertedScalesToWords { result: string, diff --git a/src/units/declensions.ts b/src/units/declensions.ts index 557a3ef..a1ef038 100644 --- a/src/units/declensions.ts +++ b/src/units/declensions.ts @@ -4,11 +4,11 @@ export type Declension = | 'dative' | 'accusative' | 'instrumental' - | 'prepositional' + | 'prepositional'; export interface Declensions { [key: string]: Declension, -} +}; export const declensions: Declensions = { NOMINATIVE: 'nominative', // именительный diff --git a/src/units/functions/getFractionalNameForms.ts b/src/units/functions/getFractionalNameForms.ts index ae5f291..a7afdee 100644 --- a/src/units/functions/getFractionalNameForms.ts +++ b/src/units/functions/getFractionalNameForms.ts @@ -4,7 +4,7 @@ import { fractionalWordPrefixes, } from 'units/fractional'; import getUnitName from "units/functions/getUnitName"; -import declensions from "../declensions"; +import declensions from "units/declensions"; /** * Получить падежи дробной части числа. diff --git a/src/units/functions/getSlashNumberUnitName.ts b/src/units/functions/getSlashNumberUnitName.ts index 89e1405..efb6521 100644 --- a/src/units/functions/getSlashNumberUnitName.ts +++ b/src/units/functions/getSlashNumberUnitName.ts @@ -1,4 +1,4 @@ -import declensions from "../declensions"; +import declensions from "units/declensions"; import getUnitName from "units/functions/getUnitName"; const slashNumberUnitsForms = [ diff --git a/src/units/functions/getUnitName.ts b/src/units/functions/getUnitName.ts index 181f9e5..ed381e8 100644 --- a/src/units/functions/getUnitName.ts +++ b/src/units/functions/getUnitName.ts @@ -1,4 +1,4 @@ -import {Declension, declensions} from "../declensions"; +import {Declension, declensions} from "units/declensions"; import unitNames from 'units/unitNames'; const integerWordEndings = { @@ -11,7 +11,7 @@ const integerWordEndings = { }; type UnitName = { - [key: string]: [string, string]; + [key in Declension]?: [string, string]; }; let thousandNames: UnitName = { @@ -23,19 +23,25 @@ let thousandNames: UnitName = { [declensions.PREPOSITIONAL]: ['тысяче', 'тысячах'], }; +/** + * Получить название класса числа в правильном падеже. + * @param {number} scale - Порядковый номер класса числа (0 - единицы, 1 - тысячи и т.д.). + * @param {Declension} declension - Падеж для класса числа. + * @param {boolean} isPlural - Множественость класса числа. + * @return {string} Название класса числа (напр. "миллиард", "миллиона", "тысячи" и др.). + */ const getUnitName = (scale: number, declension: Declension, isPlural: boolean) => { if (scale === 0) { - // Для единиц не отображаем названия + // Класс единиц + // Для них название не отображается. return '' } else if (scale === 1) { - // Тысячи + // Класс тысяч return thousandNames[declension][isPlural ? 1 : 0]; } - - // Миллионы и так далее + // Класс миллионов и так далее const ending = integerWordEndings[declension][isPlural ? 1 : 0]; const base = unitNames[scale - 2]; - return base ? base + ending : ''; }; diff --git a/src/units/genders.ts b/src/units/genders.ts index ca58462..db4093d 100644 --- a/src/units/genders.ts +++ b/src/units/genders.ts @@ -1,16 +1,16 @@ export type Gender = | 'MALE' | 'FEMALE' - | 'NEUTER' + | 'NEUTER'; export interface Genders { [key: string]: Gender, -} +}; const genders: Genders = { MALE: 'MALE', FEMALE: 'FEMALE', - NEUTER: 'NEUTER' + NEUTER: 'NEUTER', }; export default genders; diff --git a/src/units/stringCurrencies.ts b/src/units/stringCurrencies.ts index a58b345..6a2d310 100644 --- a/src/units/stringCurrencies.ts +++ b/src/units/stringCurrencies.ts @@ -1,5 +1,5 @@ +import {declensions} from "units/declensions"; import {CurrencyStringValues} from 'typeScript/interfaces/CurrencyStringValues'; -import {declensions} from "./declensions"; const defaultParams = { fractionalPartMinLength: 2, @@ -22,7 +22,7 @@ export const stringCurrencies: CurrencyStringValues = { [declensions.GENITIVE]: ['рубля', 'рублей'], [declensions.DATIVE]: ['рублю', 'рублям'], [declensions.ACCUSATIVE]: ['рубль', 'рубля'], - [declensions.INSTRUMENTAL]: ['рублем', 'рублями'], + [declensions.INSTRUMENTAL]: ['рублём', 'рублями'], [declensions.PREPOSITIONAL]: ['рубле', 'рублях'], }, fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], @@ -32,7 +32,7 @@ export const stringCurrencies: CurrencyStringValues = { [declensions.DATIVE]: ['копейке', 'копейкам'], [declensions.ACCUSATIVE]: ['копейку', 'копейки'], [declensions.INSTRUMENTAL]: ['копейкой', 'копейками'], - [declensions.PREPOSITIONAL]: ['копейках', 'копейках'], + [declensions.PREPOSITIONAL]: ['копейке', 'копейках'], }, currencyNounGender: { integer: 0, // Мужской род @@ -42,7 +42,23 @@ export const stringCurrencies: CurrencyStringValues = { usd: { ...defaultParams, currencyNameCases: ['доллар', 'доллара', 'долларов'], + currencyNameDeclensions: { + [declensions.NOMINATIVE]: ['доллар', 'доллары'], + [declensions.GENITIVE]: ['доллара', 'долларов'], + [declensions.DATIVE]: ['доллару', 'долларам'], + [declensions.ACCUSATIVE]: ['доллар', 'доллары'], + [declensions.INSTRUMENTAL]: ['долларом', 'долларами'], + [declensions.PREPOSITIONAL]: ['долларе', 'долларах'], + }, fractionalPartNameCases: ['цент', 'цента', 'центов'], + fractionalPartNameDeclensions: { + [declensions.NOMINATIVE]: ['цент', 'центы'], + [declensions.GENITIVE]: ['цента', 'центов'], + [declensions.DATIVE]: ['центу', 'центам'], + [declensions.ACCUSATIVE]: ['цент', 'центы'], + [declensions.INSTRUMENTAL]: ['центом', 'центами'], + [declensions.PREPOSITIONAL]: ['центе', 'центах'], + }, currencyNounGender: { integer: 0, fractionalPart: 0, @@ -51,7 +67,23 @@ export const stringCurrencies: CurrencyStringValues = { eur: { ...defaultParams, currencyNameCases: ['евро', 'евро', 'евро'], + currencyNameDeclensions: { + [declensions.NOMINATIVE]: ['евро', 'евро'], + [declensions.GENITIVE]: ['евро', 'евро'], + [declensions.DATIVE]: ['евро', 'евро'], + [declensions.ACCUSATIVE]: ['евро', 'евро'], + [declensions.INSTRUMENTAL]: ['евро', 'евро'], + [declensions.PREPOSITIONAL]: ['евро', 'евро'], + }, fractionalPartNameCases: ['цент', 'цента', 'центов'], + fractionalPartNameDeclensions: { + [declensions.NOMINATIVE]: ['цент', 'центы'], + [declensions.GENITIVE]: ['цента', 'центов'], + [declensions.DATIVE]: ['центу', 'центам'], + [declensions.ACCUSATIVE]: ['цент', 'центы'], + [declensions.INSTRUMENTAL]: ['центом', 'центами'], + [declensions.PREPOSITIONAL]: ['центе', 'центах'], + }, currencyNounGender: { integer: 0, fractionalPart: 0, diff --git a/test/index.test.js b/test/index.test.js index 5d4658a..b83b2dd 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -869,10 +869,11 @@ test('Проверка округления числа', () => { describe('Проверка падежей', () => { test('Родительный', () => { + expect(numberToWordsRu.convert('0', {declension: 'genitive'})).toBe('Ноля рублей 00 копеек'); expect(numberToWordsRu.convert('1', {declension: 'genitive'})).toBe('Одного рубля 00 копеек'); expect(numberToWordsRu.convert('2', {declension: 'genitive'})).toBe('Двух рублей 00 копеек'); - expect(numberToWordsRu.convert('3', {declension: 'genitive'})).toBe('Трех рублей 00 копеек'); - expect(numberToWordsRu.convert('4', {declension: 'genitive'})).toBe('Четырех рублей 00 копеек'); + expect(numberToWordsRu.convert('3', {declension: 'genitive'})).toBe('Трёх рублей 00 копеек'); + expect(numberToWordsRu.convert('4', {declension: 'genitive'})).toBe('Четырёх рублей 00 копеек'); expect(numberToWordsRu.convert('5', {declension: 'genitive'})).toBe('Пяти рублей 00 копеек'); expect(numberToWordsRu.convert('10', {declension: 'genitive'})).toBe('Десяти рублей 00 копеек'); expect(numberToWordsRu.convert('11', {declension: 'genitive'})).toBe('Одиннадцати рублей 00 копеек'); @@ -889,9 +890,9 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('30', {declension: 'genitive'})).toBe('Тридцати рублей 00 копеек'); expect(numberToWordsRu.convert('32', {declension: 'genitive'})).toBe('Тридцати двух рублей 00 копеек'); expect(numberToWordsRu.convert('40', {declension: 'genitive'})).toBe('Сорока рублей 00 копеек'); - expect(numberToWordsRu.convert('43', {declension: 'genitive'})).toBe('Сорока трех рублей 00 копеек'); + expect(numberToWordsRu.convert('43', {declension: 'genitive'})).toBe('Сорока трёх рублей 00 копеек'); expect(numberToWordsRu.convert('50', {declension: 'genitive'})).toBe('Пятидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('54', {declension: 'genitive'})).toBe('Пятидесяти четырех рублей 00 копеек'); + expect(numberToWordsRu.convert('54', {declension: 'genitive'})).toBe('Пятидесяти четырёх рублей 00 копеек'); expect(numberToWordsRu.convert('60', {declension: 'genitive'})).toBe('Шестидесяти рублей 00 копеек'); expect(numberToWordsRu.convert('70', {declension: 'genitive'})).toBe('Семидесяти рублей 00 копеек'); expect(numberToWordsRu.convert('80', {declension: 'genitive'})).toBe('Восьмидесяти рублей 00 копеек'); @@ -912,13 +913,14 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('1005', {declension: 'genitive'})).toBe('Одной тысячи пяти рублей 00 копеек'); expect(numberToWordsRu.convert('1100', {declension: 'genitive'})).toBe('Одной тысячи ста рублей 00 копеек'); expect(numberToWordsRu.convert('1000000', {declension: 'genitive'})).toBe('Одного миллиона рублей 00 копеек'); - expect(numberToWordsRu.convert('987654321', {declension: 'genitive'})).toBe('Девятисот восьмидесяти семи миллионов шестисот пятидесяти четырех тысяч трехсот двадцати одного рубля 00 копеек'); + expect(numberToWordsRu.convert('987654321', {declension: 'genitive'})).toBe('Девятисот восьмидесяти семи миллионов шестисот пятидесяти четырёх тысяч трёхсот двадцати одного рубля 00 копеек'); }); test('Дательный', () => { + expect(numberToWordsRu.convert('0', {declension: 'dative'})).toBe('Нолю рублям 00 копейкам'); expect(numberToWordsRu.convert('1', {declension: 'dative'})).toBe('Одному рублю 00 копейкам'); expect(numberToWordsRu.convert('2', {declension: 'dative'})).toBe('Двум рублям 00 копейкам'); - expect(numberToWordsRu.convert('3', {declension: 'dative'})).toBe('Трем рублям 00 копейкам'); - expect(numberToWordsRu.convert('4', {declension: 'dative'})).toBe('Четырем рублям 00 копейкам'); + expect(numberToWordsRu.convert('3', {declension: 'dative'})).toBe('Трём рублям 00 копейкам'); + expect(numberToWordsRu.convert('4', {declension: 'dative'})).toBe('Четырём рублям 00 копейкам'); expect(numberToWordsRu.convert('5', {declension: 'dative'})).toBe('Пяти рублям 00 копейкам'); expect(numberToWordsRu.convert('10', {declension: 'dative'})).toBe('Десяти рублям 00 копейкам'); expect(numberToWordsRu.convert('11', {declension: 'dative'})).toBe('Одиннадцати рублям 00 копейкам'); @@ -935,9 +937,9 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('30', {declension: 'dative'})).toBe('Тридцати рублям 00 копейкам'); expect(numberToWordsRu.convert('32', {declension: 'dative'})).toBe('Тридцати двум рублям 00 копейкам'); expect(numberToWordsRu.convert('40', {declension: 'dative'})).toBe('Сорока рублям 00 копейкам'); - expect(numberToWordsRu.convert('43', {declension: 'dative'})).toBe('Сорока трем рублям 00 копейкам'); + expect(numberToWordsRu.convert('43', {declension: 'dative'})).toBe('Сорока трём рублям 00 копейкам'); expect(numberToWordsRu.convert('50', {declension: 'dative'})).toBe('Пятидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('54', {declension: 'dative'})).toBe('Пятидесяти четырем рублям 00 копейкам'); + expect(numberToWordsRu.convert('54', {declension: 'dative'})).toBe('Пятидесяти четырём рублям 00 копейкам'); expect(numberToWordsRu.convert('60', {declension: 'dative'})).toBe('Шестидесяти рублям 00 копейкам'); expect(numberToWordsRu.convert('70', {declension: 'dative'})).toBe('Семидесяти рублям 00 копейкам'); expect(numberToWordsRu.convert('80', {declension: 'dative'})).toBe('Восьмидесяти рублям 00 копейкам'); @@ -958,10 +960,10 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('1005', {declension: 'dative'})).toBe('Одной тысяче пяти рублям 00 копейкам'); expect(numberToWordsRu.convert('1100', {declension: 'dative'})).toBe('Одной тысяче ста рублям 00 копейкам'); expect(numberToWordsRu.convert('1000000', {declension: 'dative'})).toBe('Одному миллиону рублей 00 копейкам'); - expect(numberToWordsRu.convert('987654321', {declension: 'dative'})).toBe('Девятистам восьмидесяти семи миллионам шестистам пятидесяти четырем тысячам тремстам двадцати одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('987654321', {declension: 'dative'})).toBe('Девятистам восьмидесяти семи миллионам шестистам пятидесяти четырём тысячам трёмстам двадцати одному рублю 00 копейкам'); }); - test('Винительный', () => { + expect(numberToWordsRu.convert('0', {declension: 'accusative'})).toBe('Ноль рублей 00 копеек'); expect(numberToWordsRu.convert('1', {declension: 'accusative'})).toBe('Один рубль 00 копеек'); expect(numberToWordsRu.convert('2', {declension: 'accusative'})).toBe('Два рубля 00 копеек'); expect(numberToWordsRu.convert('3', {declension: 'accusative'})).toBe('Три рубля 00 копеек'); @@ -1007,9 +1009,9 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('1000000', {declension: 'accusative'})).toBe('Один миллион рублей 00 копеек'); expect(numberToWordsRu.convert('987654321', {declension: 'accusative'})).toBe('Девятьсот восемьдесят семь миллионов шестьсот пятьдесят четыре тысячи триста двадцать один рубль 00 копеек'); }); - test('Творительный', () => { - expect(numberToWordsRu.convert('1', {declension: 'instrumental'})).toBe('Одним рублем 00 копейками'); + expect(numberToWordsRu.convert('0', {declension: 'instrumental'})).toBe('Нолём рублями 00 копейками'); + expect(numberToWordsRu.convert('1', {declension: 'instrumental'})).toBe('Одним рублём 00 копейками'); expect(numberToWordsRu.convert('2', {declension: 'instrumental'})).toBe('Двумя рублями 00 копейками'); expect(numberToWordsRu.convert('3', {declension: 'instrumental'})).toBe('Тремя рублями 00 копейками'); expect(numberToWordsRu.convert('4', {declension: 'instrumental'})).toBe('Четырьмя рублями 00 копейками'); @@ -1025,7 +1027,7 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('18', {declension: 'instrumental'})).toBe('Восемнадцатью рублями 00 копейками'); expect(numberToWordsRu.convert('19', {declension: 'instrumental'})).toBe('Девятнадцатью рублями 00 копейками'); expect(numberToWordsRu.convert('20', {declension: 'instrumental'})).toBe('Двадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('21', {declension: 'instrumental'})).toBe('Двадцатью одним рублем 00 копейками'); + expect(numberToWordsRu.convert('21', {declension: 'instrumental'})).toBe('Двадцатью одним рублём 00 копейками'); expect(numberToWordsRu.convert('30', {declension: 'instrumental'})).toBe('Тридцатью рублями 00 копейками'); expect(numberToWordsRu.convert('32', {declension: 'instrumental'})).toBe('Тридцатью двумя рублями 00 копейками'); expect(numberToWordsRu.convert('40', {declension: 'instrumental'})).toBe('Сорока рублями 00 копейками'); @@ -1034,32 +1036,32 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('54', {declension: 'instrumental'})).toBe('Пятьюдесятью четырьмя рублями 00 копейками'); expect(numberToWordsRu.convert('60', {declension: 'instrumental'})).toBe('Шестьюдесятью рублями 00 копейками'); expect(numberToWordsRu.convert('70', {declension: 'instrumental'})).toBe('Семьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('80', {declension: 'instrumental'})).toBe('Восьмьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('80', {declension: 'instrumental'})).toBe('Восемьюдесятью рублями 00 копейками'); expect(numberToWordsRu.convert('90', {declension: 'instrumental'})).toBe('Девяноста рублями 00 копейками'); expect(numberToWordsRu.convert('99', {declension: 'instrumental'})).toBe('Девяноста девятью рублями 00 копейками'); expect(numberToWordsRu.convert('100', {declension: 'instrumental'})).toBe('Ста рублями 00 копейками'); - expect(numberToWordsRu.convert('101', {declension: 'instrumental'})).toBe('Ста одним рублем 00 копейками'); + expect(numberToWordsRu.convert('101', {declension: 'instrumental'})).toBe('Ста одним рублём 00 копейками'); expect(numberToWordsRu.convert('110', {declension: 'instrumental'})).toBe('Ста десятью рублями 00 копейками'); expect(numberToWordsRu.convert('200', {declension: 'instrumental'})).toBe('Двумястами рублями 00 копейками'); - expect(numberToWordsRu.convert('201', {declension: 'instrumental'})).toBe('Двумястами одним рублем 00 копейками'); + expect(numberToWordsRu.convert('201', {declension: 'instrumental'})).toBe('Двумястами одним рублём 00 копейками'); expect(numberToWordsRu.convert('210', {declension: 'instrumental'})).toBe('Двумястами десятью рублями 00 копейками'); expect(numberToWordsRu.convert('500', {declension: 'instrumental'})).toBe('Пятьюстами рублями 00 копейками'); - expect(numberToWordsRu.convert('501', {declension: 'instrumental'})).toBe('Пятьюстами одним рублем 00 копейками'); + expect(numberToWordsRu.convert('501', {declension: 'instrumental'})).toBe('Пятьюстами одним рублём 00 копейками'); expect(numberToWordsRu.convert('510', {declension: 'instrumental'})).toBe('Пятьюстами десятью рублями 00 копейками'); expect(numberToWordsRu.convert('1000', {declension: 'instrumental'})).toBe('Одной тысячей рублей 00 копейками'); - expect(numberToWordsRu.convert('1001', {declension: 'instrumental'})).toBe('Одной тысячей одним рублем 00 копейками'); + expect(numberToWordsRu.convert('1001', {declension: 'instrumental'})).toBe('Одной тысячей одним рублём 00 копейками'); expect(numberToWordsRu.convert('1002', {declension: 'instrumental'})).toBe('Одной тысячей двумя рублями 00 копейками'); expect(numberToWordsRu.convert('1005', {declension: 'instrumental'})).toBe('Одной тысячей пятью рублями 00 копейками'); expect(numberToWordsRu.convert('1100', {declension: 'instrumental'})).toBe('Одной тысячей ста рублями 00 копейками'); expect(numberToWordsRu.convert('1000000', {declension: 'instrumental'})).toBe('Одним миллионом рублей 00 копейками'); - expect(numberToWordsRu.convert('987654321', {declension: 'instrumental'})).toBe('Девятьюстами восьмьюдесятью семью миллионами шестьюстами пятьюдесятью четырьмя тысячами тремястами двадцатью одним рублем 00 копейками'); + expect(numberToWordsRu.convert('987654321', {declension: 'instrumental'})).toBe('Девятьюстами восемьюдесятью семью миллионами шестьюстами пятьюдесятью четырьмя тысячами тремястами двадцатью одним рублём 00 копейками'); }); - test('Предложный', () => { + expect(numberToWordsRu.convert('0', {declension: 'prepositional'})).toBe('Ноле рублях 00 копейках'); expect(numberToWordsRu.convert('1', {declension: 'prepositional'})).toBe('Одном рубле 00 копейках'); expect(numberToWordsRu.convert('2', {declension: 'prepositional'})).toBe('Двух рублях 00 копейках'); - expect(numberToWordsRu.convert('3', {declension: 'prepositional'})).toBe('Трех рублях 00 копейках'); - expect(numberToWordsRu.convert('4', {declension: 'prepositional'})).toBe('Четырех рублях 00 копейках'); + expect(numberToWordsRu.convert('3', {declension: 'prepositional'})).toBe('Трёх рублях 00 копейках'); + expect(numberToWordsRu.convert('4', {declension: 'prepositional'})).toBe('Четырёх рублях 00 копейках'); expect(numberToWordsRu.convert('5', {declension: 'prepositional'})).toBe('Пяти рублях 00 копейках'); expect(numberToWordsRu.convert('10', {declension: 'prepositional'})).toBe('Десяти рублях 00 копейках'); expect(numberToWordsRu.convert('11', {declension: 'prepositional'})).toBe('Одиннадцати рублях 00 копейках'); @@ -1076,9 +1078,9 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('30', {declension: 'prepositional'})).toBe('Тридцати рублях 00 копейках'); expect(numberToWordsRu.convert('32', {declension: 'prepositional'})).toBe('Тридцати двух рублях 00 копейках'); expect(numberToWordsRu.convert('40', {declension: 'prepositional'})).toBe('Сорока рублях 00 копейках'); - expect(numberToWordsRu.convert('43', {declension: 'prepositional'})).toBe('Сорока трех рублях 00 копейках'); + expect(numberToWordsRu.convert('43', {declension: 'prepositional'})).toBe('Сорока трёх рублях 00 копейках'); expect(numberToWordsRu.convert('50', {declension: 'prepositional'})).toBe('Пятидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('54', {declension: 'prepositional'})).toBe('Пятидесяти четырех рублях 00 копейках'); + expect(numberToWordsRu.convert('54', {declension: 'prepositional'})).toBe('Пятидесяти четырёх рублях 00 копейках'); expect(numberToWordsRu.convert('60', {declension: 'prepositional'})).toBe('Шестидесяти рублях 00 копейках'); expect(numberToWordsRu.convert('70', {declension: 'prepositional'})).toBe('Семидесяти рублях 00 копейках'); expect(numberToWordsRu.convert('80', {declension: 'prepositional'})).toBe('Восьмидесяти рублях 00 копейках'); @@ -1099,6 +1101,6 @@ describe('Проверка падежей', () => { expect(numberToWordsRu.convert('1005', {declension: 'prepositional'})).toBe('Одной тысяче пяти рублях 00 копейках'); expect(numberToWordsRu.convert('1100', {declension: 'prepositional'})).toBe('Одной тысяче ста рублях 00 копейках'); expect(numberToWordsRu.convert('1000000', {declension: 'prepositional'})).toBe('Одном миллионе рублей 00 копейках'); - expect(numberToWordsRu.convert('987654321', {declension: 'prepositional'})).toBe('Девятистах восьмидесяти семи миллионах шестистах пятидесяти четырех тысячах трехстах двадцати одном рубле 00 копейках'); + expect(numberToWordsRu.convert('987654321', {declension: 'prepositional'})).toBe('Девятистах восьмидесяти семи миллионах шестистах пятидесяти четырёх тысячах трёхстах двадцати одном рубле 00 копейках'); }); }); From a9d6bc02ee933d4123dea6bf26af3f05e9f9e6dd Mon Sep 17 00:00:00 2001 From: Anton Moskovskiy Date: Mon, 1 Feb 2021 18:45:25 +0500 Subject: [PATCH 07/12] tests splitted --- test/index.test.js | 1106 ----------------- test/methods/convert/convert.test.js | 594 +++++++++ .../options/convertMinusSignToWord.test.js | 11 + .../options/convertNumbertToWords.test.js | 33 + test/methods/convert/options/currency.test.js | 106 ++ .../convert/options/declension.test.js | 577 +++++++++ test/methods/convert/options/options.test.js | 28 + .../convert/options/roundNumber.test.js | 211 ++++ .../convert/options/showCurrency.test.js | 33 + .../convert/options/showNumberParts.test.js | 32 + 10 files changed, 1625 insertions(+), 1106 deletions(-) delete mode 100644 test/index.test.js create mode 100644 test/methods/convert/convert.test.js create mode 100644 test/methods/convert/options/convertMinusSignToWord.test.js create mode 100644 test/methods/convert/options/convertNumbertToWords.test.js create mode 100644 test/methods/convert/options/currency.test.js create mode 100644 test/methods/convert/options/declension.test.js create mode 100644 test/methods/convert/options/options.test.js create mode 100644 test/methods/convert/options/roundNumber.test.js create mode 100644 test/methods/convert/options/showCurrency.test.js create mode 100644 test/methods/convert/options/showNumberParts.test.js diff --git a/test/index.test.js b/test/index.test.js deleted file mode 100644 index b83b2dd..0000000 --- a/test/index.test.js +++ /dev/null @@ -1,1106 +0,0 @@ -const numberToWordsRu = require('../dist/bundle'); - -describe('Проверка входных данных', () => { - test('Пустая строка', () => { - expect(numberToWordsRu.convert('')).toBe('Ноль рублей 00 копеек'); - }); - test('Пустое значение', () => { - expect(numberToWordsRu.convert()).toBe('Ноль рублей 00 копеек'); - }); - describe('Допустимые знаки', () => { - test('Знак `-`', () => { - expect(numberToWordsRu.convert('-')).toBe('Минус ноль рублей 00 копеек'); - }); - test('Знак `.`', () => { - expect(numberToWordsRu.convert('.')).toBe('Ноль рублей 00 копеек'); - }); - test('Знак `,`', () => { - expect(numberToWordsRu.convert(',')).toBe('Ноль рублей 00 копеек'); - }); - test('Знак `/`', () => { - expect(numberToWordsRu.convert('/')).toBe('Ноль 0 рубля'); - }); - }); - describe('Недопустимые знаки', () => { - test('Буквы', () => { - expect(numberToWordsRu.convert('XZ')).toBe('Ноль рублей 00 копеек'); - }); - test('Символы', () => { - expect(numberToWordsRu - .convert('`~!@"#№$;%^:&?*_+=\'\\()[]{}<>')) - .toBe('Ноль рублей 00 копеек'); - }); - }); - describe('Недопустимые типы данных', () => { - test('null', () => { - expect(numberToWordsRu.convert(null)).toBe('Ноль рублей 00 копеек'); - }); - test('undefined', () => { - expect(numberToWordsRu.convert(undefined)).toBe('Ноль рублей 00 копеек'); - }); - test('boolean', () => { - expect(numberToWordsRu.convert(true)).toBe('Ноль рублей 00 копеек'); - }); - test('symbol', () => { - expect(numberToWordsRu.convert(Symbol())).toBe('Ноль рублей 00 копеек'); - }); - test('bigInt', () => { - expect(numberToWordsRu.convert(BigInt(1))).toBe('Ноль рублей 00 копеек'); - }); - test('object', () => { - expect(numberToWordsRu.convert({})).toBe('Ноль рублей 00 копеек'); - }); - test('function', () => { - expect(numberToWordsRu.convert(function(){})).toBe('Ноль рублей 00 копеек'); - }); - }); -}); -describe('Проверка чисел', () => { - test('Отрицательные', () => { - expect(numberToWordsRu.convert(-2)).toBe('Минус два рубля 00 копеек'); - }); - test('Десятичные', () => { - expect(numberToWordsRu.convert(1.01)).toBe('Один рубль 01 копейка'); - expect(numberToWordsRu.convert(1.02)).toBe('Один рубль 02 копейки'); - expect(numberToWordsRu.convert(1.04)).toBe('Один рубль 04 копейки'); - expect(numberToWordsRu.convert(1.05)).toBe('Один рубль 05 копеек'); - expect(numberToWordsRu.convert(1.09)).toBe('Один рубль 09 копеек'); - expect(numberToWordsRu.convert(1.10)).toBe('Один рубль 10 копеек'); - expect(numberToWordsRu.convert(1.11)).toBe('Один рубль 11 копеек'); - expect(numberToWordsRu.convert(1.12)).toBe('Один рубль 12 копеек'); - expect(numberToWordsRu.convert(1.20)).toBe('Один рубль 20 копеек'); - expect(numberToWordsRu.convert(1.21)).toBe('Один рубль 21 копейка'); - expect(numberToWordsRu.convert(1.22)).toBe('Один рубль 22 копейки'); - expect(numberToWordsRu.convert(1.29)).toBe('Один рубль 29 копеек'); - }); - test('Без валюты (целые, десятые и т.д.)', () => { - expect(numberToWordsRu.convert(0.1, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Ноль целых одна десятая'); - expect(numberToWordsRu.convert(1.1, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна десятая'); - expect(numberToWordsRu.convert(1.01, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна сотая'); - expect(numberToWordsRu.convert(1.001, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна тысячная'); - expect(numberToWordsRu.convert(1.0001, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна десятитысячная'); - expect(numberToWordsRu.convert(1.00001, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна стотысячная'); - expect(numberToWordsRu.convert(1.000001, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна миллионная'); - expect(numberToWordsRu.convert(1.0000001, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна десятимиллионная'); - expect(numberToWordsRu.convert(1.00000001, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая одна стомиллионная'); - expect(numberToWordsRu.convert(1.2, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая две десятых'); - expect(numberToWordsRu.convert(1.02, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая две сотых'); - expect(numberToWordsRu.convert(1.002, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая две тысячных'); - expect(numberToWordsRu.convert(1.0002, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая две десятитысячных'); - expect(numberToWordsRu.convert(2.1, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две целых одна десятая'); - expect(numberToWordsRu.convert(1.000345, { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая триста сорок пять миллионных'); - }); - test('Дробные', () => { - expect(numberToWordsRu.convert('1/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна нулевая рубля'); - expect(numberToWordsRu.convert('1/', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна нулевая рубля'); - expect(numberToWordsRu.convert('2/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две нулевых рубля'); - expect(numberToWordsRu.convert('5/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Пять нулевых рубля'); - expect(numberToWordsRu.convert('11/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одиннадцать нулевых рубля'); - expect(numberToWordsRu.convert('20/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Двадцать нулевых рубля'); - expect(numberToWordsRu.convert('21/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Двадцать одна нулевая рубля'); - expect(numberToWordsRu.convert('100/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Сто нулевых рубля'); - expect(numberToWordsRu.convert('101/0', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Сто одна нулевая рубля'); - expect(numberToWordsRu.convert('0/2', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Ноль вторых рубля'); - expect(numberToWordsRu.convert('0/2000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Ноль двухтысячных рубля'); - expect(numberToWordsRu.convert('1/2', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна вторая рубля'); - expect(numberToWordsRu.convert('2/2', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две вторых рубля'); - expect(numberToWordsRu.convert('1/12', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна двенадцатая рубля'); - expect(numberToWordsRu.convert('2/12', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двенадцатых рубля'); - expect(numberToWordsRu.convert('1/22', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна двадцать вторая рубля'); - expect(numberToWordsRu.convert('2/22', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двадцать вторых рубля'); - expect(numberToWordsRu.convert('1/202', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна двести вторая рубля'); - expect(numberToWordsRu.convert('2/202', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двести вторых рубля'); - expect(numberToWordsRu.convert('1/222', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна двести двадцать вторая рубля'); - expect(numberToWordsRu.convert('2/222', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двести двадцать вторых рубля'); - expect(numberToWordsRu.convert('1/200', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна двухсотая рубля'); - expect(numberToWordsRu.convert('2/200', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двухсотых рубля'); - expect(numberToWordsRu.convert('1/1000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна тысячная рубля'); - expect(numberToWordsRu.convert('2/1000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две тысячных рубля'); - expect(numberToWordsRu.convert('2/2000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двухтысячных рубля'); - expect(numberToWordsRu.convert('2/2002', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две две тысячи вторых рубля'); - expect(numberToWordsRu.convert('2/2020', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две две тысячи двадцатых рубля'); - expect(numberToWordsRu.convert('2/2200', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две две тысячи двухсотых рубля'); - expect(numberToWordsRu.convert('2/2220', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две две тысячи двести двадцатых рубля'); - expect(numberToWordsRu.convert('2/2222', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две две тысячи двести двадцать вторых рубля'); - expect(numberToWordsRu.convert('2/20000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двадцатитысячных рубля'); - expect(numberToWordsRu.convert('2/25000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двадцатипятитысячных рубля'); - expect(numberToWordsRu.convert('2/200000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двухсоттысячных рубля'); - expect(numberToWordsRu.convert('2/2000000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двухмиллионных рубля'); - expect(numberToWordsRu.convert('2/235000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две двухсоттридцатипятитысячных рубля'); - expect(numberToWordsRu.convert('1/100000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна стотысячная рубля'); - expect(numberToWordsRu.convert('1/90000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна девяностотысячная рубля'); - expect(numberToWordsRu.convert('2/100000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две стотысячных рубля'); - expect(numberToWordsRu.convert('2/90000', { - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Две девяностотысячных рубля'); - }); - test('Остальные', () => { - expect(numberToWordsRu.convert(0)).toBe('Ноль рублей 00 копеек'); - expect(numberToWordsRu.convert(1)).toBe('Один рубль 00 копеек'); - expect(numberToWordsRu.convert(2)).toBe('Два рубля 00 копеек'); - expect(numberToWordsRu.convert(4)).toBe('Четыре рубля 00 копеек'); - expect(numberToWordsRu.convert(5)).toBe('Пять рублей 00 копеек'); - expect(numberToWordsRu.convert(9)).toBe('Девять рублей 00 копеек'); - expect(numberToWordsRu.convert(10)).toBe('Десять рублей 00 копеек'); - expect(numberToWordsRu.convert(11)).toBe('Одиннадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(12)).toBe('Двенадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(14)).toBe('Четырнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(15)).toBe('Пятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(19)).toBe('Девятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(20)).toBe('Двадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(21)).toBe('Двадцать один рубль 00 копеек'); - expect(numberToWordsRu.convert(22)).toBe('Двадцать два рубля 00 копеек'); - expect(numberToWordsRu.convert(24)).toBe('Двадцать четыре рубля 00 копеек'); - expect(numberToWordsRu.convert(25)).toBe('Двадцать пять рублей 00 копеек'); - expect(numberToWordsRu.convert(29)).toBe('Двадцать девять рублей 00 копеек'); - expect(numberToWordsRu.convert(100)).toBe('Сто рублей 00 копеек'); - expect(numberToWordsRu.convert(101)).toBe('Сто один рубль 00 копеек'); - expect(numberToWordsRu.convert(102)).toBe('Сто два рубля 00 копеек'); - expect(numberToWordsRu.convert(105)).toBe('Сто пять рублей 00 копеек'); - expect(numberToWordsRu.convert(109)).toBe('Сто девять рублей 00 копеек'); - expect(numberToWordsRu.convert(110)).toBe('Сто десять рублей 00 копеек'); - expect(numberToWordsRu.convert(111)).toBe('Сто одиннадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(115)).toBe('Сто пятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(121)).toBe('Сто двадцать один рубль 00 копеек'); - expect(numberToWordsRu.convert(122)).toBe('Сто двадцать два рубля 00 копеек'); - expect(numberToWordsRu.convert(125)).toBe('Сто двадцать пять рублей 00 копеек'); - expect(numberToWordsRu.convert(129)).toBe('Сто двадцать девять рублей 00 копеек'); - expect(numberToWordsRu.convert(1000)).toBe('Одна тысяча рублей 00 копеек'); - expect(numberToWordsRu.convert(1001)).toBe('Одна тысяча один рубль 00 копеек'); - expect(numberToWordsRu.convert(1002)).toBe('Одна тысяча два рубля 00 копеек'); - expect(numberToWordsRu.convert(1009)).toBe('Одна тысяча девять рублей 00 копеек'); - expect(numberToWordsRu.convert(1010)).toBe('Одна тысяча десять рублей 00 копеек'); - expect(numberToWordsRu.convert(1011)).toBe('Одна тысяча одиннадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(1012)).toBe('Одна тысяча двенадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(1019)).toBe('Одна тысяча девятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(1020)).toBe('Одна тысяча двадцать рублей 00 копеек'); - expect(numberToWordsRu.convert(1021)).toBe('Одна тысяча двадцать один рубль 00 копеек'); - expect(numberToWordsRu.convert(1022)).toBe('Одна тысяча двадцать два рубля 00 копеек'); - expect(numberToWordsRu.convert(1029)).toBe('Одна тысяча двадцать девять рублей 00 копеек'); - expect(numberToWordsRu.convert(2000)).toBe('Две тысячи рублей 00 копеек'); - expect(numberToWordsRu.convert(9000)).toBe('Девять тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(10101)).toBe('Десять тысяч сто один рубль 00 копеек'); - expect(numberToWordsRu.convert(10102)).toBe('Десять тысяч сто два рубля 00 копеек'); - expect(numberToWordsRu.convert(10109)).toBe('Десять тысяч сто девять рублей 00 копеек'); - expect(numberToWordsRu.convert(10121)).toBe('Десять тысяч сто двадцать один рубль 00 копеек'); - expect(numberToWordsRu.convert(100000)).toBe('Сто тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(101000)).toBe('Сто одна тысяча рублей 00 копеек'); - expect(numberToWordsRu.convert(102000)).toBe('Сто две тысячи рублей 00 копеек'); - expect(numberToWordsRu.convert(109000)).toBe('Сто девять тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(111000)).toBe('Сто одиннадцать тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(120000)).toBe('Сто двадцать тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(121000)).toBe('Сто двадцать одна тысяча рублей 00 копеек'); - expect(numberToWordsRu.convert(122000)).toBe('Сто двадцать две тысячи рублей 00 копеек'); - expect(numberToWordsRu.convert(129000)).toBe('Сто двадцать девять тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(200000)).toBe('Двести тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(300000)).toBe('Триста тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(400000)).toBe('Четыреста тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(500000)).toBe('Пятьсот тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(600000)).toBe('Шестьсот тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(700000)).toBe('Семьсот тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(800000)).toBe('Восемьсот тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(900000)).toBe('Девятьсот тысяч рублей 00 копеек'); - expect(numberToWordsRu.convert(1100100)).toBe('Один миллион сто тысяч сто рублей 00 копеек'); - expect(numberToWordsRu.convert(2200200)).toBe('Два миллиона двести тысяч двести рублей 00 копеек'); - expect(numberToWordsRu.convert(5500500)).toBe('Пять миллионов пятьсот тысяч пятьсот рублей 00 копеек'); - expect(numberToWordsRu.convert(11100100)).toBe('Одиннадцать миллионов сто тысяч сто рублей 00 копеек'); - expect(numberToWordsRu.convert(22200200)).toBe('Двадцать два миллиона двести тысяч двести рублей 00 копеек'); - expect(numberToWordsRu.convert(20200200)).toBe('Двадцать миллионов двести тысяч двести рублей 00 копеек'); - expect(numberToWordsRu.convert(21200200)).toBe('Двадцать один миллион двести тысяч двести рублей 00 копеек'); - expect(numberToWordsRu.convert(29200200)).toBe('Двадцать девять миллионов двести тысяч двести рублей 00 копеек'); - expect(numberToWordsRu.convert(100000000)).toBe('Сто миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(200000000)).toBe('Двести миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(300000000)).toBe('Триста миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(400000000)).toBe('Четыреста миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(500000000)).toBe('Пятьсот миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(600000000)).toBe('Шестьсот миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(700000000)).toBe('Семьсот миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(800000000)).toBe('Восемьсот миллионов рублей 00 копеек'); - expect(numberToWordsRu.convert(900000000)).toBe('Девятьсот миллионов рублей 00 копеек'); - }); -}); -describe('Options', () => { - describe('currency', () => { - describe('string values', () => { - test("'rub'", () => { - expect(numberToWordsRu.convert('1234567.12345', { - currency: 'rub', - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); - }); - test("'usd'", () => { - expect(numberToWordsRu.convert('1234567.12345', { - currency: 'usd', - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь долларов 12 центов'); - }); - test("'eur'", () => { - expect(numberToWordsRu.convert('1234567.12345', { - currency: 'eur', - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь евро 12 центов'); - }); - test("'number'", () => { - expect(numberToWordsRu.convert('1234567.12345', { - currency: 'number', - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь целых 12345 стотысячных'); - expect(numberToWordsRu.convert('1.8000', { - currency: 'number', - })).toBe('Одна целая 8000 десятитысячных'); - }); - test("'number' words", () => { - expect(numberToWordsRu.convert('1234567.12345', { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь целых двенадцать тысяч триста сорок пять стотысячных'); - expect(numberToWordsRu.convert('1.8000', { - currency: 'number', - convertNumbertToWords: { - fractional: true, - }, - })).toBe('Одна целая восемь тысяч десятитысячных'); - }); - }); - describe('object values', () => { - describe('common values', () => { - test('full objects', () => { - expect(numberToWordsRu.convert('1234567.12345', { - currency: { - currencyNameCases: ['доллар', 'доллара', 'долларов'], - fractionalPartNameCases: ['цент', 'цента', 'центов'], - currencyNounGender: { - integer: 0, // Мужской род - fractionalPart: 1, // Женский род - }, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь долларов 12345 центов'); - expect(numberToWordsRu.convert('1234567.12345', { - currency: { - currencyNameCases: ['доллар', 'доллара', 'долларов'], - fractionalPartNameCases: ['цент', 'цента', 'центов'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: 2, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь долларов 12 центов'); - expect(numberToWordsRu.convert('1.6789', { - currency: { - currencyNameCases: ['доллар', 'доллара', 'долларов'], - fractionalPartNameCases: ['цент', 'цента', 'центов'], - fractionalPartMinLength: 2, - }, - roundNumber: 1, - })).toBe('Один доллар 70 центов'); - expect(numberToWordsRu.convert('1.6789', { - currency: { - currencyNameCases: ['доллар', 'доллара', 'долларов'], - fractionalPartNameCases: ['цент', 'цента', 'центов'], - fractionalPartMinLength: 2, - }, - roundNumber: 0, - })).toBe('Два доллара 00 центов'); - expect(numberToWordsRu.convert('1.6789', { - currency: { - currencyNameCases: ['доллар', 'доллара', 'долларов'], - fractionalPartNameCases: ['цент', 'цента', 'центов'], - fractionalPartMinLength: 1, - }, - roundNumber: 0, - })).toBe('Два доллара 0 центов'); - expect(numberToWordsRu.convert('1.6789', { - currency: { - currencyNameCases: ['доллар', 'доллара', 'долларов'], - fractionalPartNameCases: ['цент', 'цента', 'центов'], - fractionalPartMinLength: 0, - }, - roundNumber: 0, - })).toBe('Два доллара'); - }); - test('not full objects', () => { - expect(numberToWordsRu.convert('1234561.12345', { - currency: { - currencyNameCases: ['сообщение', 'сообщения', 'сообщений'], - currencyNounGender: { - integer: 2, // Средний род - }, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят одно сообщение 12345 копеек'); - expect(numberToWordsRu.convert('1234567.12345', { - currency: {}, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12345 копеек'); - }); - }); - test('currencyNounGender == 2', () => { - expect(numberToWordsRu.convert('1231.52', { - currency: { - currencyNameCases: ['сообщение', 'сообщения', 'сообщений'], - fractionalPartNameCases: ['яблоко', 'яблока', 'яблок'], - currencyNounGender: { - integer: 2, // Средний род - fractionalPart: 2, - }, - }, - })).toBe('Одна тысяча двести тридцать одно сообщение 52 яблока'); - }); - }); - }); - describe('roundNumber', () => { - describe('slash delimiter', () => { - test('common currency', () => { - expect(numberToWordsRu.convert('1234/6789', { - currency: 'rub', - roundNumber: 8, - })).toBe('Одна тысяча двести тридцать четыре 6789 рубля'); - expect(numberToWordsRu.convert('1234/6789', { - currency: 'rub', - roundNumber: 2, - })).toBe('Одна тысяча двести тридцать четыре 6789 рубля'); - expect(numberToWordsRu.convert('1234/6789', { - currency: 'rub', - roundNumber: -1, - })).toBe('Одна тысяча двести тридцать четыре 6789 рубля'); - }); - test('currency "number"', () => { - expect(numberToWordsRu.convert('1234/6789', { - currency: 'number', - roundNumber: 8, - })).toBe('Одна тысяча двести тридцать четыре 6789'); - expect(numberToWordsRu.convert('1234/6789', { - currency: 'number', - roundNumber: 2, - })).toBe('Одна тысяча двести тридцать четыре 6789'); - expect(numberToWordsRu.convert('1234/6789', { - currency: 'number', - roundNumber: -1, - })).toBe('Одна тысяча двести тридцать четыре 6789'); - }); - test('custom currency', () => { - expect(numberToWordsRu.convert('1234/6789', { - currency: { - currencyNameCases: ['рубль', 'рубля', 'рублей'], - fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: 8, - })).toBe('Одна тысяча двести тридцать четыре 6789 рубля'); - expect(numberToWordsRu.convert('1234/6789', { - currency: { - currencyNameCases: ['рубль', 'рубля', 'рублей'], - fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: 2, - })).toBe('Одна тысяча двести тридцать четыре 6789 рубля'); - expect(numberToWordsRu.convert('1234/6789', { - currency: { - currencyNameCases: ['рубль', 'рубля', 'рублей'], - fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: -1, - })).toBe('Одна тысяча двести тридцать четыре 6789 рубля'); - }); - }); - describe('normal delimiter', () => { - test('common currency', () => { - expect(numberToWordsRu.convert('1234.6789', { - currency: 'rub', - roundNumber: 8, - })).toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); - expect(numberToWordsRu.convert('1234.6789', { - currency: 'rub', - roundNumber: 2, - })).toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); - expect(numberToWordsRu.convert('1234.6789', { - currency: 'rub', - roundNumber: 1, - })).toBe('Одна тысяча двести тридцать четыре рубля 70 копеек'); - expect(numberToWordsRu.convert('1234.6789', { - currency: 'rub', - roundNumber: 0, - })).toBe('Одна тысяча двести тридцать пять рублей 00 копеек'); - expect(numberToWordsRu.convert('1234.6789', { - currency: 'rub', - roundNumber: -1, - })).toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); - }); - test('currency "number"', () => { - expect(numberToWordsRu.convert('1234.6789', { - currency: 'number', - roundNumber: 8, - })).toBe('Одна тысяча двести тридцать четыре целых 6789 десятитысячных'); - expect(numberToWordsRu.convert('1234.6789', { - currency: 'number', - roundNumber: 2, - })).toBe('Одна тысяча двести тридцать четыре целых 68 сотых'); - expect(numberToWordsRu.convert('1234.6789', { - currency: 'number', - roundNumber: 0, - })).toBe('Одна тысяча двести тридцать пять целых'); - expect(numberToWordsRu.convert('1234.6789', { - currency: 'number', - roundNumber: -1, - })).toBe('Одна тысяча двести тридцать четыре целых 6789 десятитысячных'); - expect(numberToWordsRu.convert('1.9999', { - currency: 'number', - roundNumber: 3, - })).toBe('Две целых 0 десятых'); - expect(numberToWordsRu.convert('1.9999', { - currency: 'number', - roundNumber: 0, - })).toBe('Две целых'); - expect(numberToWordsRu.convert('1.00089', { - currency: 'number', - roundNumber: 5, - })).toBe('Одна целая 89 стотысячных'); - }); - test('custom currency', () => { - expect(numberToWordsRu.convert('1234.6789', { - currency: { - currencyNameCases: ['рубль', 'рубля', 'рублей'], - fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: 8, - })).toBe('Одна тысяча двести тридцать четыре рубля 6789 копеек'); - expect(numberToWordsRu.convert('1234.6789', { - currency: { - currencyNameCases: ['рубль', 'рубля', 'рублей'], - fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: 2, - })).toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); - expect(numberToWordsRu.convert('1234.6789', { - currency: { - currencyNameCases: ['рубль', 'рубля', 'рублей'], - fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: 0, - })).toBe('Одна тысяча двести тридцать пять рублей 00 копеек'); - expect(numberToWordsRu.convert('1234.6789', { - currency: { - currencyNameCases: ['рубль', 'рубля', 'рублей'], - fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], - currencyNounGender: { - integer: 0, - fractionalPart: 1, - }, - }, - roundNumber: -1, - })).toBe('Одна тысяча двести тридцать четыре рубля 6789 копеек'); - }); - }); - }); - test('convertMinusSignToWord', () => { - expect(numberToWordsRu.convert('-15.45', { - convertMinusSignToWord: true, - })).toBe('Минус пятнадцать рублей 45 копеек'); - expect(numberToWordsRu.convert('-15.45', { - convertMinusSignToWord: false, - })).toBe('- пятнадцать рублей 45 копеек'); - }); - test('showNumberParts', () => { - expect(numberToWordsRu.convert('1234567.12345', { - showNumberParts: { - integer: true, - fractional: true, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); - expect(numberToWordsRu.convert('1234567.12345', { - showNumberParts: { - integer: false, - fractional: false, - }, - })).toBe(''); - expect(numberToWordsRu.convert('1234567.12345', { - showNumberParts: { - integer: true, - fractional: false, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей'); - expect(numberToWordsRu.convert('1234567.12345', { - showNumberParts: { - integer: false, - fractional: true, - }, - })).toBe('12 копеек'); - }); - test('convertNumbertToWords', () => { - expect(numberToWordsRu.convert('1234567.12345', { - convertNumbertToWords: { - integer: true, - fractional: true, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей двенадцать копеек'); - expect(numberToWordsRu.convert('1234567.12345', { - convertNumbertToWords: { - integer: false, - fractional: false, - }, - })).toBe('1234567 рублей 12 копеек'); - expect(numberToWordsRu.convert('1234567.12345', { - convertNumbertToWords: { - integer: true, - fractional: false, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); - expect(numberToWordsRu.convert('1234567.12345', { - convertNumbertToWords: { - integer: false, - fractional: true, - }, - })).toBe('1234567 рублей двенадцать копеек'); - }); - test('showCurrency', () => { - expect(numberToWordsRu.convert('1234567.12345', { - showCurrency: { - integer: true, - fractional: true, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); - expect(numberToWordsRu.convert('1234567.12345', { - showCurrency: { - integer: false, - fractional: false, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь 12'); - expect(numberToWordsRu.convert('1234567.12345', { - showCurrency: { - integer: true, - fractional: false, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12'); - expect(numberToWordsRu.convert('1234567.12345', { - showCurrency: { - integer: false, - fractional: true, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь 12 копеек'); - }); - test('combined options', () => { - expect(numberToWordsRu.convert('1234567.12345', { - showNumberParts: { - integer: false, - }, - convertNumbertToWords: { - fractional: true, - }, - showCurrency: { - fractional: false, - }, - })).toBe('Двенадцать'); - expect(numberToWordsRu.convert('1234567.12345', { - currency: 'number', - showNumberParts: { - fractional: false, - }, - convertNumbertToWords: { - integer: true, - }, - showCurrency: { - integer: true, - }, - })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь целых'); - }); -}); -test('Проверка округления числа', () => { - expect(numberToWordsRu.convert('0.995')).toBe('Один рубль 00 копеек'); - expect(numberToWordsRu.convert('.995')).toBe('Один рубль 00 копеек'); - expect(numberToWordsRu.convert('0.505')).toBe('Ноль рублей 51 копейка'); - expect(numberToWordsRu.convert('50.995')).toBe('Пятьдесят один рубль 00 копеек'); - expect(numberToWordsRu.convert('50.994')).toBe('Пятьдесят рублей 99 копеек'); - expect(numberToWordsRu.convert('999.995')).toBe('Одна тысяча рублей 00 копеек'); - expect(numberToWordsRu.convert('15999.995')).toBe('Шестнадцать тысяч рублей 00 копеек'); -}); - -describe('Проверка падежей', () => { - test('Родительный', () => { - expect(numberToWordsRu.convert('0', {declension: 'genitive'})).toBe('Ноля рублей 00 копеек'); - expect(numberToWordsRu.convert('1', {declension: 'genitive'})).toBe('Одного рубля 00 копеек'); - expect(numberToWordsRu.convert('2', {declension: 'genitive'})).toBe('Двух рублей 00 копеек'); - expect(numberToWordsRu.convert('3', {declension: 'genitive'})).toBe('Трёх рублей 00 копеек'); - expect(numberToWordsRu.convert('4', {declension: 'genitive'})).toBe('Четырёх рублей 00 копеек'); - expect(numberToWordsRu.convert('5', {declension: 'genitive'})).toBe('Пяти рублей 00 копеек'); - expect(numberToWordsRu.convert('10', {declension: 'genitive'})).toBe('Десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('11', {declension: 'genitive'})).toBe('Одиннадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('12', {declension: 'genitive'})).toBe('Двенадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('13', {declension: 'genitive'})).toBe('Тринадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('14', {declension: 'genitive'})).toBe('Четырнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('15', {declension: 'genitive'})).toBe('Пятнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('16', {declension: 'genitive'})).toBe('Шестнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('17', {declension: 'genitive'})).toBe('Семнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('18', {declension: 'genitive'})).toBe('Восемнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('19', {declension: 'genitive'})).toBe('Девятнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('20', {declension: 'genitive'})).toBe('Двадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('21', {declension: 'genitive'})).toBe('Двадцати одного рубля 00 копеек'); - expect(numberToWordsRu.convert('30', {declension: 'genitive'})).toBe('Тридцати рублей 00 копеек'); - expect(numberToWordsRu.convert('32', {declension: 'genitive'})).toBe('Тридцати двух рублей 00 копеек'); - expect(numberToWordsRu.convert('40', {declension: 'genitive'})).toBe('Сорока рублей 00 копеек'); - expect(numberToWordsRu.convert('43', {declension: 'genitive'})).toBe('Сорока трёх рублей 00 копеек'); - expect(numberToWordsRu.convert('50', {declension: 'genitive'})).toBe('Пятидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('54', {declension: 'genitive'})).toBe('Пятидесяти четырёх рублей 00 копеек'); - expect(numberToWordsRu.convert('60', {declension: 'genitive'})).toBe('Шестидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('70', {declension: 'genitive'})).toBe('Семидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('80', {declension: 'genitive'})).toBe('Восьмидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('90', {declension: 'genitive'})).toBe('Девяноста рублей 00 копеек'); - expect(numberToWordsRu.convert('99', {declension: 'genitive'})).toBe('Девяноста девяти рублей 00 копеек'); - expect(numberToWordsRu.convert('100', {declension: 'genitive'})).toBe('Ста рублей 00 копеек'); - expect(numberToWordsRu.convert('101', {declension: 'genitive'})).toBe('Ста одного рубля 00 копеек'); - expect(numberToWordsRu.convert('110', {declension: 'genitive'})).toBe('Ста десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('200', {declension: 'genitive'})).toBe('Двухсот рублей 00 копеек'); - expect(numberToWordsRu.convert('201', {declension: 'genitive'})).toBe('Двухсот одного рубля 00 копеек'); - expect(numberToWordsRu.convert('210', {declension: 'genitive'})).toBe('Двухсот десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('500', {declension: 'genitive'})).toBe('Пятисот рублей 00 копеек'); - expect(numberToWordsRu.convert('501', {declension: 'genitive'})).toBe('Пятисот одного рубля 00 копеек'); - expect(numberToWordsRu.convert('510', {declension: 'genitive'})).toBe('Пятисот десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('1000', {declension: 'genitive'})).toBe('Одной тысячи рублей 00 копеек'); - expect(numberToWordsRu.convert('1001', {declension: 'genitive'})).toBe('Одной тысячи одного рубля 00 копеек'); - expect(numberToWordsRu.convert('1002', {declension: 'genitive'})).toBe('Одной тысячи двух рублей 00 копеек'); - expect(numberToWordsRu.convert('1005', {declension: 'genitive'})).toBe('Одной тысячи пяти рублей 00 копеек'); - expect(numberToWordsRu.convert('1100', {declension: 'genitive'})).toBe('Одной тысячи ста рублей 00 копеек'); - expect(numberToWordsRu.convert('1000000', {declension: 'genitive'})).toBe('Одного миллиона рублей 00 копеек'); - expect(numberToWordsRu.convert('987654321', {declension: 'genitive'})).toBe('Девятисот восьмидесяти семи миллионов шестисот пятидесяти четырёх тысяч трёхсот двадцати одного рубля 00 копеек'); - }); - test('Дательный', () => { - expect(numberToWordsRu.convert('0', {declension: 'dative'})).toBe('Нолю рублям 00 копейкам'); - expect(numberToWordsRu.convert('1', {declension: 'dative'})).toBe('Одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('2', {declension: 'dative'})).toBe('Двум рублям 00 копейкам'); - expect(numberToWordsRu.convert('3', {declension: 'dative'})).toBe('Трём рублям 00 копейкам'); - expect(numberToWordsRu.convert('4', {declension: 'dative'})).toBe('Четырём рублям 00 копейкам'); - expect(numberToWordsRu.convert('5', {declension: 'dative'})).toBe('Пяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('10', {declension: 'dative'})).toBe('Десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('11', {declension: 'dative'})).toBe('Одиннадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('12', {declension: 'dative'})).toBe('Двенадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('13', {declension: 'dative'})).toBe('Тринадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('14', {declension: 'dative'})).toBe('Четырнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('15', {declension: 'dative'})).toBe('Пятнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('16', {declension: 'dative'})).toBe('Шестнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('17', {declension: 'dative'})).toBe('Семнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('18', {declension: 'dative'})).toBe('Восемнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('19', {declension: 'dative'})).toBe('Девятнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('20', {declension: 'dative'})).toBe('Двадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('21', {declension: 'dative'})).toBe('Двадцати одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('30', {declension: 'dative'})).toBe('Тридцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('32', {declension: 'dative'})).toBe('Тридцати двум рублям 00 копейкам'); - expect(numberToWordsRu.convert('40', {declension: 'dative'})).toBe('Сорока рублям 00 копейкам'); - expect(numberToWordsRu.convert('43', {declension: 'dative'})).toBe('Сорока трём рублям 00 копейкам'); - expect(numberToWordsRu.convert('50', {declension: 'dative'})).toBe('Пятидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('54', {declension: 'dative'})).toBe('Пятидесяти четырём рублям 00 копейкам'); - expect(numberToWordsRu.convert('60', {declension: 'dative'})).toBe('Шестидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('70', {declension: 'dative'})).toBe('Семидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('80', {declension: 'dative'})).toBe('Восьмидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('90', {declension: 'dative'})).toBe('Девяноста рублям 00 копейкам'); - expect(numberToWordsRu.convert('99', {declension: 'dative'})).toBe('Девяноста девяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('100', {declension: 'dative'})).toBe('Ста рублям 00 копейкам'); - expect(numberToWordsRu.convert('101', {declension: 'dative'})).toBe('Ста одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('110', {declension: 'dative'})).toBe('Ста десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('200', {declension: 'dative'})).toBe('Двумстам рублям 00 копейкам'); - expect(numberToWordsRu.convert('201', {declension: 'dative'})).toBe('Двумстам одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('210', {declension: 'dative'})).toBe('Двумстам десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('500', {declension: 'dative'})).toBe('Пятистам рублям 00 копейкам'); - expect(numberToWordsRu.convert('501', {declension: 'dative'})).toBe('Пятистам одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('510', {declension: 'dative'})).toBe('Пятистам десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('1000', {declension: 'dative'})).toBe('Одной тысяче рублей 00 копейкам'); - expect(numberToWordsRu.convert('1001', {declension: 'dative'})).toBe('Одной тысяче одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('1002', {declension: 'dative'})).toBe('Одной тысяче двум рублям 00 копейкам'); - expect(numberToWordsRu.convert('1005', {declension: 'dative'})).toBe('Одной тысяче пяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('1100', {declension: 'dative'})).toBe('Одной тысяче ста рублям 00 копейкам'); - expect(numberToWordsRu.convert('1000000', {declension: 'dative'})).toBe('Одному миллиону рублей 00 копейкам'); - expect(numberToWordsRu.convert('987654321', {declension: 'dative'})).toBe('Девятистам восьмидесяти семи миллионам шестистам пятидесяти четырём тысячам трёмстам двадцати одному рублю 00 копейкам'); - }); - test('Винительный', () => { - expect(numberToWordsRu.convert('0', {declension: 'accusative'})).toBe('Ноль рублей 00 копеек'); - expect(numberToWordsRu.convert('1', {declension: 'accusative'})).toBe('Один рубль 00 копеек'); - expect(numberToWordsRu.convert('2', {declension: 'accusative'})).toBe('Два рубля 00 копеек'); - expect(numberToWordsRu.convert('3', {declension: 'accusative'})).toBe('Три рубля 00 копеек'); - expect(numberToWordsRu.convert('4', {declension: 'accusative'})).toBe('Четыре рубля 00 копеек'); - expect(numberToWordsRu.convert('5', {declension: 'accusative'})).toBe('Пять рублей 00 копеек'); - expect(numberToWordsRu.convert('10', {declension: 'accusative'})).toBe('Десять рублей 00 копеек'); - expect(numberToWordsRu.convert('11', {declension: 'accusative'})).toBe('Одиннадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('12', {declension: 'accusative'})).toBe('Двенадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('13', {declension: 'accusative'})).toBe('Тринадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('14', {declension: 'accusative'})).toBe('Четырнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('15', {declension: 'accusative'})).toBe('Пятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('16', {declension: 'accusative'})).toBe('Шестнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('17', {declension: 'accusative'})).toBe('Семнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('18', {declension: 'accusative'})).toBe('Восемнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('19', {declension: 'accusative'})).toBe('Девятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('20', {declension: 'accusative'})).toBe('Двадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('21', {declension: 'accusative'})).toBe('Двадцать один рубль 00 копеек'); - expect(numberToWordsRu.convert('30', {declension: 'accusative'})).toBe('Тридцать рублей 00 копеек'); - expect(numberToWordsRu.convert('32', {declension: 'accusative'})).toBe('Тридцать два рубля 00 копеек'); - expect(numberToWordsRu.convert('40', {declension: 'accusative'})).toBe('Сорок рублей 00 копеек'); - expect(numberToWordsRu.convert('43', {declension: 'accusative'})).toBe('Сорок три рубля 00 копеек'); - expect(numberToWordsRu.convert('50', {declension: 'accusative'})).toBe('Пятьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('54', {declension: 'accusative'})).toBe('Пятьдесят четыре рубля 00 копеек'); - expect(numberToWordsRu.convert('60', {declension: 'accusative'})).toBe('Шестьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('70', {declension: 'accusative'})).toBe('Семьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('80', {declension: 'accusative'})).toBe('Восемьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('90', {declension: 'accusative'})).toBe('Девяносто рублей 00 копеек'); - expect(numberToWordsRu.convert('99', {declension: 'accusative'})).toBe('Девяносто девять рублей 00 копеек'); - expect(numberToWordsRu.convert('100', {declension: 'accusative'})).toBe('Сто рублей 00 копеек'); - expect(numberToWordsRu.convert('101', {declension: 'accusative'})).toBe('Сто один рубль 00 копеек'); - expect(numberToWordsRu.convert('110', {declension: 'accusative'})).toBe('Сто десять рублей 00 копеек'); - expect(numberToWordsRu.convert('200', {declension: 'accusative'})).toBe('Двести рублей 00 копеек'); - expect(numberToWordsRu.convert('201', {declension: 'accusative'})).toBe('Двести один рубль 00 копеек'); - expect(numberToWordsRu.convert('210', {declension: 'accusative'})).toBe('Двести десять рублей 00 копеек'); - expect(numberToWordsRu.convert('500', {declension: 'accusative'})).toBe('Пятьсот рублей 00 копеек'); - expect(numberToWordsRu.convert('501', {declension: 'accusative'})).toBe('Пятьсот один рубль 00 копеек'); - expect(numberToWordsRu.convert('510', {declension: 'accusative'})).toBe('Пятьсот десять рублей 00 копеек'); - expect(numberToWordsRu.convert('1000', {declension: 'accusative'})).toBe('Одну тысячу рублей 00 копеек'); - expect(numberToWordsRu.convert('1001', {declension: 'accusative'})).toBe('Одну тысячу один рубль 00 копеек'); - expect(numberToWordsRu.convert('1002', {declension: 'accusative'})).toBe('Одну тысячу два рубля 00 копеек'); - expect(numberToWordsRu.convert('1005', {declension: 'accusative'})).toBe('Одну тысячу пять рублей 00 копеек'); - expect(numberToWordsRu.convert('1100', {declension: 'accusative'})).toBe('Одну тысячу сто рублей 00 копеек'); - expect(numberToWordsRu.convert('1000000', {declension: 'accusative'})).toBe('Один миллион рублей 00 копеек'); - expect(numberToWordsRu.convert('987654321', {declension: 'accusative'})).toBe('Девятьсот восемьдесят семь миллионов шестьсот пятьдесят четыре тысячи триста двадцать один рубль 00 копеек'); - }); - test('Творительный', () => { - expect(numberToWordsRu.convert('0', {declension: 'instrumental'})).toBe('Нолём рублями 00 копейками'); - expect(numberToWordsRu.convert('1', {declension: 'instrumental'})).toBe('Одним рублём 00 копейками'); - expect(numberToWordsRu.convert('2', {declension: 'instrumental'})).toBe('Двумя рублями 00 копейками'); - expect(numberToWordsRu.convert('3', {declension: 'instrumental'})).toBe('Тремя рублями 00 копейками'); - expect(numberToWordsRu.convert('4', {declension: 'instrumental'})).toBe('Четырьмя рублями 00 копейками'); - expect(numberToWordsRu.convert('5', {declension: 'instrumental'})).toBe('Пятью рублями 00 копейками'); - expect(numberToWordsRu.convert('10', {declension: 'instrumental'})).toBe('Десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('11', {declension: 'instrumental'})).toBe('Одиннадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('12', {declension: 'instrumental'})).toBe('Двенадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('13', {declension: 'instrumental'})).toBe('Тринадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('14', {declension: 'instrumental'})).toBe('Четырнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('15', {declension: 'instrumental'})).toBe('Пятнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('16', {declension: 'instrumental'})).toBe('Шестнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('17', {declension: 'instrumental'})).toBe('Семнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('18', {declension: 'instrumental'})).toBe('Восемнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('19', {declension: 'instrumental'})).toBe('Девятнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('20', {declension: 'instrumental'})).toBe('Двадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('21', {declension: 'instrumental'})).toBe('Двадцатью одним рублём 00 копейками'); - expect(numberToWordsRu.convert('30', {declension: 'instrumental'})).toBe('Тридцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('32', {declension: 'instrumental'})).toBe('Тридцатью двумя рублями 00 копейками'); - expect(numberToWordsRu.convert('40', {declension: 'instrumental'})).toBe('Сорока рублями 00 копейками'); - expect(numberToWordsRu.convert('43', {declension: 'instrumental'})).toBe('Сорока тремя рублями 00 копейками'); - expect(numberToWordsRu.convert('50', {declension: 'instrumental'})).toBe('Пятьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('54', {declension: 'instrumental'})).toBe('Пятьюдесятью четырьмя рублями 00 копейками'); - expect(numberToWordsRu.convert('60', {declension: 'instrumental'})).toBe('Шестьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('70', {declension: 'instrumental'})).toBe('Семьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('80', {declension: 'instrumental'})).toBe('Восемьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('90', {declension: 'instrumental'})).toBe('Девяноста рублями 00 копейками'); - expect(numberToWordsRu.convert('99', {declension: 'instrumental'})).toBe('Девяноста девятью рублями 00 копейками'); - expect(numberToWordsRu.convert('100', {declension: 'instrumental'})).toBe('Ста рублями 00 копейками'); - expect(numberToWordsRu.convert('101', {declension: 'instrumental'})).toBe('Ста одним рублём 00 копейками'); - expect(numberToWordsRu.convert('110', {declension: 'instrumental'})).toBe('Ста десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('200', {declension: 'instrumental'})).toBe('Двумястами рублями 00 копейками'); - expect(numberToWordsRu.convert('201', {declension: 'instrumental'})).toBe('Двумястами одним рублём 00 копейками'); - expect(numberToWordsRu.convert('210', {declension: 'instrumental'})).toBe('Двумястами десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('500', {declension: 'instrumental'})).toBe('Пятьюстами рублями 00 копейками'); - expect(numberToWordsRu.convert('501', {declension: 'instrumental'})).toBe('Пятьюстами одним рублём 00 копейками'); - expect(numberToWordsRu.convert('510', {declension: 'instrumental'})).toBe('Пятьюстами десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('1000', {declension: 'instrumental'})).toBe('Одной тысячей рублей 00 копейками'); - expect(numberToWordsRu.convert('1001', {declension: 'instrumental'})).toBe('Одной тысячей одним рублём 00 копейками'); - expect(numberToWordsRu.convert('1002', {declension: 'instrumental'})).toBe('Одной тысячей двумя рублями 00 копейками'); - expect(numberToWordsRu.convert('1005', {declension: 'instrumental'})).toBe('Одной тысячей пятью рублями 00 копейками'); - expect(numberToWordsRu.convert('1100', {declension: 'instrumental'})).toBe('Одной тысячей ста рублями 00 копейками'); - expect(numberToWordsRu.convert('1000000', {declension: 'instrumental'})).toBe('Одним миллионом рублей 00 копейками'); - expect(numberToWordsRu.convert('987654321', {declension: 'instrumental'})).toBe('Девятьюстами восемьюдесятью семью миллионами шестьюстами пятьюдесятью четырьмя тысячами тремястами двадцатью одним рублём 00 копейками'); - }); - test('Предложный', () => { - expect(numberToWordsRu.convert('0', {declension: 'prepositional'})).toBe('Ноле рублях 00 копейках'); - expect(numberToWordsRu.convert('1', {declension: 'prepositional'})).toBe('Одном рубле 00 копейках'); - expect(numberToWordsRu.convert('2', {declension: 'prepositional'})).toBe('Двух рублях 00 копейках'); - expect(numberToWordsRu.convert('3', {declension: 'prepositional'})).toBe('Трёх рублях 00 копейках'); - expect(numberToWordsRu.convert('4', {declension: 'prepositional'})).toBe('Четырёх рублях 00 копейках'); - expect(numberToWordsRu.convert('5', {declension: 'prepositional'})).toBe('Пяти рублях 00 копейках'); - expect(numberToWordsRu.convert('10', {declension: 'prepositional'})).toBe('Десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('11', {declension: 'prepositional'})).toBe('Одиннадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('12', {declension: 'prepositional'})).toBe('Двенадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('13', {declension: 'prepositional'})).toBe('Тринадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('14', {declension: 'prepositional'})).toBe('Четырнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('15', {declension: 'prepositional'})).toBe('Пятнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('16', {declension: 'prepositional'})).toBe('Шестнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('17', {declension: 'prepositional'})).toBe('Семнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('18', {declension: 'prepositional'})).toBe('Восемнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('19', {declension: 'prepositional'})).toBe('Девятнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('20', {declension: 'prepositional'})).toBe('Двадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('21', {declension: 'prepositional'})).toBe('Двадцати одном рубле 00 копейках'); - expect(numberToWordsRu.convert('30', {declension: 'prepositional'})).toBe('Тридцати рублях 00 копейках'); - expect(numberToWordsRu.convert('32', {declension: 'prepositional'})).toBe('Тридцати двух рублях 00 копейках'); - expect(numberToWordsRu.convert('40', {declension: 'prepositional'})).toBe('Сорока рублях 00 копейках'); - expect(numberToWordsRu.convert('43', {declension: 'prepositional'})).toBe('Сорока трёх рублях 00 копейках'); - expect(numberToWordsRu.convert('50', {declension: 'prepositional'})).toBe('Пятидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('54', {declension: 'prepositional'})).toBe('Пятидесяти четырёх рублях 00 копейках'); - expect(numberToWordsRu.convert('60', {declension: 'prepositional'})).toBe('Шестидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('70', {declension: 'prepositional'})).toBe('Семидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('80', {declension: 'prepositional'})).toBe('Восьмидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('90', {declension: 'prepositional'})).toBe('Девяноста рублях 00 копейках'); - expect(numberToWordsRu.convert('99', {declension: 'prepositional'})).toBe('Девяноста девяти рублях 00 копейках'); - expect(numberToWordsRu.convert('100', {declension: 'prepositional'})).toBe('Ста рублях 00 копейках'); - expect(numberToWordsRu.convert('101', {declension: 'prepositional'})).toBe('Ста одном рубле 00 копейках'); - expect(numberToWordsRu.convert('110', {declension: 'prepositional'})).toBe('Ста десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('200', {declension: 'prepositional'})).toBe('Двухстах рублях 00 копейках'); - expect(numberToWordsRu.convert('201', {declension: 'prepositional'})).toBe('Двухстах одном рубле 00 копейках'); - expect(numberToWordsRu.convert('210', {declension: 'prepositional'})).toBe('Двухстах десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('500', {declension: 'prepositional'})).toBe('Пятистах рублях 00 копейках'); - expect(numberToWordsRu.convert('501', {declension: 'prepositional'})).toBe('Пятистах одном рубле 00 копейках'); - expect(numberToWordsRu.convert('510', {declension: 'prepositional'})).toBe('Пятистах десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('1000', {declension: 'prepositional'})).toBe('Одной тысяче рублей 00 копейках'); - expect(numberToWordsRu.convert('1001', {declension: 'prepositional'})).toBe('Одной тысяче одном рубле 00 копейках'); - expect(numberToWordsRu.convert('1002', {declension: 'prepositional'})).toBe('Одной тысяче двух рублях 00 копейках'); - expect(numberToWordsRu.convert('1005', {declension: 'prepositional'})).toBe('Одной тысяче пяти рублях 00 копейках'); - expect(numberToWordsRu.convert('1100', {declension: 'prepositional'})).toBe('Одной тысяче ста рублях 00 копейках'); - expect(numberToWordsRu.convert('1000000', {declension: 'prepositional'})).toBe('Одном миллионе рублей 00 копейках'); - expect(numberToWordsRu.convert('987654321', {declension: 'prepositional'})).toBe('Девятистах восьмидесяти семи миллионах шестистах пятидесяти четырёх тысячах трёхстах двадцати одном рубле 00 копейках'); - }); -}); diff --git a/test/methods/convert/convert.test.js b/test/methods/convert/convert.test.js new file mode 100644 index 0000000..8d3981d --- /dev/null +++ b/test/methods/convert/convert.test.js @@ -0,0 +1,594 @@ +const root = '../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +describe('Проверка входных данных', () => { + test('Пустая строка', () => { + expect(numberToWordsRu.convert('')).toBe('Ноль рублей 00 копеек'); + }); + test('Пустое значение', () => { + expect(numberToWordsRu.convert()).toBe('Ноль рублей 00 копеек'); + }); + describe('Допустимые знаки', () => { + test('Знак `-`', () => { + expect(numberToWordsRu.convert('-')).toBe('Минус ноль рублей 00 копеек'); + }); + test('Знак `.`', () => { + expect(numberToWordsRu.convert('.')).toBe('Ноль рублей 00 копеек'); + }); + test('Знак `,`', () => { + expect(numberToWordsRu.convert(',')).toBe('Ноль рублей 00 копеек'); + }); + test('Знак `/`', () => { + expect(numberToWordsRu.convert('/')).toBe('Ноль 0 рубля'); + }); + }); + describe('Недопустимые знаки', () => { + test('Буквы', () => { + expect(numberToWordsRu.convert('XZ')).toBe('Ноль рублей 00 копеек'); + }); + test('Символы', () => { + expect(numberToWordsRu + .convert('`~!@"#№$;%^:&?*_+=\'\\()[]{}<>')) + .toBe('Ноль рублей 00 копеек'); + }); + }); + describe('Недопустимые типы данных', () => { + test('null', () => { + expect(numberToWordsRu.convert(null)).toBe('Ноль рублей 00 копеек'); + }); + test('undefined', () => { + expect(numberToWordsRu.convert(undefined)).toBe('Ноль рублей 00 копеек'); + }); + test('boolean', () => { + expect(numberToWordsRu.convert(true)).toBe('Ноль рублей 00 копеек'); + }); + test('symbol', () => { + expect(numberToWordsRu.convert(Symbol())).toBe('Ноль рублей 00 копеек'); + }); + test('bigInt', () => { + expect(numberToWordsRu.convert(BigInt(1))).toBe('Ноль рублей 00 копеек'); + }); + test('object', () => { + expect(numberToWordsRu.convert({})).toBe('Ноль рублей 00 копеек'); + }); + test('function', () => { + expect(numberToWordsRu.convert(function(){})) + .toBe('Ноль рублей 00 копеек'); + }); + }); +}); + +describe('Проверка чисел', () => { + test('Отрицательные', () => { + expect(numberToWordsRu.convert(-2)).toBe('Минус два рубля 00 копеек'); + }); + test('Десятичные', () => { + expect(numberToWordsRu.convert(1.01)).toBe('Один рубль 01 копейка'); + expect(numberToWordsRu.convert(1.02)).toBe('Один рубль 02 копейки'); + expect(numberToWordsRu.convert(1.04)).toBe('Один рубль 04 копейки'); + expect(numberToWordsRu.convert(1.05)).toBe('Один рубль 05 копеек'); + expect(numberToWordsRu.convert(1.09)).toBe('Один рубль 09 копеек'); + expect(numberToWordsRu.convert(1.10)).toBe('Один рубль 10 копеек'); + expect(numberToWordsRu.convert(1.11)).toBe('Один рубль 11 копеек'); + expect(numberToWordsRu.convert(1.12)).toBe('Один рубль 12 копеек'); + expect(numberToWordsRu.convert(1.20)).toBe('Один рубль 20 копеек'); + expect(numberToWordsRu.convert(1.21)).toBe('Один рубль 21 копейка'); + expect(numberToWordsRu.convert(1.22)).toBe('Один рубль 22 копейки'); + expect(numberToWordsRu.convert(1.29)).toBe('Один рубль 29 копеек'); + }); + test('Без валюты (целые, десятые и т.д.)', () => { + expect(numberToWordsRu.convert(0.1, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Ноль целых одна десятая'); + expect(numberToWordsRu.convert(1.1, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна десятая'); + expect(numberToWordsRu.convert(1.01, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна сотая'); + expect(numberToWordsRu.convert(1.001, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна тысячная'); + expect(numberToWordsRu.convert(1.0001, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна десятитысячная'); + expect(numberToWordsRu.convert(1.00001, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна стотысячная'); + expect(numberToWordsRu.convert(1.000001, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна миллионная'); + expect(numberToWordsRu.convert(1.0000001, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна десятимиллионная'); + expect(numberToWordsRu.convert(1.00000001, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая одна стомиллионная'); + expect(numberToWordsRu.convert(1.2, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая две десятых'); + expect(numberToWordsRu.convert(1.02, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая две сотых'); + expect(numberToWordsRu.convert(1.002, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая две тысячных'); + expect(numberToWordsRu.convert(1.0002, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая две десятитысячных'); + expect(numberToWordsRu.convert(2.1, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две целых одна десятая'); + expect(numberToWordsRu.convert(1.000345, { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая триста сорок пять миллионных'); + }); + test('Дробные', () => { + expect(numberToWordsRu.convert('1/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна нулевая рубля'); + expect(numberToWordsRu.convert('1/', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна нулевая рубля'); + expect(numberToWordsRu.convert('2/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две нулевых рубля'); + expect(numberToWordsRu.convert('5/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Пять нулевых рубля'); + expect(numberToWordsRu.convert('11/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одиннадцать нулевых рубля'); + expect(numberToWordsRu.convert('20/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Двадцать нулевых рубля'); + expect(numberToWordsRu.convert('21/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Двадцать одна нулевая рубля'); + expect(numberToWordsRu.convert('100/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Сто нулевых рубля'); + expect(numberToWordsRu.convert('101/0', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Сто одна нулевая рубля'); + expect(numberToWordsRu.convert('0/2', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Ноль вторых рубля'); + expect(numberToWordsRu.convert('0/2000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Ноль двухтысячных рубля'); + expect(numberToWordsRu.convert('1/2', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна вторая рубля'); + expect(numberToWordsRu.convert('2/2', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две вторых рубля'); + expect(numberToWordsRu.convert('1/12', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна двенадцатая рубля'); + expect(numberToWordsRu.convert('2/12', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двенадцатых рубля'); + expect(numberToWordsRu.convert('1/22', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна двадцать вторая рубля'); + expect(numberToWordsRu.convert('2/22', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двадцать вторых рубля'); + expect(numberToWordsRu.convert('1/202', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна двести вторая рубля'); + expect(numberToWordsRu.convert('2/202', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двести вторых рубля'); + expect(numberToWordsRu.convert('1/222', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна двести двадцать вторая рубля'); + expect(numberToWordsRu.convert('2/222', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двести двадцать вторых рубля'); + expect(numberToWordsRu.convert('1/200', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна двухсотая рубля'); + expect(numberToWordsRu.convert('2/200', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двухсотых рубля'); + expect(numberToWordsRu.convert('1/1000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна тысячная рубля'); + expect(numberToWordsRu.convert('2/1000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две тысячных рубля'); + expect(numberToWordsRu.convert('2/2000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двухтысячных рубля'); + expect(numberToWordsRu.convert('2/2002', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две две тысячи вторых рубля'); + expect(numberToWordsRu.convert('2/2020', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две две тысячи двадцатых рубля'); + expect(numberToWordsRu.convert('2/2200', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две две тысячи двухсотых рубля'); + expect(numberToWordsRu.convert('2/2220', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две две тысячи двести двадцатых рубля'); + expect(numberToWordsRu.convert('2/2222', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две две тысячи двести двадцать вторых рубля'); + expect(numberToWordsRu.convert('2/20000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двадцатитысячных рубля'); + expect(numberToWordsRu.convert('2/25000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двадцатипятитысячных рубля'); + expect(numberToWordsRu.convert('2/200000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двухсоттысячных рубля'); + expect(numberToWordsRu.convert('2/2000000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двухмиллионных рубля'); + expect(numberToWordsRu.convert('2/235000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двухсоттридцатипятитысячных рубля'); + expect(numberToWordsRu.convert('1/100000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна стотысячная рубля'); + expect(numberToWordsRu.convert('1/90000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна девяностотысячная рубля'); + expect(numberToWordsRu.convert('2/100000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две стотысячных рубля'); + expect(numberToWordsRu.convert('2/90000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две девяностотысячных рубля'); + }); + test('Остальные', () => { + expect(numberToWordsRu.convert(0)) + .toBe('Ноль рублей 00 копеек'); + expect(numberToWordsRu.convert(1)) + .toBe('Один рубль 00 копеек'); + expect(numberToWordsRu.convert(2)) + .toBe('Два рубля 00 копеек'); + expect(numberToWordsRu.convert(4)) + .toBe('Четыре рубля 00 копеек'); + expect(numberToWordsRu.convert(5)) + .toBe('Пять рублей 00 копеек'); + expect(numberToWordsRu.convert(9)) + .toBe('Девять рублей 00 копеек'); + expect(numberToWordsRu.convert(10)) + .toBe('Десять рублей 00 копеек'); + expect(numberToWordsRu.convert(11)) + .toBe('Одиннадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(12)) + .toBe('Двенадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(14)) + .toBe('Четырнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(15)) + .toBe('Пятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(19)) + .toBe('Девятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(20)) + .toBe('Двадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(21)) + .toBe('Двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert(22)) + .toBe('Двадцать два рубля 00 копеек'); + expect(numberToWordsRu.convert(24)) + .toBe('Двадцать четыре рубля 00 копеек'); + expect(numberToWordsRu.convert(25)) + .toBe('Двадцать пять рублей 00 копеек'); + expect(numberToWordsRu.convert(29)) + .toBe('Двадцать девять рублей 00 копеек'); + expect(numberToWordsRu.convert(100)) + .toBe('Сто рублей 00 копеек'); + expect(numberToWordsRu.convert(101)) + .toBe('Сто один рубль 00 копеек'); + expect(numberToWordsRu.convert(102)) + .toBe('Сто два рубля 00 копеек'); + expect(numberToWordsRu.convert(105)) + .toBe('Сто пять рублей 00 копеек'); + expect(numberToWordsRu.convert(109)) + .toBe('Сто девять рублей 00 копеек'); + expect(numberToWordsRu.convert(110)) + .toBe('Сто десять рублей 00 копеек'); + expect(numberToWordsRu.convert(111)) + .toBe('Сто одиннадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(115)) + .toBe('Сто пятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(121)) + .toBe('Сто двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert(122)) + .toBe('Сто двадцать два рубля 00 копеек'); + expect(numberToWordsRu.convert(125)) + .toBe('Сто двадцать пять рублей 00 копеек'); + expect(numberToWordsRu.convert(129)) + .toBe('Сто двадцать девять рублей 00 копеек'); + expect(numberToWordsRu.convert(1000)) + .toBe('Одна тысяча рублей 00 копеек'); + expect(numberToWordsRu.convert(1001)) + .toBe('Одна тысяча один рубль 00 копеек'); + expect(numberToWordsRu.convert(1002)) + .toBe('Одна тысяча два рубля 00 копеек'); + expect(numberToWordsRu.convert(1009)) + .toBe('Одна тысяча девять рублей 00 копеек'); + expect(numberToWordsRu.convert(1010)) + .toBe('Одна тысяча десять рублей 00 копеек'); + expect(numberToWordsRu.convert(1011)) + .toBe('Одна тысяча одиннадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(1012)) + .toBe('Одна тысяча двенадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(1019)) + .toBe('Одна тысяча девятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(1020)) + .toBe('Одна тысяча двадцать рублей 00 копеек'); + expect(numberToWordsRu.convert(1021)) + .toBe('Одна тысяча двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert(1022)) + .toBe('Одна тысяча двадцать два рубля 00 копеек'); + expect(numberToWordsRu.convert(1029)) + .toBe('Одна тысяча двадцать девять рублей 00 копеек'); + expect(numberToWordsRu.convert(2000)) + .toBe('Две тысячи рублей 00 копеек'); + expect(numberToWordsRu.convert(9000)) + .toBe('Девять тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(10101)) + .toBe('Десять тысяч сто один рубль 00 копеек'); + expect(numberToWordsRu.convert(10102)) + .toBe('Десять тысяч сто два рубля 00 копеек'); + expect(numberToWordsRu.convert(10109)) + .toBe('Десять тысяч сто девять рублей 00 копеек'); + expect(numberToWordsRu.convert(10121)) + .toBe('Десять тысяч сто двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert(100000)) + .toBe('Сто тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(101000)) + .toBe('Сто одна тысяча рублей 00 копеек'); + expect(numberToWordsRu.convert(102000)) + .toBe('Сто две тысячи рублей 00 копеек'); + expect(numberToWordsRu.convert(109000)) + .toBe('Сто девять тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(111000)) + .toBe('Сто одиннадцать тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(120000)) + .toBe('Сто двадцать тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(121000)) + .toBe('Сто двадцать одна тысяча рублей 00 копеек'); + expect(numberToWordsRu.convert(122000)) + .toBe('Сто двадцать две тысячи рублей 00 копеек'); + expect(numberToWordsRu.convert(129000)) + .toBe('Сто двадцать девять тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(200000)) + .toBe('Двести тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(300000)) + .toBe('Триста тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(400000)) + .toBe('Четыреста тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(500000)) + .toBe('Пятьсот тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(600000)) + .toBe('Шестьсот тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(700000)) + .toBe('Семьсот тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(800000)) + .toBe('Восемьсот тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(900000)) + .toBe('Девятьсот тысяч рублей 00 копеек'); + expect(numberToWordsRu.convert(1100100)) + .toBe('Один миллион сто тысяч сто рублей 00 копеек'); + expect(numberToWordsRu.convert(2200200)) + .toBe('Два миллиона двести тысяч двести рублей 00 копеек'); + expect(numberToWordsRu.convert(5500500)) + .toBe('Пять миллионов пятьсот тысяч пятьсот рублей 00 копеек'); + expect(numberToWordsRu.convert(11100100)) + .toBe('Одиннадцать миллионов сто тысяч сто рублей 00 копеек'); + expect(numberToWordsRu.convert(22200200)) + .toBe('Двадцать два миллиона двести тысяч двести рублей 00 копеек'); + expect(numberToWordsRu.convert(20200200)) + .toBe('Двадцать миллионов двести тысяч двести рублей 00 копеек'); + expect(numberToWordsRu.convert(21200200)) + .toBe('Двадцать один миллион двести тысяч двести рублей 00 копеек'); + expect(numberToWordsRu.convert(29200200)) + .toBe('Двадцать девять миллионов двести тысяч двести рублей 00 копеек'); + expect(numberToWordsRu.convert(100000000)) + .toBe('Сто миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(200000000)) + .toBe('Двести миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(300000000)) + .toBe('Триста миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(400000000)) + .toBe('Четыреста миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(500000000)) + .toBe('Пятьсот миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(600000000)) + .toBe('Шестьсот миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(700000000)) + .toBe('Семьсот миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(800000000)) + .toBe('Восемьсот миллионов рублей 00 копеек'); + expect(numberToWordsRu.convert(900000000)) + .toBe('Девятьсот миллионов рублей 00 копеек'); + }); +}); diff --git a/test/methods/convert/options/convertMinusSignToWord.test.js b/test/methods/convert/options/convertMinusSignToWord.test.js new file mode 100644 index 0000000..c3ba321 --- /dev/null +++ b/test/methods/convert/options/convertMinusSignToWord.test.js @@ -0,0 +1,11 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +test('convertMinusSignToWord', () => { + expect(numberToWordsRu.convert('-15.45', { + convertMinusSignToWord: true, + })).toBe('Минус пятнадцать рублей 45 копеек'); + expect(numberToWordsRu.convert('-15.45', { + convertMinusSignToWord: false, + })).toBe('- пятнадцать рублей 45 копеек'); +}); diff --git a/test/methods/convert/options/convertNumbertToWords.test.js b/test/methods/convert/options/convertNumbertToWords.test.js new file mode 100644 index 0000000..8de948a --- /dev/null +++ b/test/methods/convert/options/convertNumbertToWords.test.js @@ -0,0 +1,33 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +test('convertNumbertToWords', () => { + expect(numberToWordsRu.convert('1234567.12345', { + convertNumbertToWords: { + integer: true, + fractional: true, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей двенадцать копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + convertNumbertToWords: { + integer: true, + fractional: false, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + convertNumbertToWords: { + integer: false, + fractional: true, + }, + })) + .toBe('1234567 рублей двенадцать копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + convertNumbertToWords: { + integer: false, + fractional: false, + }, + })) + .toBe('1234567 рублей 12 копеек'); +}); diff --git a/test/methods/convert/options/currency.test.js b/test/methods/convert/options/currency.test.js new file mode 100644 index 0000000..0b01ffb --- /dev/null +++ b/test/methods/convert/options/currency.test.js @@ -0,0 +1,106 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +describe('currency', () => { + describe('string values', () => { + test("'rub'", () => { + expect(numberToWordsRu.convert('1234567.12345', { + currency: 'rub', + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); + }); + test("'usd'", () => { + expect(numberToWordsRu.convert('1234567.12345', { + currency: 'usd', + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь долларов 12 центов'); + }); + test("'eur'", () => { + expect(numberToWordsRu.convert('1234567.12345', { + currency: 'eur', + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь евро 12 центов'); + }); + test("'number'", () => { + expect(numberToWordsRu.convert('1234567.12345', { + currency: 'number', + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь целых 12345 стотысячных'); + expect(numberToWordsRu.convert('1.8000', { + currency: 'number', + })) + .toBe('Одна целая 8000 десятитысячных'); + expect(numberToWordsRu.convert('1234567.12345', { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь целых двенадцать тысяч триста сорок пять стотысячных'); + expect(numberToWordsRu.convert('1.8000', { + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна целая восемь тысяч десятитысячных'); + }); + }); + describe('object values', () => { + expect(numberToWordsRu.convert('1234567.12345', { + currency: { + currencyNameCases: ['доллар', 'доллара', 'долларов'], + fractionalPartNameCases: ['цент', 'цента', 'центов'], + currencyNounGender: { + integer: 0, // Мужской род + fractionalPart: 1, // Женский род + }, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь долларов 12345 центов'); + expect(numberToWordsRu.convert('1.6789', { + currency: { + currencyNameCases: ['доллар', 'доллара', 'долларов'], + fractionalPartNameCases: ['цент', 'цента', 'центов'], + fractionalPartMinLength: 1, + }, + roundNumber: 0, + })) + .toBe('Два доллара 0 центов'); + expect(numberToWordsRu.convert('1.6789', { + currency: { + currencyNameCases: ['доллар', 'доллара', 'долларов'], + fractionalPartNameCases: ['цент', 'цента', 'центов'], + fractionalPartMinLength: 0, + }, + roundNumber: 0, + })) + .toBe('Два доллара'); + test('Средний род (currencyNounGender == 2)', () => { + expect(numberToWordsRu.convert('1231.52', { + currency: { + currencyNameCases: ['сообщение', 'сообщения', 'сообщений'], + fractionalPartNameCases: ['яблоко', 'яблока', 'яблок'], + currencyNounGender: { + integer: 2, // Средний род + fractionalPart: 2, + }, + }, + })) + .toBe('Одна тысяча двести тридцать одно сообщение 52 яблока'); + }); + expect(numberToWordsRu.convert('1234561.12345', { + currency: { + currencyNameCases: ['сообщение', 'сообщения', 'сообщений'], + currencyNounGender: { + integer: 2, // Средний род + }, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят одно сообщение 12345 копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + currency: {}, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12345 копеек'); + }); +}); diff --git a/test/methods/convert/options/declension.test.js b/test/methods/convert/options/declension.test.js new file mode 100644 index 0000000..62b5169 --- /dev/null +++ b/test/methods/convert/options/declension.test.js @@ -0,0 +1,577 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +describe('Проверка падежей', () => { + test('Родительный', () => { + expect(numberToWordsRu.convert('0', {declension: 'genitive'})) + .toBe('Ноля рублей 00 копеек'); + expect(numberToWordsRu.convert('1', {declension: 'genitive'})) + .toBe('Одного рубля 00 копеек'); + expect(numberToWordsRu.convert('2', {declension: 'genitive'})) + .toBe('Двух рублей 00 копеек'); + expect(numberToWordsRu.convert('3', {declension: 'genitive'})) + .toBe('Трёх рублей 00 копеек'); + expect(numberToWordsRu.convert('4', {declension: 'genitive'})) + .toBe('Четырёх рублей 00 копеек'); + expect(numberToWordsRu.convert('5', {declension: 'genitive'})) + .toBe('Пяти рублей 00 копеек'); + expect(numberToWordsRu.convert('10', {declension: 'genitive'})) + .toBe('Десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('11', {declension: 'genitive'})) + .toBe('Одиннадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('12', {declension: 'genitive'})) + .toBe('Двенадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('13', {declension: 'genitive'})) + .toBe('Тринадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('14', {declension: 'genitive'})) + .toBe('Четырнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('15', {declension: 'genitive'})) + .toBe('Пятнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('16', {declension: 'genitive'})) + .toBe('Шестнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('17', {declension: 'genitive'})) + .toBe('Семнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('18', {declension: 'genitive'})) + .toBe('Восемнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('19', {declension: 'genitive'})) + .toBe('Девятнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('20', {declension: 'genitive'})) + .toBe('Двадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('21', {declension: 'genitive'})) + .toBe('Двадцати одного рубля 00 копеек'); + expect(numberToWordsRu.convert('30', {declension: 'genitive'})) + .toBe('Тридцати рублей 00 копеек'); + expect(numberToWordsRu.convert('32', {declension: 'genitive'})) + .toBe('Тридцати двух рублей 00 копеек'); + expect(numberToWordsRu.convert('40', {declension: 'genitive'})) + .toBe('Сорока рублей 00 копеек'); + expect(numberToWordsRu.convert('43', {declension: 'genitive'})) + .toBe('Сорока трёх рублей 00 копеек'); + expect(numberToWordsRu.convert('50', {declension: 'genitive'})) + .toBe('Пятидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('54', {declension: 'genitive'})) + .toBe('Пятидесяти четырёх рублей 00 копеек'); + expect(numberToWordsRu.convert('60', {declension: 'genitive'})) + .toBe('Шестидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('70', {declension: 'genitive'})) + .toBe('Семидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('80', {declension: 'genitive'})) + .toBe('Восьмидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('90', {declension: 'genitive'})) + .toBe('Девяноста рублей 00 копеек'); + expect(numberToWordsRu.convert('99', {declension: 'genitive'})) + .toBe('Девяноста девяти рублей 00 копеек'); + expect(numberToWordsRu.convert('100', {declension: 'genitive'})) + .toBe('Ста рублей 00 копеек'); + expect(numberToWordsRu.convert('101', {declension: 'genitive'})) + .toBe('Ста одного рубля 00 копеек'); + expect(numberToWordsRu.convert('110', {declension: 'genitive'})) + .toBe('Ста десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('200', {declension: 'genitive'})) + .toBe('Двухсот рублей 00 копеек'); + expect(numberToWordsRu.convert('201', {declension: 'genitive'})) + .toBe('Двухсот одного рубля 00 копеек'); + expect(numberToWordsRu.convert('210', {declension: 'genitive'})) + .toBe('Двухсот десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('500', {declension: 'genitive'})) + .toBe('Пятисот рублей 00 копеек'); + expect(numberToWordsRu.convert('501', {declension: 'genitive'})) + .toBe('Пятисот одного рубля 00 копеек'); + expect(numberToWordsRu.convert('510', {declension: 'genitive'})) + .toBe('Пятисот десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('1000', {declension: 'genitive'})) + .toBe('Одной тысячи рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', {declension: 'genitive'})) + .toBe('Одной тысячи одного рубля 00 копеек'); + expect(numberToWordsRu.convert('1002', {declension: 'genitive'})) + .toBe('Одной тысячи двух рублей 00 копеек'); + expect(numberToWordsRu.convert('1005', {declension: 'genitive'})) + .toBe('Одной тысячи пяти рублей 00 копеек'); + expect(numberToWordsRu.convert('1100', {declension: 'genitive'})) + .toBe('Одной тысячи ста рублей 00 копеек'); + expect(numberToWordsRu.convert('1000000', {declension: 'genitive'})) + .toBe('Одного миллиона рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', {declension: 'genitive'})) + .toBe('Девятисот восьмидесяти семи миллионов шестисот пятидесяти четырёх тысяч трёхсот двадцати одного рубля 00 копеек'); + expect(numberToWordsRu.convert('1001121.01', {declension: 'genitive', convertNumbertToWords: {fractional: true}})) + .toBe('Одного миллиона одной тысячи ста двадцати одного рубля одной копейки'); + expect(numberToWordsRu.convert('2002122.02', {declension: 'genitive', convertNumbertToWords: {fractional: true}})) + .toBe('Двух миллионов двух тысяч ста двадцати двух рублей двух копеек'); + expect(numberToWordsRu.convert('5005125.05', {declension: 'genitive', convertNumbertToWords: {fractional: true}})) + .toBe('Пяти миллионов пяти тысяч ста двадцати пяти рублей пяти копеек'); + }); + test('Дательный', () => { + expect(numberToWordsRu.convert('0', {declension: 'dative'})) + .toBe('Нолю рублям 00 копейкам'); + expect(numberToWordsRu.convert('1', {declension: 'dative'})) + .toBe('Одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('2', {declension: 'dative'})) + .toBe('Двум рублям 00 копейкам'); + expect(numberToWordsRu.convert('3', {declension: 'dative'})) + .toBe('Трём рублям 00 копейкам'); + expect(numberToWordsRu.convert('4', {declension: 'dative'})) + .toBe('Четырём рублям 00 копейкам'); + expect(numberToWordsRu.convert('5', {declension: 'dative'})) + .toBe('Пяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('10', {declension: 'dative'})) + .toBe('Десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('11', {declension: 'dative'})) + .toBe('Одиннадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('12', {declension: 'dative'})) + .toBe('Двенадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('13', {declension: 'dative'})) + .toBe('Тринадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('14', {declension: 'dative'})) + .toBe('Четырнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('15', {declension: 'dative'})) + .toBe('Пятнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('16', {declension: 'dative'})) + .toBe('Шестнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('17', {declension: 'dative'})) + .toBe('Семнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('18', {declension: 'dative'})) + .toBe('Восемнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('19', {declension: 'dative'})) + .toBe('Девятнадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('20', {declension: 'dative'})) + .toBe('Двадцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('21', {declension: 'dative'})) + .toBe('Двадцати одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('30', {declension: 'dative'})) + .toBe('Тридцати рублям 00 копейкам'); + expect(numberToWordsRu.convert('32', {declension: 'dative'})) + .toBe('Тридцати двум рублям 00 копейкам'); + expect(numberToWordsRu.convert('40', {declension: 'dative'})) + .toBe('Сорока рублям 00 копейкам'); + expect(numberToWordsRu.convert('43', {declension: 'dative'})) + .toBe('Сорока трём рублям 00 копейкам'); + expect(numberToWordsRu.convert('50', {declension: 'dative'})) + .toBe('Пятидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('54', {declension: 'dative'})) + .toBe('Пятидесяти четырём рублям 00 копейкам'); + expect(numberToWordsRu.convert('60', {declension: 'dative'})) + .toBe('Шестидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('70', {declension: 'dative'})) + .toBe('Семидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('80', {declension: 'dative'})) + .toBe('Восьмидесяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('90', {declension: 'dative'})) + .toBe('Девяноста рублям 00 копейкам'); + expect(numberToWordsRu.convert('99', {declension: 'dative'})) + .toBe('Девяноста девяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('100', {declension: 'dative'})) + .toBe('Ста рублям 00 копейкам'); + expect(numberToWordsRu.convert('101', {declension: 'dative'})) + .toBe('Ста одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('110', {declension: 'dative'})) + .toBe('Ста десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('200', {declension: 'dative'})) + .toBe('Двумстам рублям 00 копейкам'); + expect(numberToWordsRu.convert('201', {declension: 'dative'})) + .toBe('Двумстам одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('210', {declension: 'dative'})) + .toBe('Двумстам десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('500', {declension: 'dative'})) + .toBe('Пятистам рублям 00 копейкам'); + expect(numberToWordsRu.convert('501', {declension: 'dative'})) + .toBe('Пятистам одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('510', {declension: 'dative'})) + .toBe('Пятистам десяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('1000', {declension: 'dative'})) + .toBe('Одной тысяче рублей 00 копейкам'); + expect(numberToWordsRu.convert('1001', {declension: 'dative'})) + .toBe('Одной тысяче одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('1002', {declension: 'dative'})) + .toBe('Одной тысяче двум рублям 00 копейкам'); + expect(numberToWordsRu.convert('1005', {declension: 'dative'})) + .toBe('Одной тысяче пяти рублям 00 копейкам'); + expect(numberToWordsRu.convert('1100', {declension: 'dative'})) + .toBe('Одной тысяче ста рублям 00 копейкам'); + expect(numberToWordsRu.convert('1000000', {declension: 'dative'})) + .toBe('Одному миллиону рублей 00 копейкам'); + expect(numberToWordsRu.convert('987654321', {declension: 'dative'})) + .toBe('Девятистам восьмидесяти семи миллионам шестистам пятидесяти четырём тысячам трёмстам двадцати одному рублю 00 копейкам'); + expect(numberToWordsRu.convert('1001121.01', {declension: 'dative', convertNumbertToWords: {fractional: true}})) + .toBe('Одному миллиону одной тысяче ста двадцати одному рублю одной копейке'); + expect(numberToWordsRu.convert('2002122.02', {declension: 'dative', convertNumbertToWords: {fractional: true}})) + .toBe('Двум миллионам двум тысячам ста двадцати двум рублям двум копейкам'); + expect(numberToWordsRu.convert('5005125.05', {declension: 'dative', convertNumbertToWords: {fractional: true}})) + .toBe('Пяти миллионам пяти тысячам ста двадцати пяти рублям пяти копейкам'); + }); + test('Винительный', () => { + expect(numberToWordsRu.convert('0', {declension: 'accusative'})) + .toBe('Ноль рублей 00 копеек'); + expect(numberToWordsRu.convert('1', {declension: 'accusative'})) + .toBe('Один рубль 00 копеек'); + expect(numberToWordsRu.convert('2', {declension: 'accusative'})) + .toBe('Два рубля 00 копеек'); + expect(numberToWordsRu.convert('3', {declension: 'accusative'})) + .toBe('Три рубля 00 копеек'); + expect(numberToWordsRu.convert('4', {declension: 'accusative'})) + .toBe('Четыре рубля 00 копеек'); + expect(numberToWordsRu.convert('5', {declension: 'accusative'})) + .toBe('Пять рублей 00 копеек'); + expect(numberToWordsRu.convert('10', {declension: 'accusative'})) + .toBe('Десять рублей 00 копеек'); + expect(numberToWordsRu.convert('11', {declension: 'accusative'})) + .toBe('Одиннадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('12', {declension: 'accusative'})) + .toBe('Двенадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('13', {declension: 'accusative'})) + .toBe('Тринадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('14', {declension: 'accusative'})) + .toBe('Четырнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('15', {declension: 'accusative'})) + .toBe('Пятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('16', {declension: 'accusative'})) + .toBe('Шестнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('17', {declension: 'accusative'})) + .toBe('Семнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('18', {declension: 'accusative'})) + .toBe('Восемнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('19', {declension: 'accusative'})) + .toBe('Девятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('20', {declension: 'accusative'})) + .toBe('Двадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('21', {declension: 'accusative'})) + .toBe('Двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert('30', {declension: 'accusative'})) + .toBe('Тридцать рублей 00 копеек'); + expect(numberToWordsRu.convert('32', {declension: 'accusative'})) + .toBe('Тридцать два рубля 00 копеек'); + expect(numberToWordsRu.convert('40', {declension: 'accusative'})) + .toBe('Сорок рублей 00 копеек'); + expect(numberToWordsRu.convert('43', {declension: 'accusative'})) + .toBe('Сорок три рубля 00 копеек'); + expect(numberToWordsRu.convert('50', {declension: 'accusative'})) + .toBe('Пятьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('54', {declension: 'accusative'})) + .toBe('Пятьдесят четыре рубля 00 копеек'); + expect(numberToWordsRu.convert('60', {declension: 'accusative'})) + .toBe('Шестьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('70', {declension: 'accusative'})) + .toBe('Семьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('80', {declension: 'accusative'})) + .toBe('Восемьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('90', {declension: 'accusative'})) + .toBe('Девяносто рублей 00 копеек'); + expect(numberToWordsRu.convert('99', {declension: 'accusative'})) + .toBe('Девяносто девять рублей 00 копеек'); + expect(numberToWordsRu.convert('100', {declension: 'accusative'})) + .toBe('Сто рублей 00 копеек'); + expect(numberToWordsRu.convert('101', {declension: 'accusative'})) + .toBe('Сто один рубль 00 копеек'); + expect(numberToWordsRu.convert('110', {declension: 'accusative'})) + .toBe('Сто десять рублей 00 копеек'); + expect(numberToWordsRu.convert('200', {declension: 'accusative'})) + .toBe('Двести рублей 00 копеек'); + expect(numberToWordsRu.convert('201', {declension: 'accusative'})) + .toBe('Двести один рубль 00 копеек'); + expect(numberToWordsRu.convert('210', {declension: 'accusative'})) + .toBe('Двести десять рублей 00 копеек'); + expect(numberToWordsRu.convert('500', {declension: 'accusative'})) + .toBe('Пятьсот рублей 00 копеек'); + expect(numberToWordsRu.convert('501', {declension: 'accusative'})) + .toBe('Пятьсот один рубль 00 копеек'); + expect(numberToWordsRu.convert('510', {declension: 'accusative'})) + .toBe('Пятьсот десять рублей 00 копеек'); + expect(numberToWordsRu.convert('1000', {declension: 'accusative'})) + .toBe('Одну тысячу рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', {declension: 'accusative'})) + .toBe('Одну тысячу один рубль 00 копеек'); + expect(numberToWordsRu.convert('1002', {declension: 'accusative'})) + .toBe('Одну тысячу два рубля 00 копеек'); + expect(numberToWordsRu.convert('1005', {declension: 'accusative'})) + .toBe('Одну тысячу пять рублей 00 копеек'); + expect(numberToWordsRu.convert('1100', {declension: 'accusative'})) + .toBe('Одну тысячу сто рублей 00 копеек'); + expect(numberToWordsRu.convert('1000000', {declension: 'accusative'})) + .toBe('Один миллион рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', {declension: 'accusative'})) + .toBe('Девятьсот восемьдесят семь миллионов шестьсот пятьдесят четыре тысячи триста двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert('1001121.01', {declension: 'accusative', convertNumbertToWords: {fractional: true}})) + .toBe('Один миллион одну тысячу сто двадцать один рубль одну копейку'); + expect(numberToWordsRu.convert('2002122.02', {declension: 'accusative', convertNumbertToWords: {fractional: true}})) + .toBe('Два миллиона две тысячи сто двадцать два рубля две копейки'); + expect(numberToWordsRu.convert('5005125.05', {declension: 'accusative', convertNumbertToWords: {fractional: true}})) + .toBe('Пять миллионов пять тысяч сто двадцать пять рублей пять копеек'); + }); + test('Творительный', () => { + expect(numberToWordsRu.convert('0', {declension: 'instrumental'})) + .toBe('Нолём рублями 00 копейками'); + expect(numberToWordsRu.convert('1', {declension: 'instrumental'})) + .toBe('Одним рублём 00 копейками'); + expect(numberToWordsRu.convert('2', {declension: 'instrumental'})) + .toBe('Двумя рублями 00 копейками'); + expect(numberToWordsRu.convert('3', {declension: 'instrumental'})) + .toBe('Тремя рублями 00 копейками'); + expect(numberToWordsRu.convert('4', {declension: 'instrumental'})) + .toBe('Четырьмя рублями 00 копейками'); + expect(numberToWordsRu.convert('5', {declension: 'instrumental'})) + .toBe('Пятью рублями 00 копейками'); + expect(numberToWordsRu.convert('10', {declension: 'instrumental'})) + .toBe('Десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('11', {declension: 'instrumental'})) + .toBe('Одиннадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('12', {declension: 'instrumental'})) + .toBe('Двенадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('13', {declension: 'instrumental'})) + .toBe('Тринадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('14', {declension: 'instrumental'})) + .toBe('Четырнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('15', {declension: 'instrumental'})) + .toBe('Пятнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('16', {declension: 'instrumental'})) + .toBe('Шестнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('17', {declension: 'instrumental'})) + .toBe('Семнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('18', {declension: 'instrumental'})) + .toBe('Восемнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('19', {declension: 'instrumental'})) + .toBe('Девятнадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('20', {declension: 'instrumental'})) + .toBe('Двадцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('21', {declension: 'instrumental'})) + .toBe('Двадцатью одним рублём 00 копейками'); + expect(numberToWordsRu.convert('30', {declension: 'instrumental'})) + .toBe('Тридцатью рублями 00 копейками'); + expect(numberToWordsRu.convert('32', {declension: 'instrumental'})) + .toBe('Тридцатью двумя рублями 00 копейками'); + expect(numberToWordsRu.convert('40', {declension: 'instrumental'})) + .toBe('Сорока рублями 00 копейками'); + expect(numberToWordsRu.convert('43', {declension: 'instrumental'})) + .toBe('Сорока тремя рублями 00 копейками'); + expect(numberToWordsRu.convert('50', {declension: 'instrumental'})) + .toBe('Пятьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('54', {declension: 'instrumental'})) + .toBe('Пятьюдесятью четырьмя рублями 00 копейками'); + expect(numberToWordsRu.convert('60', {declension: 'instrumental'})) + .toBe('Шестьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('70', {declension: 'instrumental'})) + .toBe('Семьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('80', {declension: 'instrumental'})) + .toBe('Восемьюдесятью рублями 00 копейками'); + expect(numberToWordsRu.convert('90', {declension: 'instrumental'})) + .toBe('Девяноста рублями 00 копейками'); + expect(numberToWordsRu.convert('99', {declension: 'instrumental'})) + .toBe('Девяноста девятью рублями 00 копейками'); + expect(numberToWordsRu.convert('100', {declension: 'instrumental'})) + .toBe('Ста рублями 00 копейками'); + expect(numberToWordsRu.convert('101', {declension: 'instrumental'})) + .toBe('Ста одним рублём 00 копейками'); + expect(numberToWordsRu.convert('110', {declension: 'instrumental'})) + .toBe('Ста десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('200', {declension: 'instrumental'})) + .toBe('Двумястами рублями 00 копейками'); + expect(numberToWordsRu.convert('201', {declension: 'instrumental'})) + .toBe('Двумястами одним рублём 00 копейками'); + expect(numberToWordsRu.convert('210', {declension: 'instrumental'})) + .toBe('Двумястами десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('500', {declension: 'instrumental'})) + .toBe('Пятьюстами рублями 00 копейками'); + expect(numberToWordsRu.convert('501', {declension: 'instrumental'})) + .toBe('Пятьюстами одним рублём 00 копейками'); + expect(numberToWordsRu.convert('510', {declension: 'instrumental'})) + .toBe('Пятьюстами десятью рублями 00 копейками'); + expect(numberToWordsRu.convert('1000', {declension: 'instrumental'})) + .toBe('Одной тысячей рублей 00 копейками'); + expect(numberToWordsRu.convert('1001', {declension: 'instrumental'})) + .toBe('Одной тысячей одним рублём 00 копейками'); + expect(numberToWordsRu.convert('1002', {declension: 'instrumental'})) + .toBe('Одной тысячей двумя рублями 00 копейками'); + expect(numberToWordsRu.convert('1005', {declension: 'instrumental'})) + .toBe('Одной тысячей пятью рублями 00 копейками'); + expect(numberToWordsRu.convert('1100', {declension: 'instrumental'})) + .toBe('Одной тысячей ста рублями 00 копейками'); + expect(numberToWordsRu.convert('1000000', {declension: 'instrumental'})) + .toBe('Одним миллионом рублей 00 копейками'); + expect(numberToWordsRu.convert('987654321', {declension: 'instrumental'})) + .toBe('Девятьюстами восемьюдесятью семью миллионами шестьюстами пятьюдесятью четырьмя тысячами тремястами двадцатью одним рублём 00 копейками'); + expect(numberToWordsRu.convert('1001121.01', {declension: 'instrumental', convertNumbertToWords: {fractional: true}})) + .toBe('Одним миллионом одной тысячей ста двадцатью одним рублём одной копейкой'); + expect(numberToWordsRu.convert('2002122.02', {declension: 'instrumental', convertNumbertToWords: {fractional: true}})) + .toBe('Двумя миллионами двумя тысячами ста двадцатью двумя рублями двумя копейками'); + expect(numberToWordsRu.convert('5005125.05', {declension: 'instrumental', convertNumbertToWords: {fractional: true}})) + .toBe('Пятью миллионами пятью тысячами ста двадцатью пятью рублями пятью копейками'); + }); + test('Предложный', () => { + expect(numberToWordsRu.convert('0', {declension: 'prepositional'})) + .toBe('Ноле рублях 00 копейках'); + expect(numberToWordsRu.convert('1', {declension: 'prepositional'})) + .toBe('Одном рубле 00 копейках'); + expect(numberToWordsRu.convert('2', {declension: 'prepositional'})) + .toBe('Двух рублях 00 копейках'); + expect(numberToWordsRu.convert('3', {declension: 'prepositional'})) + .toBe('Трёх рублях 00 копейках'); + expect(numberToWordsRu.convert('4', {declension: 'prepositional'})) + .toBe('Четырёх рублях 00 копейках'); + expect(numberToWordsRu.convert('5', {declension: 'prepositional'})) + .toBe('Пяти рублях 00 копейках'); + expect(numberToWordsRu.convert('10', {declension: 'prepositional'})) + .toBe('Десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('11', {declension: 'prepositional'})) + .toBe('Одиннадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('12', {declension: 'prepositional'})) + .toBe('Двенадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('13', {declension: 'prepositional'})) + .toBe('Тринадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('14', {declension: 'prepositional'})) + .toBe('Четырнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('15', {declension: 'prepositional'})) + .toBe('Пятнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('16', {declension: 'prepositional'})) + .toBe('Шестнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('17', {declension: 'prepositional'})) + .toBe('Семнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('18', {declension: 'prepositional'})) + .toBe('Восемнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('19', {declension: 'prepositional'})) + .toBe('Девятнадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('20', {declension: 'prepositional'})) + .toBe('Двадцати рублях 00 копейках'); + expect(numberToWordsRu.convert('21', {declension: 'prepositional'})) + .toBe('Двадцати одном рубле 00 копейках'); + expect(numberToWordsRu.convert('30', {declension: 'prepositional'})) + .toBe('Тридцати рублях 00 копейках'); + expect(numberToWordsRu.convert('32', {declension: 'prepositional'})) + .toBe('Тридцати двух рублях 00 копейках'); + expect(numberToWordsRu.convert('40', {declension: 'prepositional'})) + .toBe('Сорока рублях 00 копейках'); + expect(numberToWordsRu.convert('43', {declension: 'prepositional'})) + .toBe('Сорока трёх рублях 00 копейках'); + expect(numberToWordsRu.convert('50', {declension: 'prepositional'})) + .toBe('Пятидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('54', {declension: 'prepositional'})) + .toBe('Пятидесяти четырёх рублях 00 копейках'); + expect(numberToWordsRu.convert('60', {declension: 'prepositional'})) + .toBe('Шестидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('70', {declension: 'prepositional'})) + .toBe('Семидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('80', {declension: 'prepositional'})) + .toBe('Восьмидесяти рублях 00 копейках'); + expect(numberToWordsRu.convert('90', {declension: 'prepositional'})) + .toBe('Девяноста рублях 00 копейках'); + expect(numberToWordsRu.convert('99', {declension: 'prepositional'})) + .toBe('Девяноста девяти рублях 00 копейках'); + expect(numberToWordsRu.convert('100', {declension: 'prepositional'})) + .toBe('Ста рублях 00 копейках'); + expect(numberToWordsRu.convert('101', {declension: 'prepositional'})) + .toBe('Ста одном рубле 00 копейках'); + expect(numberToWordsRu.convert('110', {declension: 'prepositional'})) + .toBe('Ста десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('200', {declension: 'prepositional'})) + .toBe('Двухстах рублях 00 копейках'); + expect(numberToWordsRu.convert('201', {declension: 'prepositional'})) + .toBe('Двухстах одном рубле 00 копейках'); + expect(numberToWordsRu.convert('210', {declension: 'prepositional'})) + .toBe('Двухстах десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('500', {declension: 'prepositional'})) + .toBe('Пятистах рублях 00 копейках'); + expect(numberToWordsRu.convert('501', {declension: 'prepositional'})) + .toBe('Пятистах одном рубле 00 копейках'); + expect(numberToWordsRu.convert('510', {declension: 'prepositional'})) + .toBe('Пятистах десяти рублях 00 копейках'); + expect(numberToWordsRu.convert('1000', {declension: 'prepositional'})) + .toBe('Одной тысяче рублей 00 копейках'); + expect(numberToWordsRu.convert('1001', {declension: 'prepositional'})) + .toBe('Одной тысяче одном рубле 00 копейках'); + expect(numberToWordsRu.convert('1002', {declension: 'prepositional'})) + .toBe('Одной тысяче двух рублях 00 копейках'); + expect(numberToWordsRu.convert('1005', {declension: 'prepositional'})) + .toBe('Одной тысяче пяти рублях 00 копейках'); + expect(numberToWordsRu.convert('1100', {declension: 'prepositional'})) + .toBe('Одной тысяче ста рублях 00 копейках'); + expect(numberToWordsRu.convert('1000000', {declension: 'prepositional'})) + .toBe('Одном миллионе рублей 00 копейках'); + expect(numberToWordsRu.convert('987654321', {declension: 'prepositional'})) + .toBe('Девятистах восьмидесяти семи миллионах шестистах пятидесяти четырёх тысячах трёхстах двадцати одном рубле 00 копейках'); + expect(numberToWordsRu.convert('1001121.01', {declension: 'prepositional', convertNumbertToWords: {fractional: true}})) + .toBe('Одном миллионе одной тысяче ста двадцати одном рубле одной копейке'); + expect(numberToWordsRu.convert('2002122.02', {declension: 'prepositional', convertNumbertToWords: {fractional: true}})) + .toBe('Двух миллионах двух тысячах ста двадцати двух рублях двух копейках'); + expect(numberToWordsRu.convert('5005125.05', {declension: 'prepositional', convertNumbertToWords: {fractional: true}})) + .toBe('Пяти миллионах пяти тысячах ста двадцати пяти рублях пяти копейках'); + }); + // describe('Падежи с настроенной валютой', () => { + // test('Объект падежей не указан', () => { + + // }); + // test('Объект падежей указан', () => { + + // }); + // expect(numberToWordsRu.convert('4011123.02', { + // declension: 'nominative', + // currency: { + // currencyNameCases: ['доллар', 'доллара', 'долларов'], + // fractionalPartNameCases: ['цент', 'цента', 'центов'], + // currencyNounGender: { + // integer: 0, + // fractionalPart: 0, + // }, + // }, + // convertNumbertToWords: { + // integer: true, + // fractional: true, + // }, + // })) + // .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати трёх рублей двух копеек'); + // expect(numberToWordsRu.convert('4011123.02', { + // declension: 'instrumental', + // currency: { + // currencyNameCases: ['доллар', 'доллара', 'долларов'], + // fractionalPartNameCases: ['цент', 'цента', 'центов'], + // currencyNounGender: { + // integer: 0, + // fractionalPart: 0, + // }, + // }, + // convertNumbertToWords: { + // integer: true, + // fractional: true, + // }, + // })) + // .toBe('Четырьмя миллионами одиннадцатью тысячами ста двадцатью тремя рублями двумя копейками'); + // expect(numberToWordsRu.convert('4011121.02', { + // declension: 'genitive', + // currency: { + // currencyNameCases: ['доллар', 'доллара', 'долларов'], + // fractionalPartNameCases: ['цент', 'цента', 'центов'], + // currencyNounGender: { + // integer: 0, + // fractionalPart: 0, + // }, + // }, + // convertNumbertToWords: { + // integer: true, + // fractional: true, + // }, + // })) + // .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати одного рубля двух копеек'); + // expect(numberToWordsRu.convert('4011121.02', { + // declension: 'instrumental', + // currencyNameCases: ['доллар', 'доллара', 'долларов'], + // currencyNameDeclensions: { + // [declensions.NOMINATIVE]: ['доллар', 'доллары'], + // [declensions.GENITIVE]: ['доллара', 'долларов'], + // [declensions.DATIVE]: ['доллару', 'долларам'], + // [declensions.ACCUSATIVE]: ['доллар', 'доллары'], + // [declensions.INSTRUMENTAL]: ['долларом', 'долларами'], + // [declensions.PREPOSITIONAL]: ['долларе', 'долларах'], + // }, + // fractionalPartNameCases: ['цент', 'цента', 'центов'], + // fractionalPartNameDeclensions: { + // [declensions.NOMINATIVE]: ['цент', 'центы'], + // [declensions.GENITIVE]: ['цента', 'центов'], + // [declensions.DATIVE]: ['центу', 'центам'], + // [declensions.ACCUSATIVE]: ['цент', 'центы'], + // [declensions.INSTRUMENTAL]: ['центом', 'центами'], + // [declensions.PREPOSITIONAL]: ['центе', 'центах'], + // }, + // currencyNounGender: { + // integer: 0, + // fractionalPart: 0, + // }, + // })) + // .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати одного доллара двух центов'); + // }); +}); diff --git a/test/methods/convert/options/options.test.js b/test/methods/convert/options/options.test.js new file mode 100644 index 0000000..e674173 --- /dev/null +++ b/test/methods/convert/options/options.test.js @@ -0,0 +1,28 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +test('combined options', () => { + expect(numberToWordsRu.convert('1234567.12345', { + showNumberParts: { + integer: false, + }, + convertNumbertToWords: { + fractional: true, + }, + showCurrency: { + fractional: false, + }, + })).toBe('Двенадцать'); + expect(numberToWordsRu.convert('1234567.12345', { + currency: 'number', + showNumberParts: { + fractional: false, + }, + convertNumbertToWords: { + integer: true, + }, + showCurrency: { + integer: true, + }, + })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь целых'); +}); diff --git a/test/methods/convert/options/roundNumber.test.js b/test/methods/convert/options/roundNumber.test.js new file mode 100644 index 0000000..0d8e5f7 --- /dev/null +++ b/test/methods/convert/options/roundNumber.test.js @@ -0,0 +1,211 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +describe('roundNumber', () => { + test('Проверка вариантов округления', () => { + expect(numberToWordsRu.convert('0.995')) + .toBe('Один рубль 00 копеек'); + expect(numberToWordsRu.convert('.995')) + .toBe('Один рубль 00 копеек'); + expect(numberToWordsRu.convert('0.505')) + .toBe('Ноль рублей 51 копейка'); + expect(numberToWordsRu.convert('50.995')) + .toBe('Пятьдесят один рубль 00 копеек'); + expect(numberToWordsRu.convert('50.994')) + .toBe('Пятьдесят рублей 99 копеек'); + expect(numberToWordsRu.convert('999.995')) + .toBe('Одна тысяча рублей 00 копеек'); + expect(numberToWordsRu.convert('15999.995')) + .toBe('Шестнадцать тысяч рублей 00 копеек'); + }); + describe('slash delimiter', () => { + test('common currency', () => { + expect(numberToWordsRu.convert('1234/6789', { + currency: 'rub', + roundNumber: 50, + })) + .toBe('Одна тысяча двести тридцать четыре 6789 рубля'); + expect(numberToWordsRu.convert('1234/6789', { + currency: 'rub', + roundNumber: 2, + })) + .toBe('Одна тысяча двести тридцать четыре 6789 рубля'); + expect(numberToWordsRu.convert('1234/6789', { + currency: 'rub', + roundNumber: -1, + })) + .toBe('Одна тысяча двести тридцать четыре 6789 рубля'); + }); + test('currency "number"', () => { + expect(numberToWordsRu.convert('1234/6789', { + currency: 'number', + roundNumber: 50, + })) + .toBe('Одна тысяча двести тридцать четыре 6789'); + expect(numberToWordsRu.convert('1234/6789', { + currency: 'number', + roundNumber: 2, + })) + .toBe('Одна тысяча двести тридцать четыре 6789'); + expect(numberToWordsRu.convert('1234/6789', { + currency: 'number', + roundNumber: -1, + })) + .toBe('Одна тысяча двести тридцать четыре 6789'); + }); + test('custom currency', () => { + expect(numberToWordsRu.convert('1234/6789', { + currency: { + currencyNameCases: ['рубль', 'рубля', 'рублей'], + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + currencyNounGender: { + integer: 0, + fractionalPart: 1, + }, + }, + roundNumber: 50, + })) + .toBe('Одна тысяча двести тридцать четыре 6789 рубля'); + expect(numberToWordsRu.convert('1234/6789', { + currency: { + currencyNameCases: ['рубль', 'рубля', 'рублей'], + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + currencyNounGender: { + integer: 0, + fractionalPart: 1, + }, + }, + roundNumber: 2, + })) + .toBe('Одна тысяча двести тридцать четыре 6789 рубля'); + expect(numberToWordsRu.convert('1234/6789', { + currency: { + currencyNameCases: ['рубль', 'рубля', 'рублей'], + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + currencyNounGender: { + integer: 0, + fractionalPart: 1, + }, + }, + roundNumber: -1, + })) + .toBe('Одна тысяча двести тридцать четыре 6789 рубля'); + }); + }); + describe('normal delimiter', () => { + test('common currency', () => { + expect(numberToWordsRu.convert('1234.6789', { + currency: 'rub', + roundNumber: 50, + })) + .toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); + expect(numberToWordsRu.convert('1234.6789', { + currency: 'rub', + roundNumber: 2, + })) + .toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); + expect(numberToWordsRu.convert('1234.6789', { + currency: 'rub', + roundNumber: 1, + })) + .toBe('Одна тысяча двести тридцать четыре рубля 70 копеек'); + expect(numberToWordsRu.convert('1234.6789', { + currency: 'rub', + roundNumber: 0, + })) + .toBe('Одна тысяча двести тридцать пять рублей 00 копеек'); + expect(numberToWordsRu.convert('1234.6789', { + currency: 'rub', + roundNumber: -1, + })) + .toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); + }); + test('currency "number"', () => { + expect(numberToWordsRu.convert('1234.6789', { + currency: 'number', + roundNumber: 50, + })) + .toBe('Одна тысяча двести тридцать четыре целых 6789 десятитысячных'); + expect(numberToWordsRu.convert('1234.6789', { + currency: 'number', + roundNumber: 2, + })) + .toBe('Одна тысяча двести тридцать четыре целых 68 сотых'); + expect(numberToWordsRu.convert('1234.6789', { + currency: 'number', + roundNumber: 0, + })) + .toBe('Одна тысяча двести тридцать пять целых'); + expect(numberToWordsRu.convert('1234.6789', { + currency: 'number', + roundNumber: -1, + })) + .toBe('Одна тысяча двести тридцать четыре целых 6789 десятитысячных'); + expect(numberToWordsRu.convert('1.9999', { + currency: 'number', + roundNumber: 3, + })) + .toBe('Две целых 0 десятых'); + expect(numberToWordsRu.convert('1.9999', { + currency: 'number', + roundNumber: 0, + })) + .toBe('Две целых'); + expect(numberToWordsRu.convert('1.00089', { + currency: 'number', + roundNumber: 5, + })) + .toBe('Одна целая 89 стотысячных'); + }); + test('custom currency', () => { + expect(numberToWordsRu.convert('1234.6789', { + currency: { + currencyNameCases: ['рубль', 'рубля', 'рублей'], + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + currencyNounGender: { + integer: 0, + fractionalPart: 1, + }, + }, + roundNumber: 50, + })) + .toBe('Одна тысяча двести тридцать четыре рубля 6789 копеек'); + expect(numberToWordsRu.convert('1234.6789', { + currency: { + currencyNameCases: ['рубль', 'рубля', 'рублей'], + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + currencyNounGender: { + integer: 0, + fractionalPart: 1, + }, + }, + roundNumber: 2, + })) + .toBe('Одна тысяча двести тридцать четыре рубля 68 копеек'); + expect(numberToWordsRu.convert('1234.6789', { + currency: { + currencyNameCases: ['рубль', 'рубля', 'рублей'], + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + currencyNounGender: { + integer: 0, + fractionalPart: 1, + }, + }, + roundNumber: 0, + })) + .toBe('Одна тысяча двести тридцать пять рублей 00 копеек'); + expect(numberToWordsRu.convert('1234.6789', { + currency: { + currencyNameCases: ['рубль', 'рубля', 'рублей'], + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + currencyNounGender: { + integer: 0, + fractionalPart: 1, + }, + }, + roundNumber: -1, + })) + .toBe('Одна тысяча двести тридцать четыре рубля 6789 копеек'); + }); + }); +}); diff --git a/test/methods/convert/options/showCurrency.test.js b/test/methods/convert/options/showCurrency.test.js new file mode 100644 index 0000000..49785c1 --- /dev/null +++ b/test/methods/convert/options/showCurrency.test.js @@ -0,0 +1,33 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +test('showCurrency', () => { + expect(numberToWordsRu.convert('1234567.12345', { + showCurrency: { + integer: true, + fractional: true, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + showCurrency: { + integer: true, + fractional: false, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12'); + expect(numberToWordsRu.convert('1234567.12345', { + showCurrency: { + integer: false, + fractional: true, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь 12 копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + showCurrency: { + integer: false, + fractional: false, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь 12'); +}); diff --git a/test/methods/convert/options/showNumberParts.test.js b/test/methods/convert/options/showNumberParts.test.js new file mode 100644 index 0000000..72ab0e1 --- /dev/null +++ b/test/methods/convert/options/showNumberParts.test.js @@ -0,0 +1,32 @@ +const root = '../../../../'; +const numberToWordsRu = require(`${root}dist/bundle`); + +test('showNumberParts', () => { + expect(numberToWordsRu.convert('1234567.12345', { + showNumberParts: { + integer: true, + fractional: true, + }, + })) + .toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 12 копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + showNumberParts: { + integer: true, + fractional: false, + }, + })).toBe('Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей'); + expect(numberToWordsRu.convert('1234567.12345', { + showNumberParts: { + integer: false, + fractional: true, + }, + })) + .toBe('12 копеек'); + expect(numberToWordsRu.convert('1234567.12345', { + showNumberParts: { + integer: false, + fractional: false, + }, + })) + .toBe(''); +}); From 35e7273f09a9cc1c872d677b91b69783fbae3824 Mon Sep 17 00:00:00 2001 From: Sergey Bystrov Date: Tue, 2 Feb 2021 15:01:46 +0300 Subject: [PATCH 08/12] Added declension description in index.d.ts --- index.d.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/index.d.ts b/index.d.ts index 33d2198..e37da6a 100644 --- a/index.d.ts +++ b/index.d.ts @@ -4,7 +4,7 @@ /** * What does this module do: - * + * * `1234567.89` --> Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 89 копеек\ * `123.45` --> Сто двадцать три рубля сорок пять копеек\ * `251` --> Двести пятьдесят одно сообщение\ @@ -75,6 +75,12 @@ declare module 'number-to-words-ru' { integer?: boolean; fractional?: boolean; }, + declension?: 'nominative' + | 'genitive' + | 'dative' + | 'accusative' + | 'instrumental' + | 'prepositional' } export interface numberToWordsRuFunctions { convert: typeof convert, @@ -83,7 +89,7 @@ declare module 'number-to-words-ru' { * Convert number to words\ * If typed as `number` max value is `9'007'199'254'740'991` (limit of Javascript).\ * If typed as `string` max value is `306 digits` before point and `305 digits` after point. - * + * * @param number The input number * @param options The convert options */ From dfa66536e304f8104379783c75879812520c11ee Mon Sep 17 00:00:00 2001 From: Anton Moskovskiy <7397158+Ant1mas@users.noreply.github.com> Date: Mon, 8 Feb 2021 16:15:46 +0500 Subject: [PATCH 09/12] added support of custom currency, currency "number" and number with delimiter "/" for declensions --- index.d.ts | 225 ++- src/defaultOptions.ts | 3 - src/functions/combineResultData.ts | 148 +- src/functions/convertDigitToWord.ts | 23 + src/functions/convertEachScaleToWords.ts | 120 ++ src/functions/convertEachScaleToWordsSlash.ts | 154 ++ src/functions/convertsEachScaleToWords.ts | 138 -- .../convertsEachScaleToWordsSlash.ts | 139 -- src/functions/fractionalPartToMinLength.ts | 6 +- src/functions/getCurrencyObject.ts | 35 +- src/functions/getCurrencyWord.ts | 49 + src/functions/getCustomCurrency.ts | 92 + src/functions/getOptions.ts | 6 +- src/functions/numberToScales.ts | 2 +- .../removeEmptyScalesBeforeNumber.ts | 17 + src/functions/replaceAt.ts | 8 +- src/functions/roundNumber.ts | 4 +- src/functions/selectDataByDeclension.ts | 30 + src/functions/splitNumberToArray.ts | 6 +- src/functions/updateObjectDeep.ts | 6 +- src/methods/convert.ts | 4 +- src/textValues.ts | 7 - .../interfaces/ConvertInterfaces.ts | 81 +- .../interfaces/ConvertedScalesToWords.ts | 8 - src/typeScript/interfaces/SlashNumberForms.ts | 3 - src/units/declensions.ts | 4 + src/units/fractional.ts | 14 - src/units/fractionalCurrencyNumber.ts | 38 + src/units/functions/getFractionalNameForms.ts | 43 - .../getFractionalUnitCurrencyNumber.ts | 64 + .../{getUnitName.ts => getNumberScaleName.ts} | 28 +- src/units/functions/getSlashNumberUnitName.ts | 6 +- src/units/genders.ts | 8 +- src/units/ordinalNumbers/digits.ts | 277 +++ src/units/ordinalNumbers/hundreds.ts | 253 +++ src/units/ordinalNumbers/ordinalNumbers.ts | 20 + src/units/ordinalNumbers/tenToNineteen.ts | 277 +++ src/units/ordinalNumbers/tens.ts | 229 +++ src/units/slashNumberForms.ts | 54 - src/units/slashNumberUnitPrefixes.ts | 59 + src/units/stringCurrencies.ts | 20 +- src/units/unitNames.ts | 2 +- test/methods/convert/convert.test.js | 30 + .../convert/options/declension.test.js | 1689 +++++++++++------ 44 files changed, 3248 insertions(+), 1181 deletions(-) create mode 100644 src/functions/convertDigitToWord.ts create mode 100644 src/functions/convertEachScaleToWords.ts create mode 100644 src/functions/convertEachScaleToWordsSlash.ts delete mode 100644 src/functions/convertsEachScaleToWords.ts delete mode 100644 src/functions/convertsEachScaleToWordsSlash.ts create mode 100644 src/functions/getCurrencyWord.ts create mode 100644 src/functions/getCustomCurrency.ts create mode 100644 src/functions/removeEmptyScalesBeforeNumber.ts create mode 100644 src/functions/selectDataByDeclension.ts delete mode 100644 src/typeScript/interfaces/ConvertedScalesToWords.ts delete mode 100644 src/typeScript/interfaces/SlashNumberForms.ts delete mode 100644 src/units/fractional.ts create mode 100644 src/units/fractionalCurrencyNumber.ts delete mode 100644 src/units/functions/getFractionalNameForms.ts create mode 100644 src/units/functions/getFractionalUnitCurrencyNumber.ts rename src/units/functions/{getUnitName.ts => getNumberScaleName.ts} (55%) create mode 100644 src/units/ordinalNumbers/digits.ts create mode 100644 src/units/ordinalNumbers/hundreds.ts create mode 100644 src/units/ordinalNumbers/ordinalNumbers.ts create mode 100644 src/units/ordinalNumbers/tenToNineteen.ts create mode 100644 src/units/ordinalNumbers/tens.ts delete mode 100644 src/units/slashNumberForms.ts create mode 100644 src/units/slashNumberUnitPrefixes.ts diff --git a/index.d.ts b/index.d.ts index e37da6a..d9c04da 100644 --- a/index.d.ts +++ b/index.d.ts @@ -2,86 +2,177 @@ // Project: https://github.com/Ant1mas/number-to-words-ru // Definitions by: Anton Moskovskiy -/** - * What does this module do: - * - * `1234567.89` --> Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 89 копеек\ - * `123.45` --> Сто двадцать три рубля сорок пять копеек\ - * `251` --> Двести пятьдесят одно сообщение\ - * `6712` --> Шесть тысяч семьсот двенадцать комментариев\ - * `-345.21` --> Минус триста сорок пять рублей 21 копейка\ - * `450.3` --> Четыреста пятьдесят долларов 30 центов\ - * `122.00572` --> Сто двадцать две целых пятьсот семьдесят две стотысячных\ - * `5/123` --> Пять сто двадцать третьих - */ -declare module 'number-to-words-ru' { - export interface CurrencySettings { - /** - * Integer currency names\ - * * for gidits [1, 2-4, 5-9]\ - * e.g. ['рубль', 'рубля', 'рублей'] - */ - currencyNameCases?: [string, string, string], +type Declension = + | 'nominative' + | 'genitive' + | 'dative' + | 'accusative' + | 'instrumental' + | 'prepositional'; + +interface CurrencySettings { + /** + * Integer currency name forms\ + * for gidits [1, 2-4, 5-9]\ + * e.g. ['рубль', 'рубля', 'рублей'] + */ + currencyNameCases?: [string, string, string], + /** + * Integer currency name forms\ + * for declensions + */ + currencyNameDeclensions?: { + [key in Declension]?: [string, string]; + }, + + /** + * Fractional number currency name forms\ + * for gidits [1, 2-4, 5-9]\ + * e.g. ['копейка', 'копейки', 'копеек'] + */ + fractionalPartNameCases?: [string, string, string], + + /** + * Fractional number currency name forms\ + * for declensions + */ + fractionalPartNameDeclensions?: { + [key in Declension]?: [string, string]; + }, + + + currencyNounGender?: { /** - * Fractional number currency names\ - * * for gidits [1, 2-4, 5-9]\ - * e.g. ['копейка', 'копейки', 'копеек'] + * 0 => 'один', 1 => 'одна', 2 => 'одно'\ + * Default: `0` */ - fractionalPartNameCases?: [string, string, string], - currencyNounGender?: { - /** - * 0 => 'один', 1 => 'одна', 2 => 'одно'\ - * Default: `0` - */ - integer?: 0 | 1 | 2, + integer?: 0 | 1 | 2, - /** + /** * 0 => 'один', 1 => 'одна', 2 => 'одно'\ * Default: `1` */ - fractionalPart?: 0 | 1 | 2 - }, + fractionalPart?: 0 | 1 | 2, + }, + /** + * Minimal length of fractional part\ + * Default: `2` + */ + fractionalPartMinLength?: number +} + +interface ConvertOptions { + /** + * Select currency\ + * `'rub'` Russian ruble. 124 рубля 42 копейки\ + * `'usd'` Dollar. 124 доллара 42 цента\ + * `'eur'` Euro. 124 евро 42 цента\ + * `'number'` Number without currency. 124 целых 42 сотых\ + * `Object` Custom currency. 124 юаня 42 фыня\ + * Default: `'rub'` + */ + currency?: 'rub' | 'usd' | 'eur' | 'number' | CurrencySettings, + /** + * Select declension\ + * `'nominative'` Одна тысяча два рубля\ + * `'genitive'` Одной тысячи двух рублей\ + * `'dative'` Одной тысяче двум рублям\ + * `'accusative'` Одну тысячу два рубля\ + * `'instrumental'` Одной тысячей двумя рублями\ + * `'prepositional'` Одной тысяче двух рублях\ + * Default: `nominative` + */ + declension?: Declension, + /** + * Rounding\ + * `-1` Rounding disabled\ + * `0` and more. Precision of rounding\ + * Default: `-1` + */ + roundNumber?: number, + /** + * Convert minus sign to word\ + * `true` Минус\ + * `false` -\ + * Default: `true` + */ + convertMinusSignToWord?: boolean; + /** + * Show number parts\ + * `Object` + */ + showNumberParts?: { /** - * Minimal length of fractional part\ - * Default: `2` + * Show integer part of number\ + * `true` **Два рубля** пять копеек\ + * `false` Пять копеек\ + * Default: `true` */ - fractionalPartMinLength?: number - } + integer?: boolean; + /** + * Show fractional part of number\ + * `true` Два рубля **пять копеек**\ + * `false` Два рубля\ + * Default: `true` + */ + fractional?: boolean; + }, /** - * Convert options + * Convert number parts to words\ + * `Object` */ - export interface ConvertOptions { + convertNumbertToWords?: { /** - * Select currency\ - * `'rub'`: Russian ruble 124 рубля 42 копейки\ - * `'usd'`: Dollar 124 доллара 42 цента\ - * `'eur'`: Euro 124 евро 42 цента\ - * `'number'`: Number without currency 124 целых 42 сотых\ - * Default: `rub` + * Convert integer part to words\ + * `true` **Два** рубля пять копеек\ + * `false` **2** рубля пять копеек\ + * Default: `true` */ - currency?: 'rub' | 'usd' | 'eur' | 'number' | CurrencySettings; - roundNumber?: number, - convertMinusSignToWord?: boolean; - showNumberParts?: { - integer?: boolean; - fractional?: boolean; - }, - convertNumbertToWords?: { - integer?: boolean; - fractional?: boolean; - }, - showCurrency?: { - integer?: boolean; - fractional?: boolean; - }, - declension?: 'nominative' - | 'genitive' - | 'dative' - | 'accusative' - | 'instrumental' - | 'prepositional' - } + integer?: boolean; + /** + * Convert fractional part to words\ + * `true` Два рубля **пять** копеек\ + * `false` Два рубля **5** копеек\ + * Default: `false` + */ + fractional?: boolean; + }, + /** + * Show currency of number parts\ + * `Object` + */ + showCurrency?: { + /** + * Show currency of integer part\ + * `true` Два **рубля** пять копеек\ + * `false` Два пять копеек\ + * Default: `true` + */ + integer?: boolean; + /** + * Show currency of fractional part\ + * `true` Два рубля пять **копеек**\ + * `false` Два рубля пять\ + * Default: `true` + */ + fractional?: boolean; + }, +} + +/** + * What does this module do: + * + * `1234567.89` --> Один миллион двести тридцать четыре тысячи пятьсот шестьдесят семь рублей 89 копеек\ + * `123.45` --> Сто двадцать три рубля сорок пять копеек\ + * `251` --> Двести пятьдесят одно сообщение\ + * `6712` --> Шесть тысяч семьсот двенадцать комментариев\ + * `-345.21` --> Минус триста сорок пять рублей 21 копейка\ + * `450.3` --> Четыреста пятьдесят долларов 30 центов\ + * `122.00572` --> Сто двадцать две целых пятьсот семьдесят две стотысячных\ + * `5/123` --> Пять сто двадцать третьих + */ +declare module 'number-to-words-ru' { export interface numberToWordsRuFunctions { convert: typeof convert, } diff --git a/src/defaultOptions.ts b/src/defaultOptions.ts index cbc0fab..3f206ee 100644 --- a/src/defaultOptions.ts +++ b/src/defaultOptions.ts @@ -2,9 +2,6 @@ import {ConvertOptions} from 'typeScript/interfaces/ConvertInterfaces'; import declensions from "units/declensions"; const defaultOptions: ConvertOptions = { - /* currency - Название валюты ('rub', 'usd', 'eur') - или 'number' - или объект со своей валютой */ currency: 'rub', declension: declensions.NOMINATIVE, roundNumber: -1, diff --git a/src/functions/combineResultData.ts b/src/functions/combineResultData.ts index cf410d6..5e9f8e2 100644 --- a/src/functions/combineResultData.ts +++ b/src/functions/combineResultData.ts @@ -3,14 +3,17 @@ import roundNumber from 'functions/roundNumber'; import fractionalPartToMinLength from 'functions/fractionalPartToMinLength'; import getCurrencyObject from 'functions/getCurrencyObject'; import numberToScales from 'functions/numberToScales'; -import convertsEachScaleToWords from 'functions/convertsEachScaleToWords'; -import convertsEachScaleToWordsSlash from 'functions/convertsEachScaleToWordsSlash'; +import convertEachScaleToWords from 'functions/convertEachScaleToWords'; +import convertEachScaleToWordsSlash from 'functions/convertEachScaleToWordsSlash'; +import getCurrencyWord from 'functions/getCurrencyWord'; +import getFractionalUnitCurrencyNumber from 'units/functions/getFractionalUnitCurrencyNumber'; +import {declensions} from "units/declensions"; import {ConvertOptions} from 'typeScript/interfaces/ConvertInterfaces'; /** * Собрать число в сроку с применением параметров. - * @param {Array} numberArray - Число в виде массива ['-', '150', '/', '25']. - * @param {Object} options - Парметры конвертирования. + * @param {array} numberArray - Число в виде массива ['-', '150', '/', '25']. + * @param {object} options - Парметры конвертирования. * @return {string} Число, конвертированное в текст. */ const combineResultData = (numberArray: string[], options?: ConvertOptions): string => { @@ -41,67 +44,80 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str } // Обеспечить минимальную длину дробной части числа modifiedNumberArray = fractionalPartToMinLength(modifiedNumberArray, currencyObject); + const integerScalesArray = modifiedNumberArray[1]; + const fractionalScalesArray = modifiedNumberArray[3]; + const delimiter = modifiedNumberArray[2]; // Если нужно отображать целую часть числа if (options.showNumberParts.integer === true) { - convertedNumberArr[1] = modifiedNumberArray[1]; + // По умолчанию число не конвертировано в слова + convertedNumberArr[1] = integerScalesArray; + // Получить результат конвертирования числа + const convertedIntegerObject = convertEachScaleToWords( + numberToScales(integerScalesArray), + currencyObject.currencyNounGender.integer, + options.declension + ); // Если нужно конвертировать число в слова if (options.convertNumbertToWords.integer === true) { // Если разделитель - не дробная черта - if (modifiedNumberArray[2] !== '/') { - convertedNumberArr[1] = convertsEachScaleToWords( - numberToScales(modifiedNumberArray[1]), - currencyObject.currencyNounGender.integer, - options.declension - ).result; + if (delimiter !== '/') { + // Применить конвертированное число + convertedNumberArr[1] = convertedIntegerObject.result; } else { // Если раделитель - дробная черта // Род числа всегда женский ('одна', 'две') - convertedNumberArr[1] = - convertsEachScaleToWords(numberToScales(modifiedNumberArray[1]), 1, options.declension).result; + // Применить конвертированное число + convertedNumberArr[1] = convertEachScaleToWords( + numberToScales(integerScalesArray), + 1, + options.declension + ).result; } } - // Если нужно отображать валюту числа + // Если нужно отображать валюту целой части числа if (options.showCurrency.integer === true) { // Если разделитель - не дробная черта - if (modifiedNumberArray[2] !== '/') { - const convertResult = convertsEachScaleToWords( - numberToScales(modifiedNumberArray[1]), - currencyObject.currencyNounGender.integer, - options.declension + if (delimiter !== '/') { + const currencyWord = getCurrencyWord( + currencyObject, + 'integer', + convertedIntegerObject.unitNameForm, + convertedIntegerObject.lastScaleIsZero, + options.currency, + options.declension ); - - if (currencyObject.currencyNameDeclensions) { - // Если у валюты определены падежи - convertedNumberArr[2] = currencyObject.currencyNameDeclensions[convertResult.unitDeclension][convertResult.isPlural ? 1 : 0]; - } else { - // Если у валюты не определены падежи - convertedNumberArr[2] = currencyObject.currencyNameCases[convertResult.unitNameForm]; - } + convertedNumberArr[2] = currencyWord; } } } // Если нужно отображать дробную часть числа if (options.showNumberParts.fractional === true) { - convertedNumberArr[3] = modifiedNumberArray[3]; + // По умолчанию число не конвертировано в слова + convertedNumberArr[3] = fractionalScalesArray; + // Получить результат конвертирования числа + const convertedFractionalObject = convertEachScaleToWords( + numberToScales(fractionalScalesArray), + currencyObject.currencyNounGender.fractionalPart, + options.declension + ); // Если нужно конвертировать число в слова if (options.convertNumbertToWords.fractional === true) { // Если разделитель - дробная черта - if (modifiedNumberArray[2] === '/') { - convertedNumberArr[3] = convertsEachScaleToWordsSlash( - numberToScales(modifiedNumberArray[3]), - convertsEachScaleToWords( - numberToScales(modifiedNumberArray[1]), - currencyObject.currencyNounGender.integer, - options.declension - ).unitNameForm, + if (delimiter === '/') { + const convertedIntegerObject = convertEachScaleToWords( + numberToScales(integerScalesArray), + currencyObject.currencyNounGender.integer, + options.declension + ); + convertedNumberArr[3] = convertEachScaleToWordsSlash( + numberToScales(fractionalScalesArray), + convertedIntegerObject.unitNameForm, + options.declension ); } else { // Если разделитель - не дробная черта - convertedNumberArr[3] = convertsEachScaleToWords( - numberToScales(modifiedNumberArray[3]), - currencyObject.currencyNounGender.fractionalPart, - options.declension - ).result; + // Применить конвертированное число + convertedNumberArr[3] = convertedFractionalObject.result; } } else { // Если не нужно конвертировать число в слова @@ -118,48 +134,50 @@ const combineResultData = (numberArray: string[], options?: ConvertOptions): str } } } - // Если нужно отображать валюту числа + // Если нужно отображать валюту дробной части числа if (options.showCurrency.fractional === true) { // Если валюта - не 'number' if (options.currency !== 'number') { - const convertResult = convertsEachScaleToWords( - numberToScales(modifiedNumberArray[3]), - currencyObject.currencyNounGender.fractionalPart, + const currencyWord = getCurrencyWord( + currencyObject, + 'fractional', + convertedFractionalObject.unitNameForm, + convertedFractionalObject.lastScaleIsZero, + options.currency, options.declension ); - - if (currencyObject.fractionalPartNameDeclensions) { - // Если у валюты определены падежи - convertedNumberArr[4] = currencyObject.fractionalPartNameDeclensions[convertResult.unitDeclension][convertResult.isPlural ? 1 : 0]; - } else { - /// Если у валюты не определены падежи - convertedNumberArr[4] = currencyObject.fractionalPartNameCases[convertResult.unitNameForm]; + // Если определено число дробной части + if (convertedNumberArr[3] !== '') { + // Добавить валюту к дробной части + convertedNumberArr[4] = currencyWord; } } - // Если не указана валюта + // Если валюта указана как "number" if (options.currency === 'number') { // Если разделитель - не дробная черта - if (modifiedNumberArray[2] !== '/') { - // Получить массив названий дробной части - const getFractionalPartArr = textValues.getFractionalUnits(modifiedNumberArray[3].length - 1); - convertedNumberArr[4] = getFractionalPartArr[ - convertsEachScaleToWords(numberToScales( - modifiedNumberArray[3]), - currencyObject.currencyNounGender.fractionalPart, - options.declension - ).unitNameForm - ]; + if (delimiter !== '/') { + // Если определено число дробной части + if (convertedNumberArr[3] !== '') { + const digitToConvert = parseInt(fractionalScalesArray[fractionalScalesArray.length - 1]); + convertedNumberArr[4] = getFractionalUnitCurrencyNumber( + fractionalScalesArray.length - 1, + digitToConvert, + options.declension, + convertedFractionalObject.unitNameForm + ); + } } } // Если разделитель - дробная черта - if (modifiedNumberArray[2] === '/') { + if (delimiter === '/') { // Если указана валюта if (options.currency !== 'number') { - convertedNumberArr[4] = currencyObject.currencyNameCases[1]; + convertedNumberArr[4] = currencyObject.currencyNameDeclensions[declensions.GENITIVE][0]; } } } } + // Объеденить полученный результат let convertedNumberResult = convertedNumberArr .filter(Boolean) .join(' ') diff --git a/src/functions/convertDigitToWord.ts b/src/functions/convertDigitToWord.ts new file mode 100644 index 0000000..82be42c --- /dev/null +++ b/src/functions/convertDigitToWord.ts @@ -0,0 +1,23 @@ +import {DeclensionNumberNames} from 'textValues'; +import {Gender} from "units/genders"; + +/** + * Конвертировать одну цифру в слово. + * @param {number} digit - Цифра для конвертирования. + * @param {DeclensionNumberNames} values - Подходящий объект с падежами для конвертирования цифры. + * @param {Declension} declension - Выбранный падеж. + * @param {Gender} gender - Род для цирфы. + * @return {string} Цирфа (в видео слова) в правильном падеже (напр. "сто", "двадцать", "две" и др.) + */ +export const convertDigitToWord = ( + digit: number, + values: DeclensionNumberNames, + declension: Declension, + gender: Gender +): string => { + const declensionValues = values[declension]; + const word = declensionValues[digit]; + return (typeof word === "object") ? word[gender] : word; +}; + +export default convertDigitToWord; diff --git a/src/functions/convertEachScaleToWords.ts b/src/functions/convertEachScaleToWords.ts new file mode 100644 index 0000000..0f24d57 --- /dev/null +++ b/src/functions/convertEachScaleToWords.ts @@ -0,0 +1,120 @@ +import {numberNames} from 'textValues'; +import genders, {Gender} from "units/genders"; +import {Declension, declensions} from "units/declensions"; +import getNumberScaleName from "units/functions/getNumberScaleName"; +import convertDigitToWord from 'functions/convertDigitToWord'; + +export interface ConvertedScalesToWords { + result: string, + unitNameForm: number, + lastScaleIsZero: boolean, +}; + +/** + * Конвертировать массив числа в текст. + * @param {string[]} numberScalesArr - Массив классов числа ['009', '876', '543', ...]. + * @param {number} currencyNounGender - Род валюты (0 - мужской, 1 - женский, 2 - средний). + * @param {Declension} declension - Падеж. + * @return {ConvertedScalesToWords} Конвертированный результат (текст) и параметры падежа для валюты. + */ +const convertEachScaleToWords = ( + numberScalesArr: string[], + currencyNounGender = 0, + declension: Declension = declensions.NOMINATIVE +): ConvertedScalesToWords => { + let convertedResult = ''; + let scaleNameForm = 2; // Форма падежа для названия класса единиц или валюты после (0 / 1 / 2). + let scaleIsZero = false; // Равняется ли целый класс "000". + + // Для каждого класса числа + numberScalesArr.some((numberScale, arrIndex) => { + scaleNameForm = 2; // Падеж названия единиц измерения по умолчанию ("рублей") + scaleIsZero = false; + // Определить порядковый номер текущего класса числа + const currentNumberScale = numberScalesArr.length - arrIndex; + const digit1 = parseInt(numberScale[0]); + const digit2 = parseInt(numberScale[1]); + const digit3 = parseInt(numberScale[2]); + let digit1text = ''; + let digit2text = ''; + let digit3text = ''; + // Если класс числа пустой (000) + if ( + digit1 === 0 + && digit2 === 0 + && digit3 === 0 + ) { + scaleIsZero = true; + // Если нет классов выше + if (numberScalesArr.length === 1) { + convertedResult = convertDigitToWord(digit3, numberNames.numbers, declension, genders.MALE); + scaleNameForm = 2; + // Выйти из цикла + return true; + } + // Пропустить этот пустой классы (000) + return; + } + /* Определить род числа + если класс тысяч - то женский + если класс единиц - берем из валюты + иначе - мужской */ + let gender: Gender = genders.MALE; + if (currentNumberScale === 2) { + // Если текущий класс - тысячи + gender = genders.FEMALE; + } else if (currentNumberScale === 1) { + // Если текущий класс - единицы + if (currencyNounGender === 1) { + // Если у валюты указан женский род (напр. копейка) + gender = genders.FEMALE; + } else if (currencyNounGender === 2) { + // Если у валюты указан средний род + gender = genders.NEUTER; + } + } + // Определить сотни + digit1text = convertDigitToWord(digit1, numberNames.hundreds, declension, gender); + // Определить десятки и единицы + // Если в разряде десятков стоит "1" + if (digit2 === 1) { + digit2text = convertDigitToWord(digit3, numberNames.tenToNineteen, declension, gender); + // Если в раздяде десятков стоит не "1" + } else { + digit2text = convertDigitToWord(digit2, numberNames.tens, declension, gender); + digit3text = convertDigitToWord(digit3, numberNames.numbers, declension, gender); + // Определить ПАДЕЖ названия единиц измерения (рубль/рубля/рублей) + // Если цифра в разряде единиц от 1 до 4 + if (digit3 >= 1 && digit3 <= 4) { + // Если цифра в разряде единиц "1" + if (digit3 === 1) { + // Получиться "рубль" + scaleNameForm = 0; + } + if (digit3 >= 2 && digit3 <= 4) { + // Получиться "рубля" + scaleNameForm = 1; + } + } + } + const scaleName = getNumberScaleName(currentNumberScale - 1, scaleNameForm, declension); + // Убрать ненужный "ноль" + if (digit3 === 0 && (digit1 > 0 || digit2 > 0)) { + digit3text = ''; + } + // Соеденить значения в одну строку + const scaleResult = `${digit1text} ${digit2text} ${digit3text} ${scaleName}` + .replace(/\s+/g, ' ') + .trim(); + // Добавить текущий разобранный класс к общему результату + convertedResult += ` ${scaleResult}`; + }); + // Вернуть полученный результат и форму падежа для валюты + return { + result: convertedResult.trim(), + unitNameForm: scaleNameForm, + lastScaleIsZero: scaleIsZero, + }; +}; + +export default convertEachScaleToWords; diff --git a/src/functions/convertEachScaleToWordsSlash.ts b/src/functions/convertEachScaleToWordsSlash.ts new file mode 100644 index 0000000..47c5924 --- /dev/null +++ b/src/functions/convertEachScaleToWordsSlash.ts @@ -0,0 +1,154 @@ +import * as _ from 'lodash'; +import {genders} from "units/genders"; +import {Declension, declensions} from 'units/declensions'; +import {slashNumberUnitPrefixes} from 'units/slashNumberUnitPrefixes'; +import { + fractionalUnitsBases, + fractionalUnitEndings, +} from 'units/fractionalCurrencyNumber'; +import unitNames from 'units/unitNames'; +import ordinalNumbersDeclensions from 'units/ordinalNumbers/ordinalNumbers'; +import convertEachScaleToWords from 'functions/convertEachScaleToWords'; +import removeEmptyScalesBeforeNumber from 'functions/removeEmptyScalesBeforeNumber'; +import selectDataByDeclension from 'functions/selectDataByDeclension'; + +/** + * Конвертировать в текст массив числа с разделителем "/". + * @param {string[]} numberScalesArr - Массив классов числа ['009', '876', '543', ...]. + * @param {number} unitNameForm - Род валюты целой части числа ([мужской, средний, женский]). + * @param {Declension} declension - Падеж. + * @return {string} Конвертированный результат (текст). + */ +const convertEachScaleToWordsSlash = ( + numberScalesArr: string[], + unitNameForm = 1, + declension: Declension +): string => { + if (numberScalesArr.length < 1) { + return ''; + } + let convertedResult = ''; + // Удалить лишние нули в начале числа + const updatedNumberScalesArr = removeEmptyScalesBeforeNumber(numberScalesArr); + /* Определить индекс класса, который является последним. + После него могут быть только классы с "000". + 0 - единицы, 1 - тысячи, 2 - миллионы и т.д. */ + const lastScaleWihNumber = [...updatedNumberScalesArr].reverse().findIndex((scale) => scale !== '000'); + // Индекс последнего класса в массиве. + const lastScaleWihNumberIndex = updatedNumberScalesArr.length - lastScaleWihNumber - 1; + + // Если нет ни одного не пустого класса + if (lastScaleWihNumber === -1) { + // Вернуть ноль + const zeroValuesObject: any = ordinalNumbersDeclensions.digits[0]; + const zeroValue = selectDataByDeclension( + zeroValuesObject[genders.FEMALE], + declension, + (unitNameForm === 0) ? false : true + ); + return zeroValue; + } + + /* Если есть не пустые классы до последнего не пустого класса, + то конвертировать как обычное число */ + if (updatedNumberScalesArr.length - 1 - lastScaleWihNumber > 0) { + // Получить массив классов, в котором последний класс будет пустым. + const numberScalesArrForCommonConvert = updatedNumberScalesArr.map((scale, index) => { + return (index === lastScaleWihNumberIndex) ? '000' : scale; + }); + // Конвертировать классы как обычное число + convertedResult += convertEachScaleToWords( + numberScalesArrForCommonConvert, + 1, + declensions.NOMINATIVE + ).result + ' '; + } + + // Если последний класс для конвертирования - тысячи или больше + if (lastScaleWihNumber >= 1) { + // Собрать валюту в виде "двадцатипятитысячная". + // Получить текущий класс для конвертирования. + const scaleToConvertArr: number[] = updatedNumberScalesArr[lastScaleWihNumberIndex].split('').map((digit) => parseInt(digit)); + // Конвертировать сотни ("четырёхсот") + const hundreds = slashNumberUnitPrefixes.hundreds[scaleToConvertArr[0]]; + // Конвертировать десятки ("двадцати") + const tens = (scaleToConvertArr[1] === 1) ? slashNumberUnitPrefixes.tenToNineteen[scaleToConvertArr[2]] : slashNumberUnitPrefixes.tens[scaleToConvertArr[1]]; + // Конвертировать единицы ("пяти") + let digits = (scaleToConvertArr[1] === 1) ? '' : slashNumberUnitPrefixes.digit[scaleToConvertArr[2]]; + /* Если весь класс равен === 001 + и до него не было значений */ + if ( + _.isEqual(scaleToConvertArr, [0, 0, 1]) + && updatedNumberScalesArr.length - 1 === lastScaleWihNumber + ) { + // Получится "тысячная" вместо "однотысячная". + digits = ''; + } + // Получить корень названия класса числа ("тысяч") + const unitNameBase = (lastScaleWihNumber <= fractionalUnitsBases.length) ? fractionalUnitsBases[lastScaleWihNumber - 1] : unitNames[lastScaleWihNumber - 2]; + // Получить окончание названия класса числа с правильным падежом ("ная", "ной", "ных" и т.д.) + const unitNameEnding = selectDataByDeclension(fractionalUnitEndings, declension, (unitNameForm === 0) ? false : true); + // Добавить текст к общему результату + convertedResult += `${hundreds}${tens}${digits}${unitNameBase}${unitNameEnding}` + ' '; + } + + // Если последний класс для конвертирования - единицы + if (lastScaleWihNumber === 0) { + // Собрать валюту в виде "пятьсот двадцать первая". + // Получить текущий класс для конвертирования. + const scaleToConvertArr: number[] = updatedNumberScalesArr[lastScaleWihNumberIndex].split('').map((digit) => parseInt(digit)); + /* Определить какой разряд в текущем классе последний + (Любая последняя цифра, кроме нуля) + 0 - единицы, 1 - десятки, 2 - сотни */ + const lastDigitInScale = [...scaleToConvertArr].reverse().findIndex((digit) => digit !== 0); + // Получить индекс последнего разряда в текущем классе + const lastDigitInScaleIndex = scaleToConvertArr.length - lastDigitInScale - 1; + /* Получить класс без последнего разряда для конвертирования как обычного числа + и если после этого в разраде десяток остается "1", то эту "1" тоже убрать, + чтобы не отконвертировалось как 10-19. */ + const scaleForCommonConvert = [ + scaleToConvertArr.map((digit, index) => { + return (index === lastDigitInScaleIndex) ? 0 : digit; + }).map((digit, index) => { + return (index === 1 && digit === 1) ? 0 : digit; + }).join('') + ]; + // Если в классе остались цифры (не равен "000") + if (scaleForCommonConvert[0] !== '000') { + // Конвертировать класс как обычное число + convertedResult += convertEachScaleToWords( + scaleForCommonConvert, + 1, + declensions.NOMINATIVE + ).result + ' '; + } + // Цифра для конвертирования + let digitToConvert = scaleToConvertArr[lastDigitInScaleIndex]; + // Получить объект для выбора формы последнего разряда + let lastDigitDeclensionsObject: any = ordinalNumbersDeclensions.hundreds; + // Если разряд единиц + if (lastDigitInScale === 0) { + lastDigitDeclensionsObject = ordinalNumbersDeclensions.digits; + } + // Если разряд десятков + if (lastDigitInScale === 1) { + lastDigitDeclensionsObject = ordinalNumbersDeclensions.tens; + } + // Если в десятках цифра 1 (число 10-19) + if (scaleToConvertArr[1] === 1) { + lastDigitDeclensionsObject = ordinalNumbersDeclensions.tenToNineteen; + digitToConvert = scaleToConvertArr[2]; + } + // Получить последний разряд (в виде текста) в правильном падеже + const lastDigitText = selectDataByDeclension( + lastDigitDeclensionsObject[digitToConvert][genders.FEMALE], + declension, + (unitNameForm === 0) ? false : true + ); + // Добавить текст к общему результату + convertedResult += `${lastDigitText}` + ' '; + } + return convertedResult.trim(); +}; + +export default convertEachScaleToWordsSlash; diff --git a/src/functions/convertsEachScaleToWords.ts b/src/functions/convertsEachScaleToWords.ts deleted file mode 100644 index 4d23a7a..0000000 --- a/src/functions/convertsEachScaleToWords.ts +++ /dev/null @@ -1,138 +0,0 @@ -import {DeclensionNumberNames, numberNames} from 'textValues'; -import genders, {Gender} from "units/genders"; -import {Declension, declensions} from "units/declensions"; -import getUnitName from "units/functions/getUnitName"; -import {ConvertedScalesToWords} from 'typeScript/interfaces/ConvertedScalesToWords'; - -/** - * Конвертировать одну цифру в слово. - * @param {number} digit - Цифра для конвертирования. - * @param {DeclensionNumberNames} values - Подходящий объект с падежами для конвертирования цифры. - * @param {Declension} declension - Выбранный падеж. - * @param {Gender} gender - Род для цирфы. - * @return {string} Цирфа (в видео слова) в правильном падеже (напр. "сто", "двадцать", "две" и др.) - */ -const convertDigitToWord = (digit: number, values: DeclensionNumberNames, declension: Declension, gender: Gender) => { - const declensionValues = values[declension]; - const word = declensionValues[digit]; - return (typeof word === "object") ? word[gender] : word; -}; - -/** - * Конвертировать массив числа в текст. - * @param {Array} numberScaleArr - Массив числа ['009', '876', '543', ...]. - * @param {number} currencyNounGender - Род валюты (мужской/средний/женский). - * @param {Declension} declension - Падеж. - * @return {Object} Конвертированный результат (текст) и параметры падежа для валюты. - */ -const convertsEachScaleToWords = (numberScaleArr: string[], currencyNounGender = 0, declension: Declension = declensions.NOMINATIVE): ConvertedScalesToWords => { - let convertedResult = ''; - let unitNameForm; // Падеж названия единиц измерения (валюты, др. объекты) - let unitDeclension = declension; // Падеж названия единиц измерения (валюты, др. объекты) - let isPlural = false; // Множественность названия единиц измерения (валюты, др. объекты) - - // Для каждого класса числа - numberScaleArr.forEach((numberScale, arrIndex) => { - unitNameForm = 2; // Падеж названия единиц измерения по умолчанию (рублей) - // Определить порядковый номер текущего класса числа - const currentNumberScale = numberScaleArr.length - arrIndex; - const digit1 = parseInt(numberScale[0]); - const digit2 = parseInt(numberScale[1]); - const digit3 = parseInt(numberScale[2]); - let digit1text = ''; - let digit2text = ''; - let digit3text = ''; - // Пропускать пустые классы (000) - if ( - numberScaleArr.length > 1 - && digit1 === 0 - && digit2 === 0 - && digit3 === 0 - ) { - // Для чисел с пустой единичной частью - всегда родительный падеж во множественном числе - unitDeclension = declensions.GENITIVE; - isPlural = true; - return; - } - /* Определить род числа - если класс тысяч - то женский - если класс единиц - берем из валюты - иначе - мужской */ - let gender: Gender = genders.MALE; - if (currentNumberScale === 2) { - // Если текущий класс - тысячи - gender = genders.FEMALE; - } else if (currentNumberScale === 1) { - // Если текущий класс - единицы - if (currencyNounGender === 1) { - // Если у валюты указан женский род (напр. копейка) - gender = genders.FEMALE; - } else if (currencyNounGender === 2) { - // Если у валюты указан средний род - gender = genders.NEUTER; - } - } - - // Определить сотни - digit1text = convertDigitToWord(digit1, numberNames.hundreds, declension, gender); - // Определить десятки и единицы - // Если в разряде десятков стоит "1" - if (digit2 === 1) { - digit2text = convertDigitToWord(digit3, numberNames.tenToNineteen, declension, gender); - // Если в раздяде десятков стоит не "1" - } else { - digit2text = convertDigitToWord(digit2, numberNames.tens, declension, gender); - digit3text = convertDigitToWord(digit3, numberNames.numbers, declension, gender); - - // Определить ПАДЕЖ названия единиц измерения (рубль/рубля/рублей) - // Если цифра в разряде единиц от 1 до 4 - if (digit3 >= 1 && digit3 <= 4) { - // Если цифра в разряде единиц "1" - if (digit3 === 1) { - // Получиться "рубль" - unitNameForm = 0; - } - if (digit3 >= 2 && digit3 <= 4) { - // Получиться "рубля" - unitNameForm = 1; - } - } - } - - // Указать падеж для названия класса единиц - unitDeclension = declension; - isPlural = !(digit3 === 1 && digit2 !== 1); - - if (declension === declensions.NOMINATIVE || declension === declensions.ACCUSATIVE) { - if (digit1 === 0 && digit2 === 0 && digit3 === 0) { - // Для чисел с пустой единичной частою - всегда родительный падеж во множественном числе - unitDeclension = declensions.GENITIVE; - isPlural = true; - } else if ((digit3 >= 5 && digit3 <= 9) || digit2 === 1 || digit3 === 0) { - unitDeclension = declensions.GENITIVE; - } - } - - const unitName = getUnitName(currentNumberScale - 1, unitDeclension, isPlural); - // Убрать ненужный "ноль" - if (digit3 === 0 && (digit1 > 0 || digit2 > 0)) { - digit3text = ''; - } - // Соеденить значения в одну строку - const scaleResult = `${digit1text} ${digit2text} ${digit3text} ${unitName}` - .replace(/\s+/g, ' ') - .trim(); - // Добавить текущий разобранный класс к общему результату - convertedResult += ` ${scaleResult}`; - }); - - // Вернуть полученный результат и форму падежа для валюты - return { - result: convertedResult.trim(), - unitNameForm, - unitDeclension, - isPlural - }; -}; - -export default convertsEachScaleToWords; diff --git a/src/functions/convertsEachScaleToWordsSlash.ts b/src/functions/convertsEachScaleToWordsSlash.ts deleted file mode 100644 index af45506..0000000 --- a/src/functions/convertsEachScaleToWordsSlash.ts +++ /dev/null @@ -1,139 +0,0 @@ -import textValues from 'textValues'; -import convertsEachScaleToWords from 'functions/convertsEachScaleToWords'; - -/** - * Конвертировать в текст массив числа с разделителем "/". - * @param {Array} numberScaleArr - Массив числа. - * @param {number} unitNameForm - Род для валюты. - * @return {string} Конвертированный результат. - */ -const convertsEachScaleToWordsSlash = (numberScaleArr: string[], unitNameForm = 1): string => { - if (numberScaleArr.length < 1) { - return ''; - } - unitNameForm = unitNameForm === 0 ? 0 : 1; - let convertedResult = ''; - /* Определить порядковый номер с конца последнего числа, - которое находится до нулей */ - const lastDigitBeforeZerosIndex = numberScaleArr - .join('') - .split('') - .reverse() - .join('') - .search(/[1-9]/) + 1; - // Если нет цифр, кроме нуля - if (lastDigitBeforeZerosIndex === 0) { - convertedResult = unitNameForm === 0 ? textValues.slashNumberUnits.number[0][0] : textValues.slashNumberUnits.number[0][1]; - return convertedResult; - } - /* Определить в каком классе - lastDigitBeforeZerosIndex (какой класс изменяется по падежу) */ - const scaleChanging = Math.ceil(lastDigitBeforeZerosIndex / 3); - const scaleChangingIndex = numberScaleArr.length - scaleChanging; - /* Если есть еще классы над scaleChangingIndex, - то добавить их в именительном падеже */ - if (scaleChangingIndex > 0) { - // Сформировать массив только из этих классов - const simpleScalesArr = numberScaleArr.map((numberScale, scaleIndex) => { - // Если класс выше, чем scaleChangingIndex, то оставить его как есть - if (scaleIndex < scaleChangingIndex) { - return numberScale; - // Если класс ниже или равен scaleChangingIndex - } else { - return '000'; - } - }); - // Конвертировать их в именительном падеже - convertedResult += convertsEachScaleToWords(simpleScalesArr).result; - } - // Обработать класс, который меняется по падежам - // Если этот класс >= 2 (класс тысяч и выше) - if (scaleChanging >= 2) { - /* Переменная для составления длинного числа, - например "двухсотдвадцатипятитысячных" */ - let numberLongWord = ''; - // Поделить число текущего класса на цифры - const currentScaleNumberArr: any[] = numberScaleArr[scaleChangingIndex].split(''); - // Составить число - numberLongWord += textValues - .slashNumberUnits - .hundreds[currentScaleNumberArr[0]][2]; - // Если в разряде десятков стоит "1" - if (currentScaleNumberArr[1] === '1') { - numberLongWord += textValues - .slashNumberUnits - .teens[currentScaleNumberArr[2]][2]; - // Если в раздяде десятков стоит не "1" - } else { - numberLongWord += textValues - .slashNumberUnits - .tens[currentScaleNumberArr[1]][2]; - numberLongWord += textValues - .slashNumberUnits - .number[currentScaleNumberArr[2]][2]; - } - // Получить название класса - const unitName = textValues.getSlashNumberUnitsNames(scaleChanging); - // Добавить название класса - numberLongWord += unitName[unitNameForm]; - // Добавить результат к общему значению - convertedResult += ` ${numberLongWord}`; - // Если этот класс единиц (<1000) - } else { - let wordsResult = ''; - // Поделить число текущего класса на цифры - const currentScaleNumberArr: any[] = numberScaleArr[scaleChangingIndex].split(''); - // Индекс цифры, которой надо поменять форму - const digitIndexChange = 3 - lastDigitBeforeZerosIndex; - // Получить обычную часть числа - const currentScaleNumberNormal: any = currentScaleNumberArr.slice(); - // Если надо поменять цифру в первом разряде, а она часть 10-19 - if (digitIndexChange === 2 && currentScaleNumberNormal[1] === '1') { - // Не показывать разряд десяток в именительном падеже - currentScaleNumberNormal[1] = '0'; - } - currentScaleNumberNormal[digitIndexChange] = '0'; - // Добавить обычную часть числа - // Если есть обычная часть числа - if (digitIndexChange > 0) { - // Если есть цифры (!= 000) - if (currentScaleNumberNormal.join('') !== '000') { - // Конвертировать обычную часть числа в слова - wordsResult += convertsEachScaleToWords([currentScaleNumberNormal]) - .result; - } - } - // Добавить измененную часть числа - // Если это разряд сотен - if (digitIndexChange === 0) { - wordsResult += ' ' + textValues - .slashNumberUnits - .hundreds[currentScaleNumberArr[0]][unitNameForm]; - } else { - // Если это разряд десятков или единиц - // Если в разраде десятков цифра 1 (числа 10-19) - if (currentScaleNumberArr[1] === '1') { - wordsResult += ' ' + textValues - .slashNumberUnits - .teens[currentScaleNumberArr[2]][unitNameForm]; - } else { - // Если нужно менять разряд 2 (десятки) - if (digitIndexChange === 1) { - wordsResult += ' ' + textValues - .slashNumberUnits - .tens[currentScaleNumberArr[1]][unitNameForm]; - // Если нужно менять разряд 1 (единицы) - } else if (digitIndexChange === 2) { - wordsResult += ' ' + textValues - .slashNumberUnits - .number[currentScaleNumberArr[2]][unitNameForm]; - } - } - } - // Добавить результат к общему значению - convertedResult += ` ${wordsResult}`; - } - return convertedResult; -}; - -export default convertsEachScaleToWordsSlash; diff --git a/src/functions/fractionalPartToMinLength.ts b/src/functions/fractionalPartToMinLength.ts index 6d958e9..adf944a 100644 --- a/src/functions/fractionalPartToMinLength.ts +++ b/src/functions/fractionalPartToMinLength.ts @@ -3,9 +3,9 @@ import {CurrencySettings} from 'typeScript/interfaces/ConvertInterfaces'; /** * Сделать так, чтобы у дробной части числа * минимальная длина соответствовала currencyObject.fractionalPartMinLength - * @param {Array} numberArray - Число в виде массива ['-', '150', '/', '25']. - * @param {Object} currencyObject - Объект с параметрами валюты. - * @return {Array} Обновленный массив числа. + * @param {string[]} numberArray - Число в виде массива ['-', '150', '/', '25']. + * @param {object} currencyObject - Объект с параметрами валюты. + * @return {string[]} Обновленный массив числа. */ const fractionalPartToMinLength = (numberArray: string[], currencyObject: CurrencySettings): string[] => { // Если разделитель - дробная черта diff --git a/src/functions/getCurrencyObject.ts b/src/functions/getCurrencyObject.ts index 984dce1..0b19f32 100644 --- a/src/functions/getCurrencyObject.ts +++ b/src/functions/getCurrencyObject.ts @@ -1,6 +1,5 @@ import textValues from 'textValues'; -import defaultOptions from 'defaultOptions'; -import updateObjectDeep from 'functions/updateObjectDeep'; +import getCustomCurrency from 'functions/getCustomCurrency'; import { ConvertOptions, CurrencySettings, @@ -8,8 +7,8 @@ import { /** * Получить объект с данными валюты. - * @param {Object} convertOptions - Параметры конвертирования числа. - * @return {Object} Данные валюты. + * @param {ConvertOptions} convertOptions - Параметры конвертирования числа. + * @return {CurrencySettings} Данные валюты. */ const getCurrencyObject = (convertOptions?: ConvertOptions): CurrencySettings => { let currencyObject: CurrencySettings; @@ -27,33 +26,7 @@ const getCurrencyObject = (convertOptions?: ConvertOptions): CurrencySettings => } // Если валюта описана объектом } else if (typeof convertOptions.currency === 'object') { - // Названеи валюты по умолчанию - const defaultCurrencyName: any = defaultOptions['currency']; - // Объект валюты по умолчанию - const defaultCurrencyObject = textValues.currency[defaultCurrencyName]; - // Обновить объект валюты новым объектом валюты - const updatedCurrencyObject: CurrencySettings = updateObjectDeep(defaultCurrencyObject, convertOptions.currency); - // Удалить падежи - updatedCurrencyObject.currencyNameDeclensions = null; - updatedCurrencyObject.fractionalPartNameDeclensions = null; - - // Если объект оформлен правильно - if ( - typeof updatedCurrencyObject === 'object' && - Object.keys(updatedCurrencyObject).length === 6 && - updatedCurrencyObject.currencyNameCases.length === 3 && - updatedCurrencyObject.fractionalPartNameCases.length === 3 && - typeof updatedCurrencyObject.currencyNounGender === 'object' && - Object.keys(updatedCurrencyObject.currencyNounGender).length === 2 && - typeof updatedCurrencyObject.currencyNounGender.integer === 'number' && - typeof updatedCurrencyObject.currencyNounGender.fractionalPart === 'number' - ) { - // Принять валюту - currencyObject = updatedCurrencyObject; - } else { - // Если объект оформлен неправильно - throw new Error(`Wrong currency object.`); - } + currencyObject = getCustomCurrency(convertOptions); } return currencyObject; }; diff --git a/src/functions/getCurrencyWord.ts b/src/functions/getCurrencyWord.ts new file mode 100644 index 0000000..edea1d8 --- /dev/null +++ b/src/functions/getCurrencyWord.ts @@ -0,0 +1,49 @@ +import {declensions, Declension} from "units/declensions"; +import {CurrencySettings} from "typeScript/interfaces/ConvertInterfaces"; + +type numberParts = + | 'integer' + | 'fractional'; + +/** + * Поулчить валюту в виде текста в правильной форме. + * @param {CurrencySettings} currencyObject - Объект валюты. + * @param {numberParts} numberPart - Часть чиcла (целая / дробная). + * @param {number} unitNameForm - Форма валюты (0 / 1 / 2). + * @param {boolean} lastScaleIsZero - Равняется ли последнйи класс "000". + * @param {string | CurrencySettings} currency - Валюта. + * @param {Declension} declension - Падеж. + * @return {string} Валюта в виде текста ("рубля", "рублей", "копеек" и т.д.). + */ +const getCurrencyWord = ( + currencyObject: CurrencySettings, + numberPart: numberParts, + unitNameForm: number, + lastScaleIsZero: boolean, + currency: string | CurrencySettings, + declension: Declension +): string => { + const declensionsObejct = (numberPart === 'integer') ? currencyObject.currencyNameDeclensions : currencyObject.fractionalPartNameDeclensions; + let resultCurrencyWord = declensionsObejct[declension][unitNameForm === 0 ? 0 : 1]; + // Если падеж "именительный" или "винительный" и множественное число + if ( + (declension === declensions.NOMINATIVE + || declension === declensions.ACCUSATIVE) + && unitNameForm >= 1 + ) { + // Использовать родительный падеж. + resultCurrencyWord = declensionsObejct[declensions.GENITIVE][unitNameForm === 1 ? 0 : 1]; + // Если валюта указана как "number" + if (currency === 'number') { + resultCurrencyWord = declensionsObejct[declensions.GENITIVE][1]; + } + } + // Если последний класс числа равен "000" + if (lastScaleIsZero === true) { + // Всегда родительный падеж и множественное число + resultCurrencyWord = declensionsObejct[declensions.GENITIVE][1]; + } + return resultCurrencyWord; +} + +export default getCurrencyWord; diff --git a/src/functions/getCustomCurrency.ts b/src/functions/getCustomCurrency.ts new file mode 100644 index 0000000..327ec9e --- /dev/null +++ b/src/functions/getCustomCurrency.ts @@ -0,0 +1,92 @@ +import * as _ from 'lodash'; +import defaultOptions from 'defaultOptions'; +import textValues from 'textValues'; +import declensions from 'units/declensions'; +import updateObjectDeep from 'functions/updateObjectDeep'; +import {CurrencySettings} from 'typeScript/interfaces/ConvertInterfaces'; + +/** + * Создать объект валюты на основе объекта валюты пользователя. + * @param {ConvertOptions} convertOptions - Опции конвертирования валюты. + * @return {CurrencySettings} Готовый для использования объект валюты. + */ +const getCustomCurrency = (convertOptions: any): CurrencySettings => { + const userCurrencyObject = _.cloneDeep(convertOptions.currency); + // Название валюты по умолчанию + const defaultCurrencyName: any = defaultOptions['currency']; + // Объект валюты по умолчанию + const defaultCurrencyObject = textValues.currency[defaultCurrencyName]; + let editedCurrencyObject = _.cloneDeep(defaultCurrencyObject); + editedCurrencyObject = updateObjectDeep(editedCurrencyObject, userCurrencyObject); + // Если пользователь выбрал падеж "nominative" + if (convertOptions.declension === declensions.NOMINATIVE) { + // Заменить падежи в объекте целой части + // данными из массива "currencyNameCases" + // currencyNameCases[0] + if ( + _.get(userCurrencyObject, ['currencyNameDeclensions', declensions.NOMINATIVE, 0]) === undefined + && _.get(userCurrencyObject, ['currencyNameCases', 0]) !== undefined + ) { + _.set(editedCurrencyObject, ['currencyNameDeclensions', declensions.NOMINATIVE, 0], userCurrencyObject.currencyNameCases[0]); + } + // currencyNameCases[1] + if ( + _.get(userCurrencyObject, ['currencyNameDeclensions', declensions.GENITIVE, 0]) === undefined + && _.get(userCurrencyObject, ['currencyNameCases', 1]) !== undefined + ) { + _.set(editedCurrencyObject, ['currencyNameDeclensions', declensions.GENITIVE, 0], userCurrencyObject.currencyNameCases[1]); + } + // currencyNameCases[2] + if ( + _.get(userCurrencyObject, ['currencyNameDeclensions', declensions.GENITIVE, 1]) === undefined + && _.get(userCurrencyObject, ['currencyNameCases', 2]) !== undefined + ) { + _.set(editedCurrencyObject, ['currencyNameDeclensions', declensions.GENITIVE, 1], userCurrencyObject.currencyNameCases[2]); + } + // Заменить падежи в объекте дробной части + // данными из массива "fractionalPartNameCases" + // fractionalPartNameCases[0] + if ( + _.get(userCurrencyObject, ['fractionalPartNameDeclensions', declensions.NOMINATIVE, 0]) === undefined + && _.get(userCurrencyObject, ['fractionalPartNameCases', 0]) !== undefined + ) { + _.set(editedCurrencyObject, ['fractionalPartNameDeclensions', declensions.NOMINATIVE, 0], userCurrencyObject.fractionalPartNameCases[0]); + } + // fractionalPartNameCases[1] + if ( + _.get(userCurrencyObject, ['fractionalPartNameDeclensions', declensions.GENITIVE, 0]) === undefined + && _.get(userCurrencyObject, ['fractionalPartNameCases', 1]) !== undefined + ) { + _.set(editedCurrencyObject, ['fractionalPartNameDeclensions', declensions.GENITIVE, 0], userCurrencyObject.fractionalPartNameCases[1]); + } + // fractionalPartNameCases[2] + if ( + _.get(userCurrencyObject, ['fractionalPartNameDeclensions', declensions.GENITIVE, 1]) === undefined + && _.get(userCurrencyObject, ['fractionalPartNameCases', 2]) !== undefined + ) { + _.set(editedCurrencyObject, ['fractionalPartNameDeclensions', declensions.GENITIVE, 1], userCurrencyObject.fractionalPartNameCases[2]); + } + } + // Удалить формы валюты и оставить формы падежей валюты + delete editedCurrencyObject.currencyNameCases; + delete editedCurrencyObject.fractionalPartNameCases; + // Если объект оформлен правильно + if ( + typeof editedCurrencyObject === 'object' && + Object.keys(editedCurrencyObject).length === 4 && + typeof editedCurrencyObject.currencyNounGender === 'object' && + Object.keys(editedCurrencyObject.currencyNounGender).length === 2 && + typeof editedCurrencyObject.currencyNounGender.integer === 'number' && + typeof editedCurrencyObject.currencyNounGender.fractionalPart === 'number' && + typeof editedCurrencyObject.fractionalPartMinLength === 'number' && + typeof editedCurrencyObject.currencyNameDeclensions === 'object' && + typeof editedCurrencyObject.fractionalPartNameDeclensions === 'object' + ) { + return editedCurrencyObject; + } else { + // Если объект оформлен неправильно + throw new Error(`Wrong currency object.`); + } +}; + +export default getCustomCurrency; diff --git a/src/functions/getOptions.ts b/src/functions/getOptions.ts index f734e91..f140662 100644 --- a/src/functions/getOptions.ts +++ b/src/functions/getOptions.ts @@ -4,10 +4,10 @@ import {ConvertOptions} from 'typeScript/interfaces/ConvertInterfaces'; /** * Получить опции конверирования. - * @param {Object} options - Опции, выбранные пользователем. - * @return {Object} Опции конвертирования. + * @param {object} options - Опции, выбранные пользователем. + * @return {ConvertOptions} Опции конвертирования. */ -const getOptions = (options = {}): ConvertOptions => { +const getOptions = (options: object = {}): ConvertOptions => { // Опции по умолчанию const resultOptions = _.cloneDeep(defaultOptions); // Заменить опции по умолчанию выбранными опциями, если они правильно указаны diff --git a/src/functions/numberToScales.ts b/src/functions/numberToScales.ts index b7cd659..3e8fe83 100644 --- a/src/functions/numberToScales.ts +++ b/src/functions/numberToScales.ts @@ -1,7 +1,7 @@ /** * Разделить число на части по 3 цифры. * @param {string} number - Число, которое нужно разделить. - * @return {Array} Разделенное число, например ['009', '876', '543', ...]. + * @return {string[]} Разделенное число, например ['009', '876', '543', ...]. */ const numberToScales = (number: string): string[] => { // Сделать количество цифр числа кратным 3 diff --git a/src/functions/removeEmptyScalesBeforeNumber.ts b/src/functions/removeEmptyScalesBeforeNumber.ts new file mode 100644 index 0000000..b0ab995 --- /dev/null +++ b/src/functions/removeEmptyScalesBeforeNumber.ts @@ -0,0 +1,17 @@ +/** + * Убрать пустые классы перед числом в массиве классов числа.\ + * ['000', '000', '050', '000'] превратится в ['050', '000']. + * @param {string[]} numberScalesArr - Массив классов числа ['009', '876', '543', ...]. + * @return {string} Массив классов числа без нулевых классов в начале. + */ +export const removeEmptyScalesBeforeNumber = (numberScalesArr: string[]): string[] => { + // Найти первый индекс класса, в котором есть цифры (не "000") + const firstScaleWithNumberIndex = numberScalesArr.findIndex((scale) => { + return scale !== '000'; + }); + // Удалить все индексы массива до индекса найденного числа + const resultNumberScalesArr = numberScalesArr.slice(firstScaleWithNumberIndex); + return resultNumberScalesArr; +}; + +export default removeEmptyScalesBeforeNumber; diff --git a/src/functions/replaceAt.ts b/src/functions/replaceAt.ts index 0ebd935..5594380 100644 --- a/src/functions/replaceAt.ts +++ b/src/functions/replaceAt.ts @@ -2,10 +2,14 @@ * Заменить часть строки по индексу. * @param {string} string - Строка в которой нужно заменить. * @param {number} index - Индекс с которого нужно начать заменять. - * @param {string} newSubStr - Строка, которую нажно вставить на место индекса. + * @param {string | number} newSubStr - Строка, которую нажно вставить на место индекса. * @return {string} Измененная строка. */ -const replaceAt = (string: string, index: number, newSubStr: string | number): string => { +const replaceAt = ( + string: string, + index: number, + newSubStr: string | number +): string => { return string.substr(0, index) + newSubStr.toString() + string.substr(index + newSubStr.toString().length); diff --git a/src/functions/roundNumber.ts b/src/functions/roundNumber.ts index dd98038..a18d0d5 100644 --- a/src/functions/roundNumber.ts +++ b/src/functions/roundNumber.ts @@ -2,9 +2,9 @@ import replaceAt from 'functions/replaceAt'; /** * Округлить число в виде массива до заданной точности. - * @param {Array} numberArray - Число в виде массива. + * @param {string[]} numberArray - Число в виде массива. * @param {number} precision - Точность. Сколько знаков после запятой. - * @return {Array} Округленное число в виде массива. + * @return {string[]} Округленное число в виде массива. */ const roundNumber = (numberArray: string[], precision = 2): string[] => { // Если precision отрицательная, то не округлять diff --git a/src/functions/selectDataByDeclension.ts b/src/functions/selectDataByDeclension.ts new file mode 100644 index 0000000..5436e20 --- /dev/null +++ b/src/functions/selectDataByDeclension.ts @@ -0,0 +1,30 @@ +import {declensions, DeclensionsData} from "units/declensions"; + +/** + * Конвертировать в текст массив числа с разделителем "/". + * @param {Declensions} declensionsObject - Объект с падежами. + * @param {Declension} declension - Падеж. + * @param {boolean} isPlural - Множественное ли число. + * @return {string} Конвертированный результат (текст). + */ +export const selectDataByDeclension = ( + declensionsObject: DeclensionsData, + declension: Declension, + isPlural: boolean = false, +): string => { + let result = declensionsObject[declension][isPlural ? 1 : 0]; + // Если падеж "именительный" или "винительный" и множественное число + if ( + isPlural === true && + ( + declension === declensions.NOMINATIVE + || declension === declensions.ACCUSATIVE + ) + ) { + // Использовать родительный падеж. + result = declensionsObject[declensions.GENITIVE][1]; + } + return result; +} + +export default selectDataByDeclension; diff --git a/src/functions/splitNumberToArray.ts b/src/functions/splitNumberToArray.ts index ac8c3f3..c5ab263 100644 --- a/src/functions/splitNumberToArray.ts +++ b/src/functions/splitNumberToArray.ts @@ -2,9 +2,9 @@ import {ConvertOptions} from 'typeScript/interfaces/ConvertInterfaces'; /** * Разделить число на части. - * @param {(number|string)} number - Число, которое нужно обработать. - * @param {Object} options - Параметры конвертирования. - * @return {Array} Обработанное число в виде ['-', '150', '/', '25']. + * @param {string | number} number - Число, которое нужно обработать. + * @param {ConvertOptions} options - Параметры конвертирования. + * @return {string[]} Обработанное число в виде ['-', '150', '/', '25']. */ const splitNumberToArray = (number: string | number, options?: ConvertOptions): string[] => { // Максимальная длинна целой части числа diff --git a/src/functions/updateObjectDeep.ts b/src/functions/updateObjectDeep.ts index 107f965..ee414ae 100644 --- a/src/functions/updateObjectDeep.ts +++ b/src/functions/updateObjectDeep.ts @@ -4,9 +4,9 @@ import _deepMapValues from 'lodashFunctions/deepMapValues'; /** * Рекурсивное обновление значений в объекте. * Новые поля не добавляются. Значение обновляется, только если тип полей одинаковый. - * @param {Object} object - Исходный объект. - * @param {Object} newObject - Новый объект. - * @return {Object} Обновленный объект. + * @param {object} object - Исходный объект. + * @param {object} newObject - Новый объект. + * @return {object} Обновленный объект. */ const updateObjectDeep = (object: object, newObject: object): object => { return _deepMapValues(object, (path: string[], key: string, value: string) => { diff --git a/src/methods/convert.ts b/src/methods/convert.ts index 010d6c1..2d4545b 100644 --- a/src/methods/convert.ts +++ b/src/methods/convert.ts @@ -5,8 +5,8 @@ import {ConvertOptions} from 'typeScript/interfaces/ConvertInterfaces'; /** * Конвертировать число в текст - * @param {(string|number)} number - Число, которе нужно конвертировать. - * @param {Object} options - Параметры конвертирования. + * @param {string | number} number - Число, которе нужно конвертировать. + * @param {ConvertOptions} options - Параметры конвертирования. * @return {string} Число в виде текста */ const convert = (number: string | number, options?: ConvertOptions): string => { diff --git a/src/textValues.ts b/src/textValues.ts index 9442ccf..18d18a6 100644 --- a/src/textValues.ts +++ b/src/textValues.ts @@ -1,11 +1,8 @@ import genders from 'units/genders'; import {declensions} from "units/declensions"; -import slashNumberForms from 'units/slashNumberForms'; import {stringCurrencies} from 'units/stringCurrencies'; -import getFractionalNameForms from 'units/functions/getFractionalNameForms'; import getSlashNumberUnitName from 'units/functions/getSlashNumberUnitName'; import {CurrencyStringValues} from 'typeScript/interfaces/CurrencyStringValues'; -import {SlashNumberForms} from 'typeScript/interfaces/SlashNumberForms'; type DeclensionNumberName = string | { [key: string]: string, @@ -36,9 +33,7 @@ interface NumberNames { interface TextValues { minus: string, numberNames: NumberNames, - slashNumberUnits: SlashNumberForms, currency: CurrencyStringValues, - getFractionalUnits: Function, getSlashNumberUnitsNames: Function, }; @@ -138,10 +133,8 @@ export const numberNames: NumberNames = { const textValues: TextValues = { minus: 'минус', - slashNumberUnits: slashNumberForms, numberNames, currency: stringCurrencies, - getFractionalUnits: getFractionalNameForms, getSlashNumberUnitsNames: getSlashNumberUnitName, }; diff --git a/src/typeScript/interfaces/ConvertInterfaces.ts b/src/typeScript/interfaces/ConvertInterfaces.ts index 9d58b2c..2de29dd 100644 --- a/src/typeScript/interfaces/ConvertInterfaces.ts +++ b/src/typeScript/interfaces/ConvertInterfaces.ts @@ -55,26 +55,97 @@ export interface CurrencySettings { export interface ConvertOptions { /** * Select currency\ - * 'rub' Russian ruble 124 рубля 42 копейки\ - * 'usd' Dollar 124 доллара 42 цента\ - * 'eur' Euro 124 евро 42 цента\ - * 'number' Number without currency 124 целых 42 сотых\ - * Default: `rub` + * `'rub'` Russian ruble. 124 рубля 42 копейки\ + * `'usd'` Dollar. 124 доллара 42 цента\ + * `'eur'` Euro. 124 евро 42 цента\ + * `'number'` Number without currency. 124 целых 42 сотых\ + * `Object` Custom currency. 124 юаня 42 фыня\ + * Default: `'rub'` */ currency?: 'rub' | 'usd' | 'eur' | 'number' | CurrencySettings, + /** + * Select declension\ + * `'nominative'` Одна тысяча два рубля\ + * `'genitive'` Одной тысячи двух рублей\ + * `'dative'` Одной тысяче двум рублям\ + * `'accusative'` Одну тысячу два рубля\ + * `'instrumental'` Одной тысячей двумя рублями\ + * `'prepositional'` Одной тысяче двух рублях\ + * Default: `nominative` + */ declension?: Declension, + /** + * Rounding\ + * `-1` Rounding disabled\ + * `0` and more. Precision of rounding\ + * Default: `-1` + */ roundNumber?: number, + /** + * Convert minus sign to word\ + * `true` Минус\ + * `false` -\ + * Default: `true` + */ convertMinusSignToWord?: boolean; + /** + * Show number parts\ + * `Object` + */ showNumberParts?: { + /** + * Show integer part of number\ + * `true` **Два рубля** пять копеек\ + * `false` Пять копеек\ + * Default: `true` + */ integer?: boolean; + /** + * Show fractional part of number\ + * `true` Два рубля **пять копеек**\ + * `false` Два рубля\ + * Default: `true` + */ fractional?: boolean; }, + /** + * Convert number parts to words\ + * `Object` + */ convertNumbertToWords?: { + /** + * Convert integer part to words\ + * `true` **Два** рубля пять копеек\ + * `false` **2** рубля пять копеек\ + * Default: `true` + */ integer?: boolean; + /** + * Convert fractional part to words\ + * `true` Два рубля **пять** копеек\ + * `false` Два рубля **5** копеек\ + * Default: `false` + */ fractional?: boolean; }, + /** + * Show currency of number parts\ + * `Object` + */ showCurrency?: { + /** + * Show currency of integer part\ + * `true` Два **рубля** пять копеек\ + * `false` Два пять копеек\ + * Default: `true` + */ integer?: boolean; + /** + * Show currency of fractional part\ + * `true` Два рубля пять **копеек**\ + * `false` Два рубля пять\ + * Default: `true` + */ fractional?: boolean; }, } diff --git a/src/typeScript/interfaces/ConvertedScalesToWords.ts b/src/typeScript/interfaces/ConvertedScalesToWords.ts deleted file mode 100644 index 8487154..0000000 --- a/src/typeScript/interfaces/ConvertedScalesToWords.ts +++ /dev/null @@ -1,8 +0,0 @@ -import {Declension} from "units/declensions"; - -export interface ConvertedScalesToWords { - result: string, - unitNameForm: number, - unitDeclension: Declension, - isPlural: boolean -}; diff --git a/src/typeScript/interfaces/SlashNumberForms.ts b/src/typeScript/interfaces/SlashNumberForms.ts deleted file mode 100644 index ae9e901..0000000 --- a/src/typeScript/interfaces/SlashNumberForms.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface SlashNumberForms { - [key: string]: string[][], -}; diff --git a/src/units/declensions.ts b/src/units/declensions.ts index a1ef038..613d227 100644 --- a/src/units/declensions.ts +++ b/src/units/declensions.ts @@ -6,6 +6,10 @@ export type Declension = | 'instrumental' | 'prepositional'; +export type DeclensionsData = { + [key in Declension]?: [string, string]; +}; + export interface Declensions { [key: string]: Declension, }; diff --git a/src/units/fractional.ts b/src/units/fractional.ts deleted file mode 100644 index 6864d1f..0000000 --- a/src/units/fractional.ts +++ /dev/null @@ -1,14 +0,0 @@ -export const fractional = [ - ['десятая', 'десятых', 'десятых'], - ['сотая', 'сотых', 'сотых'], - ['тысячная', 'тысячных', 'тысячных'], - ['десятитысячная', 'десятитысячных', 'десятитысячных'], - ['стотысячная', 'стотысячных', 'стотысячных'], - ['миллионная', 'миллионных', 'миллионных'], - ['десятимиллионная', 'десятимиллионных', 'десятимиллионных'], - ['стомиллионная', 'стомиллионных', 'стомиллионных'], - // ... -]; - -export const fractionalWordEndings = ['ная', 'ных', 'ных']; -export const fractionalWordPrefixes = ['', 'десяти', 'сто']; diff --git a/src/units/fractionalCurrencyNumber.ts b/src/units/fractionalCurrencyNumber.ts new file mode 100644 index 0000000..f490f7d --- /dev/null +++ b/src/units/fractionalCurrencyNumber.ts @@ -0,0 +1,38 @@ +import {declensions} from "units/declensions"; + +export const fractionalUnitsDeclensions = [ + { + [declensions.NOMINATIVE]: ['десятая', 'десятые'], + [declensions.GENITIVE]: ['десятой', 'десятых'], + [declensions.DATIVE]: ['десятой', 'десятым'], + [declensions.ACCUSATIVE]: ['десятую', 'десятых'], + [declensions.INSTRUMENTAL]: ['десятой', 'десятыми'], + [declensions.PREPOSITIONAL]: ['десятой', 'десятых'], + }, + { + [declensions.NOMINATIVE]: ['сотая', 'сотые'], + [declensions.GENITIVE]: ['сотой', 'сотых'], + [declensions.DATIVE]: ['сотой', 'сотым'], + [declensions.ACCUSATIVE]: ['сотую', 'сотых'], + [declensions.INSTRUMENTAL]: ['сотой', 'сотыми'], + [declensions.PREPOSITIONAL]: ['сотой', 'сотых'], + }, +]; + +// Массоив корней для составления слова +export const fractionalUnitsBases = [ + 'тысяч', + // 'миллион', + // 'миллиард', + // ... +]; + +export const fractionalUnitPrefixes = ['', 'десяти', 'сто']; +export const fractionalUnitEndings = { + [declensions.NOMINATIVE]: ['ная', 'ные'], + [declensions.GENITIVE]: ['ной', 'ных'], + [declensions.DATIVE]: ['ной', 'ным'], + [declensions.ACCUSATIVE]: ['ную', 'ные'], + [declensions.INSTRUMENTAL]: ['ной', 'ными'], + [declensions.PREPOSITIONAL]: ['ной', 'ных'], +}; diff --git a/src/units/functions/getFractionalNameForms.ts b/src/units/functions/getFractionalNameForms.ts deleted file mode 100644 index a7afdee..0000000 --- a/src/units/functions/getFractionalNameForms.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { - fractional, - fractionalWordEndings, - fractionalWordPrefixes, -} from 'units/fractional'; -import getUnitName from "units/functions/getUnitName"; -import declensions from "units/declensions"; - -/** - * Получить падежи дробной части числа. - * @param {number} index - Индекс цифры к которой нужно получить падежи. - * @return {Array} Падежи дробной части числа. ['стомиллионная', 'стомиллионных', 'стомиллионных']. - */ -const getFractionalNameForms = (index: number): string[] => { - if (index < 0) { - index = 0; - } - let result; - // Если такой разряд есть в списке, то просто взять его как есть - if (fractional.length - 1 >= index) { - result = fractional[index]; - // Если такого разряда нет в списке, то сгенерировать - } else { - // Определить с какого index начинается гернерация значения - const indexStarts = fractional.length; - // Определить с какого по порядку класса нужно начать генерировать - const lastClass = Math.floor((fractional.length - 2) / 3); - const nextClass = lastClass + 1; - // Определить к какому классу относится указанный index - const classIndex = nextClass + Math.floor((index - indexStarts) / 3); - // Определить какой разряд у класса нужен - const classScaleIndex = (index - indexStarts) % 3; - // Сгенерировать массив - result = fractionalWordEndings.map((ending) => { - return fractionalWordPrefixes[classScaleIndex] - + getUnitName(classIndex, declensions.NOMINATIVE, false) - + ending; - }); - } - return result; -}; - -export default getFractionalNameForms; diff --git a/src/units/functions/getFractionalUnitCurrencyNumber.ts b/src/units/functions/getFractionalUnitCurrencyNumber.ts new file mode 100644 index 0000000..9cf6d9e --- /dev/null +++ b/src/units/functions/getFractionalUnitCurrencyNumber.ts @@ -0,0 +1,64 @@ +import * as _ from 'lodash'; +import { + fractionalUnitsDeclensions, + fractionalUnitsBases, + fractionalUnitPrefixes, + fractionalUnitEndings, +} from 'units/fractionalCurrencyNumber'; +import unitNames from 'units/unitNames'; +import {declensions, Declension} from "units/declensions"; +import selectDataByDeclension from 'functions/selectDataByDeclension'; + +/** + * Получить единицу измерения дробной части в виде слова. + * @param {number} index - Индекс цифры, у которой нужно получить единицу измерния (отсчет начинается с 0). + * @param {number} digitToConvert - Цифра, которая находится по индексу. + * @param {Declension} declension - Падеж. + * @param {number} unitNameForm - Форма валюты (0 / 1 / 2). + * @return {string} Единица измерения дробной части числа. ('десятая', 'стотысячных', 'десятимилонная' и т.д.). + */ +const getFractionalUnitCurrencyNumber = ( + index: number, + digitToConvert: number, + declension: Declension, + unitNameForm: number +): string => { + if (index < 0) { + index = 0; + } + let result = ''; + let unitDeclensionsObject:any = {}; + // Если такой разряд есть в массиве, то просто взять его объект падежей как есть + if (fractionalUnitsDeclensions.length - 1 >= index) { + unitDeclensionsObject = fractionalUnitsDeclensions[index] ?? {}; + // Если такого разряда нет в массиве, то сгенерировать его объект падежей + } else { + // Определить класс числа + // (0 - единицы, 1 - тысячи, 2 - миллионы и т.д.). + const numberScale = Math.ceil((index + 2) / 3) - 1; + // Получить разряд цифры в текущем классе + // (0 - единицы, 1 - десятки, 2 - сотни). + const digitIndexInScale = index - numberScale * 3 + 1; + // Получить корень названия класса числа + const unitNameBase = (numberScale <= fractionalUnitsBases.length) ? fractionalUnitsBases[numberScale - 1] : unitNames[numberScale - 2]; + // Получить приставку к числу + const unitNamePrefix = fractionalUnitPrefixes[digitIndexInScale]; + // Составить объект с падежами + Object.keys(fractionalUnitEndings).forEach((key) => { + const declensionEndings = fractionalUnitEndings[key]; + declensionEndings.forEach((ending, index) => { + _.set(unitDeclensionsObject, [key, index], `${unitNamePrefix}${unitNameBase}${ending}`); + }); + }); + } + // Выбрать правильную форму слова + result = selectDataByDeclension(unitDeclensionsObject, declension, (unitNameForm === 0) ? false : true); + // Если цифра для конвертирования === 0 + if (digitToConvert === 0) { + // Использовать родительный падеж. + result = unitDeclensionsObject[declensions.GENITIVE][1]; + } + return result; +}; + +export default getFractionalUnitCurrencyNumber; diff --git a/src/units/functions/getUnitName.ts b/src/units/functions/getNumberScaleName.ts similarity index 55% rename from src/units/functions/getUnitName.ts rename to src/units/functions/getNumberScaleName.ts index ed381e8..31bdc1e 100644 --- a/src/units/functions/getUnitName.ts +++ b/src/units/functions/getNumberScaleName.ts @@ -2,10 +2,10 @@ import {Declension, declensions} from "units/declensions"; import unitNames from 'units/unitNames'; const integerWordEndings = { - [declensions.NOMINATIVE]: ['', 'а'], + [declensions.NOMINATIVE]: ['', 'ы'], [declensions.GENITIVE]: ['а', 'ов'], [declensions.DATIVE]: ['у', 'ам'], - [declensions.ACCUSATIVE]: ['', 'ы'], + [declensions.ACCUSATIVE]: ['', 'а'], [declensions.INSTRUMENTAL]: ['ом', 'ами'], [declensions.PREPOSITIONAL]: ['е', 'ах'], }; @@ -25,24 +25,36 @@ let thousandNames: UnitName = { /** * Получить название класса числа в правильном падеже. - * @param {number} scale - Порядковый номер класса числа (0 - единицы, 1 - тысячи и т.д.). + * @param {number} scale - Индекс класса числа (0 - единицы, 1 - тысячи и т.д.). + * @param {number} scaleNameForm - Форма названия класса числа (0 / 1 / 2). * @param {Declension} declension - Падеж для класса числа. - * @param {boolean} isPlural - Множественость класса числа. * @return {string} Название класса числа (напр. "миллиард", "миллиона", "тысячи" и др.). */ -const getUnitName = (scale: number, declension: Declension, isPlural: boolean) => { +const getNumberScaleName = (scale: number, scaleNameForm: number, declension: Declension): string => { + let scaleDeclension = declension; + let scalePlural = (scaleNameForm === 0) ? 0 : 1; + // Если падеж "именительный" или "винительный" и множественное число + if ( + (declension === declensions.NOMINATIVE + || declension === declensions.ACCUSATIVE) + && scaleNameForm >= 1 + ) { + // Для множественного числа именительного падежа используется родительный падеж. + scaleDeclension = declensions.GENITIVE; + scalePlural = (scaleNameForm === 1) ? 0 : 1; + } if (scale === 0) { // Класс единиц // Для них название не отображается. return '' } else if (scale === 1) { // Класс тысяч - return thousandNames[declension][isPlural ? 1 : 0]; + return thousandNames[scaleDeclension][scalePlural]; } // Класс миллионов и так далее - const ending = integerWordEndings[declension][isPlural ? 1 : 0]; + const ending = integerWordEndings[scaleDeclension][scalePlural]; const base = unitNames[scale - 2]; return base ? base + ending : ''; }; -export default getUnitName; +export default getNumberScaleName; diff --git a/src/units/functions/getSlashNumberUnitName.ts b/src/units/functions/getSlashNumberUnitName.ts index efb6521..265715f 100644 --- a/src/units/functions/getSlashNumberUnitName.ts +++ b/src/units/functions/getSlashNumberUnitName.ts @@ -1,5 +1,5 @@ import declensions from "units/declensions"; -import getUnitName from "units/functions/getUnitName"; +import getNumberScaleName from "units/functions/getNumberScaleName"; const slashNumberUnitsForms = [ ['', ''], @@ -14,7 +14,7 @@ const slashNumberUnitEndings = ['ная', 'ных']; /** * Получить падежи дробной (через "/") части числа. * @param {number} scaleIndex - Порядковый номер класса числа (2 - тысячи, 3 - миллионы). - * @return {Array} Падежи, например ['миллионная', 'миллионных']. + * @return {string[]} Падежи, например ['миллионная', 'миллионных']. */ const getSlashNumberUnitName = (scaleIndex = 2): string[] => { if (scaleIndex < 1) { @@ -28,7 +28,7 @@ const getSlashNumberUnitName = (scaleIndex = 2): string[] => { } else { // Добавить окончания return slashNumberUnitEndings.map((ending) => { - return getUnitName(scaleIndex - 1, declensions.NOMINATIVE, false) + ending; + return getNumberScaleName(scaleIndex - 1, 0, declensions.NOMINATIVE) + ending; }); } return result; diff --git a/src/units/genders.ts b/src/units/genders.ts index db4093d..c678cae 100644 --- a/src/units/genders.ts +++ b/src/units/genders.ts @@ -1,16 +1,16 @@ export type Gender = | 'MALE' - | 'FEMALE' - | 'NEUTER'; + | 'NEUTER' + | 'FEMALE'; export interface Genders { [key: string]: Gender, }; -const genders: Genders = { +export const genders: Genders = { MALE: 'MALE', - FEMALE: 'FEMALE', NEUTER: 'NEUTER', + FEMALE: 'FEMALE', }; export default genders; diff --git a/src/units/ordinalNumbers/digits.ts b/src/units/ordinalNumbers/digits.ts new file mode 100644 index 0000000..617945c --- /dev/null +++ b/src/units/ordinalNumbers/digits.ts @@ -0,0 +1,277 @@ +import {declensions} from "units/declensions"; +import {genders} from "units/genders"; + +export const digits = [ + { + // 0 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['нулевой', 'нулевые'], + [declensions.GENITIVE]: ['нулевого', 'нулевых'], + [declensions.DATIVE]: ['нулевому', 'нулевым'], + [declensions.ACCUSATIVE]: ['нулевой', 'нулевые'], + [declensions.INSTRUMENTAL]: ['нулевым', 'нулевыми'], + [declensions.PREPOSITIONAL]: ['нулевом', 'нулевых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['нулевое', 'нулевые'], + [declensions.GENITIVE]: ['нулевого', 'нулевых'], + [declensions.DATIVE]: ['нулевому', 'нулевым'], + [declensions.ACCUSATIVE]: ['нулевое', 'нулевые'], + [declensions.INSTRUMENTAL]: ['нулевым', 'нулевыми'], + [declensions.PREPOSITIONAL]: ['нулевом', 'нулевых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['нулевая', 'нулевые'], + [declensions.GENITIVE]: ['нулевой', 'нулевых'], + [declensions.DATIVE]: ['нулевой', 'нулевым'], + [declensions.ACCUSATIVE]: ['нулевую', 'нулевые'], + [declensions.INSTRUMENTAL]: ['нулевой', 'нулевыми'], + [declensions.PREPOSITIONAL]: ['нулевой', 'нулевых'], + }, + }, + { + // 1 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['первый', 'первые'], + [declensions.GENITIVE]: ['первого', 'первых'], + [declensions.DATIVE]: ['первому', 'первым'], + [declensions.ACCUSATIVE]: ['первый', 'первые'], + [declensions.INSTRUMENTAL]: ['первым', 'первыми'], + [declensions.PREPOSITIONAL]: ['первом', 'первых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['первое', 'первые'], + [declensions.GENITIVE]: ['первого', 'первых'], + [declensions.DATIVE]: ['первому', 'первым'], + [declensions.ACCUSATIVE]: ['первое', 'первые'], + [declensions.INSTRUMENTAL]: ['первым', 'первыми'], + [declensions.PREPOSITIONAL]: ['первом', 'первых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['первая', 'первые'], + [declensions.GENITIVE]: ['первой', 'первых'], + [declensions.DATIVE]: ['первой', 'первым'], + [declensions.ACCUSATIVE]: ['первую', 'первые'], + [declensions.INSTRUMENTAL]: ['первой', 'первыми'], + [declensions.PREPOSITIONAL]: ['первой', 'первых'], + }, + }, + { + // 2 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['второй', 'вторые'], + [declensions.GENITIVE]: ['второго', 'вторых'], + [declensions.DATIVE]: ['второму', 'вторым'], + [declensions.ACCUSATIVE]: ['второй', 'вторые'], + [declensions.INSTRUMENTAL]: ['вторым', 'вторыми'], + [declensions.PREPOSITIONAL]: ['втором', 'вторых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['второе', 'вторые'], + [declensions.GENITIVE]: ['второго', 'вторых'], + [declensions.DATIVE]: ['второму', 'вторым'], + [declensions.ACCUSATIVE]: ['второе', 'вторые'], + [declensions.INSTRUMENTAL]: ['вторым', 'вторыми'], + [declensions.PREPOSITIONAL]: ['втором', 'вторых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['вторая', 'вторые'], + [declensions.GENITIVE]: ['второй', 'вторых'], + [declensions.DATIVE]: ['второй', 'вторым'], + [declensions.ACCUSATIVE]: ['вторую', 'вторые'], + [declensions.INSTRUMENTAL]: ['второй', 'вторыми'], + [declensions.PREPOSITIONAL]: ['второй', 'вторых'], + }, + }, + { + // 3 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['третий', 'третьи'], + [declensions.GENITIVE]: ['третьего', 'третьих'], + [declensions.DATIVE]: ['третьему', 'третьим'], + [declensions.ACCUSATIVE]: ['третий', 'третьи'], + [declensions.INSTRUMENTAL]: ['третьим', 'третьими'], + [declensions.PREPOSITIONAL]: ['третьем', 'третьих'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['третье', 'третьи'], + [declensions.GENITIVE]: ['третьего', 'третьих'], + [declensions.DATIVE]: ['третьему', 'третьим'], + [declensions.ACCUSATIVE]: ['третье', 'третьи'], + [declensions.INSTRUMENTAL]: ['третьим', 'третьими'], + [declensions.PREPOSITIONAL]: ['третьем', 'третьих'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['третья', 'третьи'], + [declensions.GENITIVE]: ['третьей', 'третьих'], + [declensions.DATIVE]: ['третьей', 'третьим'], + [declensions.ACCUSATIVE]: ['третью', 'третьи'], + [declensions.INSTRUMENTAL]: ['третьей', 'третьими'], + [declensions.PREPOSITIONAL]: ['третьей', 'третьих'], + }, + }, + { + // 4 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['четвёртый', 'четвёртые'], + [declensions.GENITIVE]: ['четвёртого', 'четвёртых'], + [declensions.DATIVE]: ['четвёртому', 'четвёртым'], + [declensions.ACCUSATIVE]: ['четвёртый', 'четвёртые'], + [declensions.INSTRUMENTAL]: ['четвёртым', 'четвёртыми'], + [declensions.PREPOSITIONAL]: ['четвёртом', 'четвёртых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['четвёртое', 'четвёртые'], + [declensions.GENITIVE]: ['четвёртого', 'четвёртых'], + [declensions.DATIVE]: ['четвёртому', 'четвёртым'], + [declensions.ACCUSATIVE]: ['четвёртое', 'четвёртые'], + [declensions.INSTRUMENTAL]: ['четвёртым', 'четвёртыми'], + [declensions.PREPOSITIONAL]: ['четвёртом', 'четвёртых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['четвёртая', 'четвёртые'], + [declensions.GENITIVE]: ['четвёртой', 'четвёртых'], + [declensions.DATIVE]: ['четвёртой', 'четвёртым'], + [declensions.ACCUSATIVE]: ['четвёртую', 'четвёртые'], + [declensions.INSTRUMENTAL]: ['четвёртой', 'четвёртыми'], + [declensions.PREPOSITIONAL]: ['четвёртой', 'четвёртых'], + }, + }, + { + // 5 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['пятый', 'пятые'], + [declensions.GENITIVE]: ['пятого', 'пятых'], + [declensions.DATIVE]: ['пятому', 'пятым'], + [declensions.ACCUSATIVE]: ['пятый', 'пятые'], + [declensions.INSTRUMENTAL]: ['пятым', 'пятыми'], + [declensions.PREPOSITIONAL]: ['пятом', 'пятых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['пятое', 'пятые'], + [declensions.GENITIVE]: ['пятого', 'пятых'], + [declensions.DATIVE]: ['пятому', 'пятым'], + [declensions.ACCUSATIVE]: ['пятое', 'пятые'], + [declensions.INSTRUMENTAL]: ['пятым', 'пятыми'], + [declensions.PREPOSITIONAL]: ['пятом', 'пятых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['пятая', 'пятые'], + [declensions.GENITIVE]: ['пятой', 'пятых'], + [declensions.DATIVE]: ['пятой', 'пятым'], + [declensions.ACCUSATIVE]: ['пятую', 'пятые'], + [declensions.INSTRUMENTAL]: ['пятой', 'пятыми'], + [declensions.PREPOSITIONAL]: ['пятой', 'пятых'], + }, + }, + { + // 6 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['шестой', 'шестые'], + [declensions.GENITIVE]: ['шестого', 'шестых'], + [declensions.DATIVE]: ['шестому', 'шестым'], + [declensions.ACCUSATIVE]: ['шестой', 'шестые'], + [declensions.INSTRUMENTAL]: ['шестым', 'шестыми'], + [declensions.PREPOSITIONAL]: ['шестом', 'шестых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['шестое', 'шестые'], + [declensions.GENITIVE]: ['шестого', 'шестых'], + [declensions.DATIVE]: ['шестому', 'шестым'], + [declensions.ACCUSATIVE]: ['шестое', 'шестые'], + [declensions.INSTRUMENTAL]: ['шестым', 'шестыми'], + [declensions.PREPOSITIONAL]: ['шестом', 'шестых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['шестая', 'шестые'], + [declensions.GENITIVE]: ['шестой', 'шестых'], + [declensions.DATIVE]: ['шестой', 'шестым'], + [declensions.ACCUSATIVE]: ['шестую', 'шестые'], + [declensions.INSTRUMENTAL]: ['шестой', 'шестыми'], + [declensions.PREPOSITIONAL]: ['шестой', 'шестых'], + }, + }, + { + // 7 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['седьмой', 'седьмые'], + [declensions.GENITIVE]: ['седьмого', 'седьмых'], + [declensions.DATIVE]: ['седьмому', 'седьмым'], + [declensions.ACCUSATIVE]: ['седьмой', 'седьмые'], + [declensions.INSTRUMENTAL]: ['седьмым', 'седьмыми'], + [declensions.PREPOSITIONAL]: ['седьмом', 'седьмых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['седьмое', 'седьмые'], + [declensions.GENITIVE]: ['седьмого', 'седьмых'], + [declensions.DATIVE]: ['седьмому', 'седьмым'], + [declensions.ACCUSATIVE]: ['седьмое', 'седьмые'], + [declensions.INSTRUMENTAL]: ['седьмым', 'седьмыми'], + [declensions.PREPOSITIONAL]: ['седьмом', 'седьмых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['седьмая', 'седьмые'], + [declensions.GENITIVE]: ['седьмой', 'седьмых'], + [declensions.DATIVE]: ['седьмой', 'седьмым'], + [declensions.ACCUSATIVE]: ['седьмую', 'седьмые'], + [declensions.INSTRUMENTAL]: ['седьмой', 'седьмыми'], + [declensions.PREPOSITIONAL]: ['седьмой', 'седьмых'], + }, + }, + { + // 8 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['восьмой', 'восьмые'], + [declensions.GENITIVE]: ['восьмого', 'восьмых'], + [declensions.DATIVE]: ['восьмому', 'восьмым'], + [declensions.ACCUSATIVE]: ['восьмой', 'восьмые'], + [declensions.INSTRUMENTAL]: ['восьмым', 'восьмыми'], + [declensions.PREPOSITIONAL]: ['восьмом', 'восьмых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['восьмое', 'восьмые'], + [declensions.GENITIVE]: ['восьмого', 'восьмых'], + [declensions.DATIVE]: ['восьмому', 'восьмым'], + [declensions.ACCUSATIVE]: ['восьмое', 'восьмые'], + [declensions.INSTRUMENTAL]: ['восьмым', 'восьмыми'], + [declensions.PREPOSITIONAL]: ['восьмом', 'восьмых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['восьмая', 'восьмые'], + [declensions.GENITIVE]: ['восьмой', 'восьмых'], + [declensions.DATIVE]: ['восьмой', 'восьмым'], + [declensions.ACCUSATIVE]: ['восьмую', 'восьмые'], + [declensions.INSTRUMENTAL]: ['восьмой', 'восьмыми'], + [declensions.PREPOSITIONAL]: ['восьмой', 'восьмых'], + }, + }, + { + // 9 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['девятый', 'девятые'], + [declensions.GENITIVE]: ['девятого', 'девятых'], + [declensions.DATIVE]: ['девятому', 'девятым'], + [declensions.ACCUSATIVE]: ['девятый', 'девятые'], + [declensions.INSTRUMENTAL]: ['девятым', 'девятыми'], + [declensions.PREPOSITIONAL]: ['девятом', 'девятых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['девятое', 'девятые'], + [declensions.GENITIVE]: ['девятого', 'девятых'], + [declensions.DATIVE]: ['девятому', 'девятым'], + [declensions.ACCUSATIVE]: ['девятое', 'девятые'], + [declensions.INSTRUMENTAL]: ['девятым', 'девятыми'], + [declensions.PREPOSITIONAL]: ['девятом', 'девятых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['девятая', 'девятые'], + [declensions.GENITIVE]: ['девятой', 'девятых'], + [declensions.DATIVE]: ['девятой', 'девятым'], + [declensions.ACCUSATIVE]: ['девятую', 'девятые'], + [declensions.INSTRUMENTAL]: ['девятой', 'девятыми'], + [declensions.PREPOSITIONAL]: ['девятой', 'девятых'], + }, + }, +]; + +export default digits; diff --git a/src/units/ordinalNumbers/hundreds.ts b/src/units/ordinalNumbers/hundreds.ts new file mode 100644 index 0000000..159abff --- /dev/null +++ b/src/units/ordinalNumbers/hundreds.ts @@ -0,0 +1,253 @@ +import {declensions} from "units/declensions"; +import {genders} from "units/genders"; + +export const hundreds = [ + { + // 0 (пусто) + }, + { + // 100 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['сотый', 'сотые'], + [declensions.GENITIVE]: ['сотого', 'сотых'], + [declensions.DATIVE]: ['сотому', 'сотым'], + [declensions.ACCUSATIVE]: ['сотый', 'сотые'], + [declensions.INSTRUMENTAL]: ['сотым', 'сотыми'], + [declensions.PREPOSITIONAL]: ['сотом', 'сотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['сотое', 'сотые'], + [declensions.GENITIVE]: ['сотого', 'сотых'], + [declensions.DATIVE]: ['сотому', 'сотым'], + [declensions.ACCUSATIVE]: ['сотое', 'сотые'], + [declensions.INSTRUMENTAL]: ['сотым', 'сотыми'], + [declensions.PREPOSITIONAL]: ['сотом', 'сотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['сотая', 'сотые'], + [declensions.GENITIVE]: ['сотой', 'сотых'], + [declensions.DATIVE]: ['сотой', 'сотым'], + [declensions.ACCUSATIVE]: ['сотую', 'сотые'], + [declensions.INSTRUMENTAL]: ['сотой', 'сотыми'], + [declensions.PREPOSITIONAL]: ['сотой', 'сотых'], + }, + }, + { + // 200 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['двухсотый', 'двухсотые'], + [declensions.GENITIVE]: ['двухсотого', 'двухсотых'], + [declensions.DATIVE]: ['двухсотому', 'двухсотым'], + [declensions.ACCUSATIVE]: ['двухсотый', 'двухсотые'], + [declensions.INSTRUMENTAL]: ['двухсотым', 'двухсотыми'], + [declensions.PREPOSITIONAL]: ['двухсотом', 'двухсотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['двухсотое', 'двухсотые'], + [declensions.GENITIVE]: ['двухсотого', 'двухсотых'], + [declensions.DATIVE]: ['двухсотому', 'двухсотым'], + [declensions.ACCUSATIVE]: ['двухсотое', 'двухсотые'], + [declensions.INSTRUMENTAL]: ['двухсотым', 'двухсотыми'], + [declensions.PREPOSITIONAL]: ['двухсотом', 'двухсотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['двухсотая', 'двухсотые'], + [declensions.GENITIVE]: ['двухсотой', 'двухсотых'], + [declensions.DATIVE]: ['двухсотой', 'двухсотым'], + [declensions.ACCUSATIVE]: ['двухсотую', 'двухсотые'], + [declensions.INSTRUMENTAL]: ['двухсотой', 'двухсотыми'], + [declensions.PREPOSITIONAL]: ['двухсотой', 'двухсотых'], + }, + }, + { + // 300 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['трёхсотый', 'трёхсотые'], + [declensions.GENITIVE]: ['трёхсотого', 'трёхсотых'], + [declensions.DATIVE]: ['трёхсотому', 'трёхсотым'], + [declensions.ACCUSATIVE]: ['трёхсотый', 'трёхсотые'], + [declensions.INSTRUMENTAL]: ['трёхсотым', 'трёхсотыми'], + [declensions.PREPOSITIONAL]: ['трёхсотом', 'трёхсотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['трёхсотое', 'трёхсотые'], + [declensions.GENITIVE]: ['трёхсотого', 'трёхсотых'], + [declensions.DATIVE]: ['трёхсотому', 'трёхсотым'], + [declensions.ACCUSATIVE]: ['трёхсотое', 'трёхсотые'], + [declensions.INSTRUMENTAL]: ['трёхсотым', 'трёхсотыми'], + [declensions.PREPOSITIONAL]: ['трёхсотом', 'трёхсотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['трёхсотая ', 'трёхсотые'], + [declensions.GENITIVE]: ['трёхсотой', 'трёхсотых'], + [declensions.DATIVE]: ['трёхсотой', 'трёхсотым'], + [declensions.ACCUSATIVE]: ['трёхсотую', 'трёхсотые'], + [declensions.INSTRUMENTAL]: ['трёхсотой', 'трёхсотыми'], + [declensions.PREPOSITIONAL]: ['трёхсотой', 'трёхсотых'], + }, + }, + { + // 400 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['четырёхсотый', 'четырёхсотые'], + [declensions.GENITIVE]: ['четырёхсотого', 'четырёхсотых'], + [declensions.DATIVE]: ['четырёхсотому', 'четырёхсотым'], + [declensions.ACCUSATIVE]: ['четырёхсотый', 'четырёхсотые'], + [declensions.INSTRUMENTAL]: ['четырёхсотым', 'четырёхсотыми'], + [declensions.PREPOSITIONAL]: ['четырёхсотом', 'четырёхсотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['четырёхсотое', 'четырёхсотые'], + [declensions.GENITIVE]: ['четырёхсотого', 'четырёхсотых'], + [declensions.DATIVE]: ['четырёхсотому', 'четырёхсотым'], + [declensions.ACCUSATIVE]: ['четырёхсотое', 'четырёхсотые'], + [declensions.INSTRUMENTAL]: ['четырёхсотым', 'четырёхсотыми'], + [declensions.PREPOSITIONAL]: ['четырёхсотом', 'четырёхсотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['четырёхсотая', 'четырёхсотые'], + [declensions.GENITIVE]: ['четырёхсотой', 'четырёхсотых'], + [declensions.DATIVE]: ['четырёхсотой', 'четырёхсотым'], + [declensions.ACCUSATIVE]: ['четырёхсотую', 'четырёхсотые'], + [declensions.INSTRUMENTAL]: ['четырёхсотой', 'четырёхсотыми'], + [declensions.PREPOSITIONAL]: ['четырёхсотой', 'четырёхсотых'], + }, + }, + { + // 500 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['пятисотый', 'пятисотые'], + [declensions.GENITIVE]: ['пятисотого', 'пятисотых'], + [declensions.DATIVE]: ['пятисотому', 'пятисотым'], + [declensions.ACCUSATIVE]: ['пятисотый', 'пятисотые'], + [declensions.INSTRUMENTAL]: ['пятисотым', 'пятисотыми'], + [declensions.PREPOSITIONAL]: ['пятисотом', 'пятисотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['пятисотое', 'пятисотые'], + [declensions.GENITIVE]: ['пятисотого', 'пятисотых'], + [declensions.DATIVE]: ['пятисотому', 'пятисотым'], + [declensions.ACCUSATIVE]: ['пятисотое', 'пятисотые'], + [declensions.INSTRUMENTAL]: ['пятисотым', 'пятисотыми'], + [declensions.PREPOSITIONAL]: ['пятисотом', 'пятисотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['пятисотая', 'пятисотые'], + [declensions.GENITIVE]: ['пятисотой', 'пятисотых'], + [declensions.DATIVE]: ['пятисотой', 'пятисотым'], + [declensions.ACCUSATIVE]: ['пятисотую', 'пятисотые'], + [declensions.INSTRUMENTAL]: ['пятисотой', 'пятисотыми'], + [declensions.PREPOSITIONAL]: ['пятисотой', 'пятисотых'], + }, + }, + { + // 600 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['шестисотый', 'шестисотые'], + [declensions.GENITIVE]: ['шестисотого', 'шестисотых'], + [declensions.DATIVE]: ['шестисотому', 'шестисотым'], + [declensions.ACCUSATIVE]: ['шестисотый', 'шестисотые'], + [declensions.INSTRUMENTAL]: ['шестисотым', 'шестисотыми'], + [declensions.PREPOSITIONAL]: ['шестисотом', 'шестисотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['шестисотое', 'шестисотые'], + [declensions.GENITIVE]: ['шестисотого', 'шестисотых'], + [declensions.DATIVE]: ['шестисотому', 'шестисотым'], + [declensions.ACCUSATIVE]: ['шестисотое', 'шестисотые'], + [declensions.INSTRUMENTAL]: ['шестисотым', 'шестисотыми'], + [declensions.PREPOSITIONAL]: ['шестисотом', 'шестисотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['шестисотая', 'шестисотые'], + [declensions.GENITIVE]: ['шестисотой', 'шестисотых'], + [declensions.DATIVE]: ['шестисотой', 'шестисотым'], + [declensions.ACCUSATIVE]: ['шестисотую', 'шестисотые'], + [declensions.INSTRUMENTAL]: ['шестисотой', 'шестисотыми'], + [declensions.PREPOSITIONAL]: ['шестисотой', 'шестисотых'], + }, + }, + { + // 700 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['семисотый', 'семисотые'], + [declensions.GENITIVE]: ['семисотого', 'семисотых'], + [declensions.DATIVE]: ['семисотому', 'семисотым'], + [declensions.ACCUSATIVE]: ['семисотый', 'семисотые'], + [declensions.INSTRUMENTAL]: ['семисотым', 'семисотыми'], + [declensions.PREPOSITIONAL]: ['семисотом', 'семисотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['семисотое', 'семисотые'], + [declensions.GENITIVE]: ['семисотого', 'семисотых'], + [declensions.DATIVE]: ['семисотому', 'семисотым'], + [declensions.ACCUSATIVE]: ['семисотое', 'семисотые'], + [declensions.INSTRUMENTAL]: ['семисотым', 'семисотыми'], + [declensions.PREPOSITIONAL]: ['семисотом', 'семисотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['семисотая', 'семисотые'], + [declensions.GENITIVE]: ['семисотой', 'семисотых'], + [declensions.DATIVE]: ['семисотой', 'семисотым'], + [declensions.ACCUSATIVE]: ['семисотую', 'семисотые'], + [declensions.INSTRUMENTAL]: ['семисотой', 'семисотыми'], + [declensions.PREPOSITIONAL]: ['семисотой', 'семисотых'], + }, + }, + { + // 800 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['восьмисотый', 'восьмисотые'], + [declensions.GENITIVE]: ['восьмисотого', 'восьмисотых'], + [declensions.DATIVE]: ['восьмисотому', 'восьмисотым'], + [declensions.ACCUSATIVE]: ['восьмисотый', 'восьмисотые'], + [declensions.INSTRUMENTAL]: ['восьмисотым', 'восьмисотыми'], + [declensions.PREPOSITIONAL]: ['восьмисотом', 'восьмисотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['восьмисотое', 'восьмисотые'], + [declensions.GENITIVE]: ['восьмисотого', 'восьмисотых'], + [declensions.DATIVE]: ['восьмисотому', 'восьмисотым'], + [declensions.ACCUSATIVE]: ['восьмисотое', 'восьмисотые'], + [declensions.INSTRUMENTAL]: ['восьмисотым', 'восьмисотыми'], + [declensions.PREPOSITIONAL]: ['восьмисотом', 'восьмисотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['восьмисотая', 'восьмисотые'], + [declensions.GENITIVE]: ['восьмисотой', 'восьмисотых'], + [declensions.DATIVE]: ['восьмисотой', 'восьмисотым'], + [declensions.ACCUSATIVE]: ['восьмисотую', 'восьмисотые'], + [declensions.INSTRUMENTAL]: ['восьмисотой', 'восьмисотыми'], + [declensions.PREPOSITIONAL]: ['восьмисотой', 'восьмисотых'], + }, + }, + { + // 900 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['девятисотый', 'девятисотые'], + [declensions.GENITIVE]: ['девятисотого', 'девятисотых'], + [declensions.DATIVE]: ['девятисотому', 'девятисотым'], + [declensions.ACCUSATIVE]: ['девятисотый', 'девятисотые'], + [declensions.INSTRUMENTAL]: ['девятисотым', 'девятисотыми'], + [declensions.PREPOSITIONAL]: ['девятисотом', 'девятисотых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['девятисотое', 'девятисотые'], + [declensions.GENITIVE]: ['девятисотого', 'девятисотых'], + [declensions.DATIVE]: ['девятисотому', 'девятисотым'], + [declensions.ACCUSATIVE]: ['девятисотое', 'девятисотые'], + [declensions.INSTRUMENTAL]: ['девятисотым', 'девятисотыми'], + [declensions.PREPOSITIONAL]: ['девятисотом', 'девятисотых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['девятисотая', 'девятисотые'], + [declensions.GENITIVE]: ['девятисотой', 'девятисотых'], + [declensions.DATIVE]: ['девятисотой', 'девятисотым'], + [declensions.ACCUSATIVE]: ['девятисотую', 'девятисотые'], + [declensions.INSTRUMENTAL]: ['девятисотой', 'девятисотыми'], + [declensions.PREPOSITIONAL]: ['девятисотой', 'девятисотых'], + }, + }, +]; + +export default hundreds; diff --git a/src/units/ordinalNumbers/ordinalNumbers.ts b/src/units/ordinalNumbers/ordinalNumbers.ts new file mode 100644 index 0000000..6cd3c04 --- /dev/null +++ b/src/units/ordinalNumbers/ordinalNumbers.ts @@ -0,0 +1,20 @@ +import digits from 'units/ordinalNumbers/digits'; +import tenToNineteen from 'units/ordinalNumbers/tenToNineteen'; +import tens from 'units/ordinalNumbers/tens'; +import hundreds from 'units/ordinalNumbers/hundreds'; + +interface OrdinalNumbersDeclensions { + digits: object[], + tenToNineteen: object[], + tens: object[], + hundreds: object[], +}; + +export const ordinalNumbersDeclensions: OrdinalNumbersDeclensions = { + digits: digits, + tenToNineteen: tenToNineteen, + tens: tens, + hundreds: hundreds, +}; + +export default ordinalNumbersDeclensions; diff --git a/src/units/ordinalNumbers/tenToNineteen.ts b/src/units/ordinalNumbers/tenToNineteen.ts new file mode 100644 index 0000000..f0a6571 --- /dev/null +++ b/src/units/ordinalNumbers/tenToNineteen.ts @@ -0,0 +1,277 @@ +import {declensions} from "units/declensions"; +import {genders} from "units/genders"; + +export const tenToNineteen = [ + { + // 10 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['десятый', 'десятые'], + [declensions.GENITIVE]: ['десятого', 'десятых'], + [declensions.DATIVE]: ['десятому', 'десятым'], + [declensions.ACCUSATIVE]: ['десятый', 'десятые'], + [declensions.INSTRUMENTAL]: ['десятым', 'десятыми'], + [declensions.PREPOSITIONAL]: ['десятом', 'десятых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['десятое', 'десятые'], + [declensions.GENITIVE]: ['десятого', 'десятых'], + [declensions.DATIVE]: ['десятому', 'десятым'], + [declensions.ACCUSATIVE]: ['десятое', 'десятые'], + [declensions.INSTRUMENTAL]: ['десятым', 'десятыми'], + [declensions.PREPOSITIONAL]: ['десятом', 'десятых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['десятая', 'десятые'], + [declensions.GENITIVE]: ['десятой', 'десятых'], + [declensions.DATIVE]: ['десятой', 'десятым'], + [declensions.ACCUSATIVE]: ['десятую', 'десятые'], + [declensions.INSTRUMENTAL]: ['десятой', 'десятыми'], + [declensions.PREPOSITIONAL]: ['десятой', 'десятых'], + }, + }, + { + // 11 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['одиннадцатый', 'одиннадцатые'], + [declensions.GENITIVE]: ['одиннадцатого', 'одиннадцатых'], + [declensions.DATIVE]: ['одиннадцатому', 'одиннадцатым'], + [declensions.ACCUSATIVE]: ['одиннадцатый', 'одиннадцатые'], + [declensions.INSTRUMENTAL]: ['одиннадцатым', 'одиннадцатыми'], + [declensions.PREPOSITIONAL]: ['одиннадцатом', 'одиннадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['одиннадцатое', 'одиннадцатые'], + [declensions.GENITIVE]: ['одиннадцатого', 'одиннадцатых'], + [declensions.DATIVE]: ['одиннадцатому', 'одиннадцатым'], + [declensions.ACCUSATIVE]: ['одиннадцатое', 'одиннадцатые'], + [declensions.INSTRUMENTAL]: ['одиннадцатым', 'одиннадцатыми'], + [declensions.PREPOSITIONAL]: ['одиннадцатом', 'одиннадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['одиннадцатая', 'одиннадцатые'], + [declensions.GENITIVE]: ['одиннадцатой', 'одиннадцатых'], + [declensions.DATIVE]: ['одиннадцатой', 'одиннадцатым'], + [declensions.ACCUSATIVE]: ['одиннадцатую', 'одиннадцатые'], + [declensions.INSTRUMENTAL]: ['одиннадцатой', 'одиннадцатыми'], + [declensions.PREPOSITIONAL]: ['одиннадцатой', 'одиннадцатых'], + }, + }, + { + // 12 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['двенадцатый', 'двенадцатые'], + [declensions.GENITIVE]: ['двенадцатого', 'двенадцатых'], + [declensions.DATIVE]: ['двенадцатому', 'двенадцатым'], + [declensions.ACCUSATIVE]: ['двенадцатый', 'двенадцатые'], + [declensions.INSTRUMENTAL]: ['двенадцатым', 'двенадцатыми'], + [declensions.PREPOSITIONAL]: ['двенадцатом', 'двенадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['двенадцатое', 'двенадцатые'], + [declensions.GENITIVE]: ['двенадцатого', 'двенадцатых'], + [declensions.DATIVE]: ['двенадцатому', 'двенадцатым'], + [declensions.ACCUSATIVE]: ['двенадцатое', 'двенадцатые'], + [declensions.INSTRUMENTAL]: ['двенадцатым', 'двенадцатыми'], + [declensions.PREPOSITIONAL]: ['двенадцатом', 'двенадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['двенадцатая', 'двенадцатые'], + [declensions.GENITIVE]: ['двенадцатой', 'двенадцатых'], + [declensions.DATIVE]: ['двенадцатой', 'двенадцатым'], + [declensions.ACCUSATIVE]: ['двенадцатую', 'двенадцатые'], + [declensions.INSTRUMENTAL]: ['двенадцатой', 'двенадцатыми'], + [declensions.PREPOSITIONAL]: ['двенадцатой', 'двенадцатых'], + }, + }, + { + // 13 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['тринадцатый', 'тринадцатые'], + [declensions.GENITIVE]: ['тринадцатого', 'тринадцатых'], + [declensions.DATIVE]: ['тринадцатому', 'тринадцатым'], + [declensions.ACCUSATIVE]: ['тринадцатый', 'тринадцатые'], + [declensions.INSTRUMENTAL]: ['тринадцатым', 'тринадцатыми'], + [declensions.PREPOSITIONAL]: ['тринадцатом', 'тринадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['тринадцатое', 'тринадцатые'], + [declensions.GENITIVE]: ['тринадцатого', 'тринадцатых'], + [declensions.DATIVE]: ['тринадцатому', 'тринадцатым'], + [declensions.ACCUSATIVE]: ['тринадцатое', 'тринадцатые'], + [declensions.INSTRUMENTAL]: ['тринадцатым', 'тринадцатыми'], + [declensions.PREPOSITIONAL]: ['тринадцатом', 'тринадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['тринадцатая', 'тринадцатые'], + [declensions.GENITIVE]: ['тринадцатой', 'тринадцатых'], + [declensions.DATIVE]: ['тринадцатой', 'тринадцатым'], + [declensions.ACCUSATIVE]: ['тринадцатую', 'тринадцатые'], + [declensions.INSTRUMENTAL]: ['тринадцатой', 'тринадцатыми'], + [declensions.PREPOSITIONAL]: ['тринадцатой', 'тринадцатых'], + }, + }, + { + // 14 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['четырнадцатый', 'четырнадцатые'], + [declensions.GENITIVE]: ['четырнадцатого', 'четырнадцатых'], + [declensions.DATIVE]: ['четырнадцатому', 'четырнадцатым'], + [declensions.ACCUSATIVE]: ['четырнадцатый', 'четырнадцатые'], + [declensions.INSTRUMENTAL]: ['четырнадцатым', 'четырнадцатыми'], + [declensions.PREPOSITIONAL]: ['четырнадцатом', 'четырнадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['четырнадцатое', 'четырнадцатые'], + [declensions.GENITIVE]: ['четырнадцатого', 'четырнадцатых'], + [declensions.DATIVE]: ['четырнадцатому', 'четырнадцатым'], + [declensions.ACCUSATIVE]: ['четырнадцатое', 'четырнадцатые'], + [declensions.INSTRUMENTAL]: ['четырнадцатым', 'четырнадцатыми'], + [declensions.PREPOSITIONAL]: ['четырнадцатом', 'четырнадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['четырнадцатая', 'четырнадцатые'], + [declensions.GENITIVE]: ['четырнадцатой', 'четырнадцатых'], + [declensions.DATIVE]: ['четырнадцатой', 'четырнадцатым'], + [declensions.ACCUSATIVE]: ['четырнадцатую', 'четырнадцатые'], + [declensions.INSTRUMENTAL]: ['четырнадцатой', 'четырнадцатыми'], + [declensions.PREPOSITIONAL]: ['четырнадцатой', 'четырнадцатых'], + }, + }, + { + // 15 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['пятнадцатый', 'пятнадцатые'], + [declensions.GENITIVE]: ['пятнадцатого', 'пятнадцатых'], + [declensions.DATIVE]: ['пятнадцатому', 'пятнадцатым'], + [declensions.ACCUSATIVE]: ['пятнадцатый', 'пятнадцатые'], + [declensions.INSTRUMENTAL]: ['пятнадцатым', 'пятнадцатыми'], + [declensions.PREPOSITIONAL]: ['пятнадцатом', 'пятнадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['пятнадцатое', 'пятнадцатые'], + [declensions.GENITIVE]: ['пятнадцатого', 'пятнадцатых'], + [declensions.DATIVE]: ['пятнадцатому', 'пятнадцатым'], + [declensions.ACCUSATIVE]: ['пятнадцатое', 'пятнадцатые'], + [declensions.INSTRUMENTAL]: ['пятнадцатым', 'пятнадцатыми'], + [declensions.PREPOSITIONAL]: ['пятнадцатом', 'пятнадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['пятнадцатая', 'пятнадцатые'], + [declensions.GENITIVE]: ['пятнадцатой', 'пятнадцатых'], + [declensions.DATIVE]: ['пятнадцатой', 'пятнадцатым'], + [declensions.ACCUSATIVE]: ['пятнадцатую', 'пятнадцатые'], + [declensions.INSTRUMENTAL]: ['пятнадцатой', 'пятнадцатыми'], + [declensions.PREPOSITIONAL]: ['пятнадцатой', 'пятнадцатых'], + }, + }, + { + // 16 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['шестнадцатый', 'шестнадцатые'], + [declensions.GENITIVE]: ['шестнадцатого', 'шестнадцатых'], + [declensions.DATIVE]: ['шестнадцатому', 'шестнадцатым'], + [declensions.ACCUSATIVE]: ['шестнадцатый', 'шестнадцатые'], + [declensions.INSTRUMENTAL]: ['шестнадцатым', 'шестнадцатыми'], + [declensions.PREPOSITIONAL]: ['шестнадцатом', 'шестнадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['шестнадцатое', 'шестнадцатые'], + [declensions.GENITIVE]: ['шестнадцатого', 'шестнадцатых'], + [declensions.DATIVE]: ['шестнадцатому', 'шестнадцатым'], + [declensions.ACCUSATIVE]: ['шестнадцатое', 'шестнадцатые'], + [declensions.INSTRUMENTAL]: ['шестнадцатым', 'шестнадцатыми'], + [declensions.PREPOSITIONAL]: ['шестнадцатом', 'шестнадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['шестнадцатая', 'шестнадцатые'], + [declensions.GENITIVE]: ['шестнадцатой', 'шестнадцатых'], + [declensions.DATIVE]: ['шестнадцатой', 'шестнадцатым'], + [declensions.ACCUSATIVE]: ['шестнадцатую', 'шестнадцатые'], + [declensions.INSTRUMENTAL]: ['шестнадцатой', 'шестнадцатыми'], + [declensions.PREPOSITIONAL]: ['шестнадцатой', 'шестнадцатых'], + }, + }, + { + // 17 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['семнадцатый', 'семнадцатые'], + [declensions.GENITIVE]: ['семнадцатого', 'семнадцатых'], + [declensions.DATIVE]: ['семнадцатому', 'семнадцатым'], + [declensions.ACCUSATIVE]: ['семнадцатый', 'семнадцатые'], + [declensions.INSTRUMENTAL]: ['семнадцатым', 'семнадцатыми'], + [declensions.PREPOSITIONAL]: ['семнадцатом', 'семнадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['семнадцатое', 'семнадцатые'], + [declensions.GENITIVE]: ['семнадцатого', 'семнадцатых'], + [declensions.DATIVE]: ['семнадцатому', 'семнадцатым'], + [declensions.ACCUSATIVE]: ['семнадцатое', 'семнадцатые'], + [declensions.INSTRUMENTAL]: ['семнадцатым', 'семнадцатыми'], + [declensions.PREPOSITIONAL]: ['семнадцатом', 'семнадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['семнадцатая', 'семнадцатые'], + [declensions.GENITIVE]: ['семнадцатой', 'семнадцатых'], + [declensions.DATIVE]: ['семнадцатой', 'семнадцатым'], + [declensions.ACCUSATIVE]: ['семнадцатую', 'семнадцатые'], + [declensions.INSTRUMENTAL]: ['семнадцатой', 'семнадцатыми'], + [declensions.PREPOSITIONAL]: ['семнадцатой', 'семнадцатых'], + }, + }, + { + // 18 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['восемнадцатый', 'восемнадцатые'], + [declensions.GENITIVE]: ['восемнадцатого', 'восемнадцатых'], + [declensions.DATIVE]: ['восемнадцатому', 'восемнадцатым'], + [declensions.ACCUSATIVE]: ['восемнадцатый', 'восемнадцатые'], + [declensions.INSTRUMENTAL]: ['восемнадцатым', 'восемнадцатыми'], + [declensions.PREPOSITIONAL]: ['восемнадцатом', 'восемнадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['восемнадцатое', 'восемнадцатые'], + [declensions.GENITIVE]: ['восемнадцатого', 'восемнадцатых'], + [declensions.DATIVE]: ['восемнадцатому', 'восемнадцатым'], + [declensions.ACCUSATIVE]: ['восемнадцатое', 'восемнадцатые'], + [declensions.INSTRUMENTAL]: ['восемнадцатым', 'восемнадцатыми'], + [declensions.PREPOSITIONAL]: ['восемнадцатом', 'восемнадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['восемнадцатая', 'восемнадцатые'], + [declensions.GENITIVE]: ['восемнадцатой', 'восемнадцатых'], + [declensions.DATIVE]: ['восемнадцатой', 'восемнадцатым'], + [declensions.ACCUSATIVE]: ['восемнадцатую', 'восемнадцатые'], + [declensions.INSTRUMENTAL]: ['восемнадцатой', 'восемнадцатыми'], + [declensions.PREPOSITIONAL]: ['восемнадцатой', 'восемнадцатых'], + }, + }, + { + // 19 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['девятнадцатый', 'девятнадцатые'], + [declensions.GENITIVE]: ['девятнадцатого', 'девятнадцатых'], + [declensions.DATIVE]: ['девятнадцатому', 'девятнадцатым'], + [declensions.ACCUSATIVE]: ['девятнадцатый', 'девятнадцатые'], + [declensions.INSTRUMENTAL]: ['девятнадцатым', 'девятнадцатыми'], + [declensions.PREPOSITIONAL]: ['девятнадцатом', 'девятнадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['девятнадцатое', 'девятнадцатые'], + [declensions.GENITIVE]: ['девятнадцатого', 'девятнадцатых'], + [declensions.DATIVE]: ['девятнадцатому', 'девятнадцатым'], + [declensions.ACCUSATIVE]: ['девятнадцатое', 'девятнадцатые'], + [declensions.INSTRUMENTAL]: ['девятнадцатым', 'девятнадцатыми'], + [declensions.PREPOSITIONAL]: ['девятнадцатом', 'девятнадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['девятнадцатая', 'девятнадцатые'], + [declensions.GENITIVE]: ['девятнадцатой', 'девятнадцатых'], + [declensions.DATIVE]: ['девятнадцатой', 'девятнадцатым'], + [declensions.ACCUSATIVE]: ['девятнадцатую', 'девятнадцатые'], + [declensions.INSTRUMENTAL]: ['девятнадцатой', 'девятнадцатыми'], + [declensions.PREPOSITIONAL]: ['девятнадцатой', 'девятнадцатых'], + }, + }, +]; + +export default tenToNineteen; diff --git a/src/units/ordinalNumbers/tens.ts b/src/units/ordinalNumbers/tens.ts new file mode 100644 index 0000000..091708a --- /dev/null +++ b/src/units/ordinalNumbers/tens.ts @@ -0,0 +1,229 @@ +import {declensions} from "units/declensions"; +import {genders} from "units/genders"; + +export const tens = [ + { + // 0 (пусто) + }, + { + // 10 (пусто) + }, + { + // 20 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['двадцатый', 'двадцатые'], + [declensions.GENITIVE]: ['двадцатого', 'двадцатых'], + [declensions.DATIVE]: ['двадцатому', 'двадцатым'], + [declensions.ACCUSATIVE]: ['двадцатый', 'двадцатые'], + [declensions.INSTRUMENTAL]: ['двадцатым', 'двадцатыми'], + [declensions.PREPOSITIONAL]: ['двадцатом', 'двадцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['двадцатое', 'двадцатые'], + [declensions.GENITIVE]: ['двадцатого', 'двадцатых'], + [declensions.DATIVE]: ['двадцатому', 'двадцатым'], + [declensions.ACCUSATIVE]: ['двадцатое', 'двадцатые'], + [declensions.INSTRUMENTAL]: ['двадцатым', 'двадцатыми'], + [declensions.PREPOSITIONAL]: ['двадцатом', 'двадцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['двадцатая', 'двадцатые'], + [declensions.GENITIVE]: ['двадцатой', 'двадцатых'], + [declensions.DATIVE]: ['двадцатой', 'двадцатым'], + [declensions.ACCUSATIVE]: ['двадцатую', 'двадцатые'], + [declensions.INSTRUMENTAL]: ['двадцатой', 'двадцатыми'], + [declensions.PREPOSITIONAL]: ['двадцатой', 'двадцатых'], + }, + }, + { + // 30 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['тридцатый', 'тридцатые'], + [declensions.GENITIVE]: ['тридцатого', 'тридцатых'], + [declensions.DATIVE]: ['тридцатому', 'тридцатым'], + [declensions.ACCUSATIVE]: ['тридцатый', 'тридцатые'], + [declensions.INSTRUMENTAL]: ['тридцатым', 'тридцатыми'], + [declensions.PREPOSITIONAL]: ['тридцатом', 'тридцатых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['тридцатое', 'тридцатые'], + [declensions.GENITIVE]: ['тридцатого', 'тридцатых'], + [declensions.DATIVE]: ['тридцатому', 'тридцатым'], + [declensions.ACCUSATIVE]: ['тридцатое', 'тридцатые'], + [declensions.INSTRUMENTAL]: ['тридцатым', 'тридцатыми'], + [declensions.PREPOSITIONAL]: ['тридцатом', 'тридцатых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['тридцатая', 'тридцатые'], + [declensions.GENITIVE]: ['тридцатой', 'тридцатых'], + [declensions.DATIVE]: ['тридцатой', 'тридцатым'], + [declensions.ACCUSATIVE]: ['тридцатую', 'тридцатые'], + [declensions.INSTRUMENTAL]: ['тридцатой', 'тридцатыми'], + [declensions.PREPOSITIONAL]: ['тридцатой', 'тридцатых'], + }, + }, + { + // 40 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['сороковой', 'сороковые'], + [declensions.GENITIVE]: ['сорокового', 'сороковых'], + [declensions.DATIVE]: ['сороковому', 'сороковым'], + [declensions.ACCUSATIVE]: ['сороковой', 'сороковые'], + [declensions.INSTRUMENTAL]: ['сороковым', 'сороковыми'], + [declensions.PREPOSITIONAL]: ['сороковом', 'сороковых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['сороковое', 'сороковые'], + [declensions.GENITIVE]: ['сорокового', 'сороковых'], + [declensions.DATIVE]: ['сороковому', 'сороковым'], + [declensions.ACCUSATIVE]: ['сороковое', 'сороковые'], + [declensions.INSTRUMENTAL]: ['сороковым', 'сороковыми'], + [declensions.PREPOSITIONAL]: ['сороковом', 'сороковых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['сороковая', 'сороковые'], + [declensions.GENITIVE]: ['сороковой', 'сороковых'], + [declensions.DATIVE]: ['сороковой', 'сороковым'], + [declensions.ACCUSATIVE]: ['сороковую', 'сороковые'], + [declensions.INSTRUMENTAL]: ['сороковой', 'сороковыми'], + [declensions.PREPOSITIONAL]: ['сороковой', 'сороковых'], + }, + }, + { + // 50 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['пятидесятый', 'пятидесятые'], + [declensions.GENITIVE]: ['пятидесятого', 'пятидесятых'], + [declensions.DATIVE]: ['пятидесятому', 'пятидесятым'], + [declensions.ACCUSATIVE]: ['пятидесятый', 'пятидесятые'], + [declensions.INSTRUMENTAL]: ['пятидесятым', 'пятидесятыми'], + [declensions.PREPOSITIONAL]: ['пятидесятом', 'пятидесятых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['пятидесятое', 'пятидесятые'], + [declensions.GENITIVE]: ['пятидесятого', 'пятидесятых'], + [declensions.DATIVE]: ['пятидесятому', 'пятидесятым'], + [declensions.ACCUSATIVE]: ['пятидесятое', 'пятидесятые'], + [declensions.INSTRUMENTAL]: ['пятидесятым', 'пятидесятыми'], + [declensions.PREPOSITIONAL]: ['пятидесятом', 'пятидесятых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['пятидесятая', 'пятидесятые'], + [declensions.GENITIVE]: ['пятидесятой', 'пятидесятых'], + [declensions.DATIVE]: ['пятидесятой', 'пятидесятым'], + [declensions.ACCUSATIVE]: ['пятидесятую', 'пятидесятые'], + [declensions.INSTRUMENTAL]: ['пятидесятой', 'пятидесятыми'], + [declensions.PREPOSITIONAL]: ['пятидесятой', 'пятидесятых'], + }, + }, + { + // 60 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['шестидесятый', 'шестидесятые'], + [declensions.GENITIVE]: ['шестидесятого', 'шестидесятых'], + [declensions.DATIVE]: ['шестидесятому', 'шестидесятым'], + [declensions.ACCUSATIVE]: ['шестидесятый', 'шестидесятые'], + [declensions.INSTRUMENTAL]: ['шестидесятым', 'шестидесятыми'], + [declensions.PREPOSITIONAL]: ['шестидесятом', 'шестидесятых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['шестидесятое', 'шестидесятые'], + [declensions.GENITIVE]: ['шестидесятого', 'шестидесятых'], + [declensions.DATIVE]: ['шестидесятому ', 'шестидесятым'], + [declensions.ACCUSATIVE]: ['шестидесятое', 'шестидесятые'], + [declensions.INSTRUMENTAL]: ['шестидесятым', 'шестидесятыми'], + [declensions.PREPOSITIONAL]: ['шестидесятом', 'шестидесятых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['шестидесятая', 'шестидесятые'], + [declensions.GENITIVE]: ['шестидесятой', 'шестидесятых'], + [declensions.DATIVE]: ['шестидесятой', 'шестидесятым'], + [declensions.ACCUSATIVE]: ['шестидесятую', 'шестидесятые'], + [declensions.INSTRUMENTAL]: ['шестидесятой', 'шестидесятыми'], + [declensions.PREPOSITIONAL]: ['шестидесятой', 'шестидесятых'], + }, + }, + { + // 70 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['семидесятый', 'семидесятые'], + [declensions.GENITIVE]: ['семидесятого', 'семидесятых'], + [declensions.DATIVE]: ['семидесятому', 'семидесятым'], + [declensions.ACCUSATIVE]: ['семидесятый', 'семидесятые'], + [declensions.INSTRUMENTAL]: ['семидесятым', 'семидесятыми'], + [declensions.PREPOSITIONAL]: ['семидесятом', 'семидесятых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['семидесятое', 'семидесятые'], + [declensions.GENITIVE]: ['семидесятого', 'семидесятых'], + [declensions.DATIVE]: ['семидесятому', 'семидесятым'], + [declensions.ACCUSATIVE]: ['семидесятое', 'семидесятые'], + [declensions.INSTRUMENTAL]: ['семидесятым', 'семидесятыми'], + [declensions.PREPOSITIONAL]: ['семидесятом', 'семидесятых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['семидесятая', 'семидесятые'], + [declensions.GENITIVE]: ['семидесятой', 'семидесятых'], + [declensions.DATIVE]: ['семидесятой', 'семидесятым'], + [declensions.ACCUSATIVE]: ['семидесятую', 'семидесятые'], + [declensions.INSTRUMENTAL]: ['семидесятой', 'семидесятыми'], + [declensions.PREPOSITIONAL]: ['семидесятой', 'семидесятых'], + }, + }, + { + // 80 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['восьмидесятый', 'восьмидесятые'], + [declensions.GENITIVE]: ['восьмидесятого', 'восьмидесятых'], + [declensions.DATIVE]: ['восьмидесятому', 'восьмидесятым'], + [declensions.ACCUSATIVE]: ['восьмидесятый', 'восьмидесятые'], + [declensions.INSTRUMENTAL]: ['восьмидесятым', 'восьмидесятыми'], + [declensions.PREPOSITIONAL]: ['восьмидесятом', 'восьмидесятых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['восьмидесятое', 'восьмидесятые'], + [declensions.GENITIVE]: ['восьмидесятого', 'восьмидесятых'], + [declensions.DATIVE]: ['восьмидесятому', 'восьмидесятым'], + [declensions.ACCUSATIVE]: ['восьмидесятое', 'восьмидесятые'], + [declensions.INSTRUMENTAL]: ['восьмидесятым', 'восьмидесятыми'], + [declensions.PREPOSITIONAL]: ['восьмидесятом', 'восьмидесятых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['восьмидесятая', 'восьмидесятые'], + [declensions.GENITIVE]: ['восьмидесятой', 'восьмидесятых'], + [declensions.DATIVE]: ['восьмидесятой', 'восьмидесятым'], + [declensions.ACCUSATIVE]: ['восьмидесятую', 'восьмидесятые'], + [declensions.INSTRUMENTAL]: ['восьмидесятой', 'восьмидесятыми'], + [declensions.PREPOSITIONAL]: ['восьмидесятой', 'восьмидесятых'], + }, + }, + { + // 90 + [genders.MALE]: { + [declensions.NOMINATIVE]: ['девяностый', 'девяностые'], + [declensions.GENITIVE]: ['девяностого', 'девяностых'], + [declensions.DATIVE]: ['девяностому', 'девяностым'], + [declensions.ACCUSATIVE]: ['девяностый', 'девяностые'], + [declensions.INSTRUMENTAL]: ['девяностым', 'девяностыми'], + [declensions.PREPOSITIONAL]: ['девяностом', 'девяностых'], + }, + [genders.NEUTER]: { + [declensions.NOMINATIVE]: ['девяностое', 'девяностые'], + [declensions.GENITIVE]: ['девяностого', 'девяностых'], + [declensions.DATIVE]: ['девяностому', 'девяностым'], + [declensions.ACCUSATIVE]: ['девяностое', 'девяностые'], + [declensions.INSTRUMENTAL]: ['девяностым', 'девяностыми'], + [declensions.PREPOSITIONAL]: ['девяностом', 'девяностых'], + }, + [genders.FEMALE]: { + [declensions.NOMINATIVE]: ['девяностая', 'девяностые'], + [declensions.GENITIVE]: ['девяностой', 'девяностых'], + [declensions.DATIVE]: ['девяностой', 'девяностым'], + [declensions.ACCUSATIVE]: ['девяностую', 'девяностые'], + [declensions.INSTRUMENTAL]: ['девяностой', 'девяностыми'], + [declensions.PREPOSITIONAL]: ['девяностой', 'девяностых'], + }, + }, +]; + +export default tens; diff --git a/src/units/slashNumberForms.ts b/src/units/slashNumberForms.ts deleted file mode 100644 index 10da45b..0000000 --- a/src/units/slashNumberForms.ts +++ /dev/null @@ -1,54 +0,0 @@ -import {SlashNumberForms} from 'typeScript/interfaces/SlashNumberForms'; - -const slashNumberForms: SlashNumberForms = { - number: [ - ['нулевая', 'нулевых', ''], - ['первая', 'первых', ''], - ['вторая', 'вторых', 'двух'], - ['третья', 'третьих', 'трёх'], - ['четвёртая', 'четвёртых', 'четырёх'], - ['пятая', 'пятых', 'пяти'], - ['шестая', 'шестых', 'шести'], - ['седьмая', 'седьмых', 'семи'], - ['восьмая', 'восьмых', 'восьми'], - ['девятая', 'девятых', 'девяти'], - ], - teens: [ - ['десятая', 'десятых', 'десяти'], - ['одиннадцатая', 'одиннадцатых', 'одиннадцати'], - ['двенадцатая', 'двенадцатых', 'двенадцати'], - ['тринадцатая', 'тринадцатых', 'тринадцати'], - ['четырнадцатая', 'четырнадцатых', 'четырнадцати'], - ['пятнадцатая', 'пятнадцатых', 'пятнадцати'], - ['шестнадцатая', 'шестнадцатых', 'шестнадцати'], - ['семнадцатая', 'семнадцатых', 'семнадцати'], - ['восемнадцатая', 'восемнадцатых', 'восемнадцати'], - ['девятнадцатая', 'девятнадцатых', 'девятнадцати'], - ], - tens: [ - ['', '', ''], - ['', '', ''], - ['двадцатая', 'двадцатых', 'двадцати'], - ['тридцатая', 'тридцатых', 'тридцати'], - ['сороковая', 'сороковых', 'сорока'], - ['пятидесятая', 'пятидесятых', 'пятидесяти'], - ['шестидесятая', 'шестидесятых', 'шестидесяти'], - ['семидесятая', 'семидесятых', 'семидесяти'], - ['восьмидесятая', 'восьмидесятых', 'восьмидесяти'], - ['девятидесятая', 'девятидесятых', 'девяносто'], // (Это исключение. Правильно - Девяностотысячных) - ], - hundreds: [ - ['', '', ''], - ['сотая', 'сотых', 'сто'], // (Это исключение. Правильно - Стотысячных) - ['двухсотая', 'двухсотых', 'двухсот'], - ['трёхсотая', 'трёхсотых', 'трёхсот'], - ['четырёхсотая', 'четырёхсотых', 'четырёхсот'], - ['пятисотая', 'пятисотых', 'пятисот'], - ['шестисотая', 'шестисотых', 'шестисот'], - ['семисотая', 'семисотых', 'семисот'], - ['восьмисотая', 'восьмисотых', 'восьмисот'], - ['девятисотая', 'девятисотых', 'девятисот'], - ], -}; - -export default slashNumberForms; diff --git a/src/units/slashNumberUnitPrefixes.ts b/src/units/slashNumberUnitPrefixes.ts new file mode 100644 index 0000000..34bf635 --- /dev/null +++ b/src/units/slashNumberUnitPrefixes.ts @@ -0,0 +1,59 @@ +export interface SlashNumberUnitPrefixes { + digit: string[], + tenToNineteen: string[], + tens: string[], + hundreds: string[], +}; + +export const slashNumberUnitPrefixes: SlashNumberUnitPrefixes = { + digit: [ + '', + 'одно', + 'двух', // "двухтысячная" + 'трёх', + 'четырёх', + 'пяти', + 'шести', + 'семи', + 'восьми', + 'девяти', + ], + tenToNineteen: [ + 'десяти', + 'одиннадцати', + 'двенадцати', // "двенадцатитысячная" + 'тринадцати', + 'четырнадцати', + 'пятнадцати', + 'шестнадцати', + 'семидесяти', + 'восемнадцати', + 'девятнадцати', + ], + tens: [ + '', + '', + 'двадцати', // "двадцатитысячная" + 'тридцати', + 'сорока', + 'пятидесяти', + 'шестидесяти', + 'семидесяти', + 'восьмидесяти', + 'девяносто', + ], + hundreds: [ + '', + 'сто', + 'двухсот', // "двухсоттысячная" + 'трёхсот', + 'четырёхсот', + 'пятисот', + 'шестисот', + 'семисот', + 'восьмисот', + 'девятисот', + ], +}; + +export default slashNumberUnitPrefixes; diff --git a/src/units/stringCurrencies.ts b/src/units/stringCurrencies.ts index 6a2d310..32c36a2 100644 --- a/src/units/stringCurrencies.ts +++ b/src/units/stringCurrencies.ts @@ -8,7 +8,23 @@ const defaultParams = { export const stringCurrencies: CurrencyStringValues = { number: { currencyNameCases: ['целая', 'целых', 'целых'], + currencyNameDeclensions: { + [declensions.NOMINATIVE]: ['целая', 'целые'], + [declensions.GENITIVE]: ['целой', 'целых'], + [declensions.DATIVE]: ['целой', 'целым'], + [declensions.ACCUSATIVE]: ['целую', 'целые'], + [declensions.INSTRUMENTAL]: ['целой', 'целыми'], + [declensions.PREPOSITIONAL]: ['целой', 'целых'], + }, fractionalPartNameCases: ['', '', ''], + fractionalPartNameDeclensions: { + [declensions.NOMINATIVE]: ['', ''], + [declensions.GENITIVE]: ['', ''], + [declensions.DATIVE]: ['', ''], + [declensions.ACCUSATIVE]: ['', ''], + [declensions.INSTRUMENTAL]: ['', ''], + [declensions.PREPOSITIONAL]: ['', ''], + }, currencyNounGender: { integer: 1, fractionalPart: 1, @@ -18,10 +34,10 @@ export const stringCurrencies: CurrencyStringValues = { ...defaultParams, currencyNameCases: ['рубль', 'рубля', 'рублей'], currencyNameDeclensions: { - [declensions.NOMINATIVE]: ['рубль', 'рубля'], + [declensions.NOMINATIVE]: ['рубль', 'рубли'], [declensions.GENITIVE]: ['рубля', 'рублей'], [declensions.DATIVE]: ['рублю', 'рублям'], - [declensions.ACCUSATIVE]: ['рубль', 'рубля'], + [declensions.ACCUSATIVE]: ['рубль', 'рубли'], [declensions.INSTRUMENTAL]: ['рублём', 'рублями'], [declensions.PREPOSITIONAL]: ['рубле', 'рублях'], }, diff --git a/src/units/unitNames.ts b/src/units/unitNames.ts index 9acaeea..eed68ad 100644 --- a/src/units/unitNames.ts +++ b/src/units/unitNames.ts @@ -1,4 +1,4 @@ -const unitNames = [ +export const unitNames = [ 'миллион', 'миллиард', 'триллион', diff --git a/test/methods/convert/convert.test.js b/test/methods/convert/convert.test.js index 8d3981d..da62023 100644 --- a/test/methods/convert/convert.test.js +++ b/test/methods/convert/convert.test.js @@ -298,6 +298,12 @@ describe('Проверка чисел', () => { }, })) .toBe('Две двести вторых рубля'); + expect(numberToWordsRu.convert('1/212', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Одна двести двенадцатая рубля'); expect(numberToWordsRu.convert('1/222', { convertNumbertToWords: { fractional: true, @@ -334,6 +340,12 @@ describe('Проверка чисел', () => { }, })) .toBe('Две тысячных рубля'); + expect(numberToWordsRu.convert('2/1010', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две одна тысяча десятых рубля'); expect(numberToWordsRu.convert('2/2000', { convertNumbertToWords: { fractional: true, @@ -346,6 +358,12 @@ describe('Проверка чисел', () => { }, })) .toBe('Две две тысячи вторых рубля'); + expect(numberToWordsRu.convert('2/2012', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две две тысячи двенадцатых рубля'); expect(numberToWordsRu.convert('2/2020', { convertNumbertToWords: { fractional: true, @@ -376,6 +394,12 @@ describe('Проверка чисел', () => { }, })) .toBe('Две двадцатитысячных рубля'); + expect(numberToWordsRu.convert('2/21000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две двадцатиоднотысячных рубля'); expect(numberToWordsRu.convert('2/25000', { convertNumbertToWords: { fractional: true, @@ -394,6 +418,12 @@ describe('Проверка чисел', () => { }, })) .toBe('Две двухмиллионных рубля'); + expect(numberToWordsRu.convert('2/2001000', { + convertNumbertToWords: { + fractional: true, + }, + })) + .toBe('Две два миллиона однотысячных рубля'); expect(numberToWordsRu.convert('2/235000', { convertNumbertToWords: { fractional: true, diff --git a/test/methods/convert/options/declension.test.js b/test/methods/convert/options/declension.test.js index 62b5169..0edd775 100644 --- a/test/methods/convert/options/declension.test.js +++ b/test/methods/convert/options/declension.test.js @@ -2,576 +2,1131 @@ const root = '../../../../'; const numberToWordsRu = require(`${root}dist/bundle`); describe('Проверка падежей', () => { - test('Родительный', () => { - expect(numberToWordsRu.convert('0', {declension: 'genitive'})) - .toBe('Ноля рублей 00 копеек'); - expect(numberToWordsRu.convert('1', {declension: 'genitive'})) - .toBe('Одного рубля 00 копеек'); - expect(numberToWordsRu.convert('2', {declension: 'genitive'})) - .toBe('Двух рублей 00 копеек'); - expect(numberToWordsRu.convert('3', {declension: 'genitive'})) - .toBe('Трёх рублей 00 копеек'); - expect(numberToWordsRu.convert('4', {declension: 'genitive'})) - .toBe('Четырёх рублей 00 копеек'); - expect(numberToWordsRu.convert('5', {declension: 'genitive'})) - .toBe('Пяти рублей 00 копеек'); - expect(numberToWordsRu.convert('10', {declension: 'genitive'})) - .toBe('Десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('11', {declension: 'genitive'})) - .toBe('Одиннадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('12', {declension: 'genitive'})) - .toBe('Двенадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('13', {declension: 'genitive'})) - .toBe('Тринадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('14', {declension: 'genitive'})) - .toBe('Четырнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('15', {declension: 'genitive'})) - .toBe('Пятнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('16', {declension: 'genitive'})) - .toBe('Шестнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('17', {declension: 'genitive'})) - .toBe('Семнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('18', {declension: 'genitive'})) - .toBe('Восемнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('19', {declension: 'genitive'})) - .toBe('Девятнадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('20', {declension: 'genitive'})) - .toBe('Двадцати рублей 00 копеек'); - expect(numberToWordsRu.convert('21', {declension: 'genitive'})) - .toBe('Двадцати одного рубля 00 копеек'); - expect(numberToWordsRu.convert('30', {declension: 'genitive'})) - .toBe('Тридцати рублей 00 копеек'); - expect(numberToWordsRu.convert('32', {declension: 'genitive'})) - .toBe('Тридцати двух рублей 00 копеек'); - expect(numberToWordsRu.convert('40', {declension: 'genitive'})) - .toBe('Сорока рублей 00 копеек'); - expect(numberToWordsRu.convert('43', {declension: 'genitive'})) - .toBe('Сорока трёх рублей 00 копеек'); - expect(numberToWordsRu.convert('50', {declension: 'genitive'})) - .toBe('Пятидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('54', {declension: 'genitive'})) - .toBe('Пятидесяти четырёх рублей 00 копеек'); - expect(numberToWordsRu.convert('60', {declension: 'genitive'})) - .toBe('Шестидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('70', {declension: 'genitive'})) - .toBe('Семидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('80', {declension: 'genitive'})) - .toBe('Восьмидесяти рублей 00 копеек'); - expect(numberToWordsRu.convert('90', {declension: 'genitive'})) - .toBe('Девяноста рублей 00 копеек'); - expect(numberToWordsRu.convert('99', {declension: 'genitive'})) - .toBe('Девяноста девяти рублей 00 копеек'); - expect(numberToWordsRu.convert('100', {declension: 'genitive'})) - .toBe('Ста рублей 00 копеек'); - expect(numberToWordsRu.convert('101', {declension: 'genitive'})) - .toBe('Ста одного рубля 00 копеек'); - expect(numberToWordsRu.convert('110', {declension: 'genitive'})) - .toBe('Ста десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('200', {declension: 'genitive'})) - .toBe('Двухсот рублей 00 копеек'); - expect(numberToWordsRu.convert('201', {declension: 'genitive'})) - .toBe('Двухсот одного рубля 00 копеек'); - expect(numberToWordsRu.convert('210', {declension: 'genitive'})) - .toBe('Двухсот десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('500', {declension: 'genitive'})) - .toBe('Пятисот рублей 00 копеек'); - expect(numberToWordsRu.convert('501', {declension: 'genitive'})) - .toBe('Пятисот одного рубля 00 копеек'); - expect(numberToWordsRu.convert('510', {declension: 'genitive'})) - .toBe('Пятисот десяти рублей 00 копеек'); - expect(numberToWordsRu.convert('1000', {declension: 'genitive'})) - .toBe('Одной тысячи рублей 00 копеек'); - expect(numberToWordsRu.convert('1001', {declension: 'genitive'})) - .toBe('Одной тысячи одного рубля 00 копеек'); - expect(numberToWordsRu.convert('1002', {declension: 'genitive'})) - .toBe('Одной тысячи двух рублей 00 копеек'); - expect(numberToWordsRu.convert('1005', {declension: 'genitive'})) - .toBe('Одной тысячи пяти рублей 00 копеек'); - expect(numberToWordsRu.convert('1100', {declension: 'genitive'})) - .toBe('Одной тысячи ста рублей 00 копеек'); - expect(numberToWordsRu.convert('1000000', {declension: 'genitive'})) - .toBe('Одного миллиона рублей 00 копеек'); - expect(numberToWordsRu.convert('987654321', {declension: 'genitive'})) - .toBe('Девятисот восьмидесяти семи миллионов шестисот пятидесяти четырёх тысяч трёхсот двадцати одного рубля 00 копеек'); - expect(numberToWordsRu.convert('1001121.01', {declension: 'genitive', convertNumbertToWords: {fractional: true}})) - .toBe('Одного миллиона одной тысячи ста двадцати одного рубля одной копейки'); - expect(numberToWordsRu.convert('2002122.02', {declension: 'genitive', convertNumbertToWords: {fractional: true}})) - .toBe('Двух миллионов двух тысяч ста двадцати двух рублей двух копеек'); - expect(numberToWordsRu.convert('5005125.05', {declension: 'genitive', convertNumbertToWords: {fractional: true}})) - .toBe('Пяти миллионов пяти тысяч ста двадцати пяти рублей пяти копеек'); + describe('Родительный', () => { + test('Обычные числа', () => { + const options = { + declension: 'genitive', + }; + expect(numberToWordsRu.convert('0', options)) + .toBe('Ноля рублей 00 копеек'); + expect(numberToWordsRu.convert('1', options)) + .toBe('Одного рубля 00 копеек'); + expect(numberToWordsRu.convert('2', options)) + .toBe('Двух рублей 00 копеек'); + expect(numberToWordsRu.convert('3', options)) + .toBe('Трёх рублей 00 копеек'); + expect(numberToWordsRu.convert('4', options)) + .toBe('Четырёх рублей 00 копеек'); + expect(numberToWordsRu.convert('5', options)) + .toBe('Пяти рублей 00 копеек'); + expect(numberToWordsRu.convert('10', options)) + .toBe('Десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('11', options)) + .toBe('Одиннадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('12', options)) + .toBe('Двенадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('15', options)) + .toBe('Пятнадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('20', options)) + .toBe('Двадцати рублей 00 копеек'); + expect(numberToWordsRu.convert('21', options)) + .toBe('Двадцати одного рубля 00 копеек'); + expect(numberToWordsRu.convert('30', options)) + .toBe('Тридцати рублей 00 копеек'); + expect(numberToWordsRu.convert('32', options)) + .toBe('Тридцати двух рублей 00 копеек'); + expect(numberToWordsRu.convert('40', options)) + .toBe('Сорока рублей 00 копеек'); + expect(numberToWordsRu.convert('43', options)) + .toBe('Сорока трёх рублей 00 копеек'); + expect(numberToWordsRu.convert('50', options)) + .toBe('Пятидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('54', options)) + .toBe('Пятидесяти четырёх рублей 00 копеек'); + expect(numberToWordsRu.convert('60', options)) + .toBe('Шестидесяти рублей 00 копеек'); + expect(numberToWordsRu.convert('65', options)) + .toBe('Шестидесяти пяти рублей 00 копеек'); + expect(numberToWordsRu.convert('90', options)) + .toBe('Девяноста рублей 00 копеек'); + expect(numberToWordsRu.convert('99', options)) + .toBe('Девяноста девяти рублей 00 копеек'); + expect(numberToWordsRu.convert('100', options)) + .toBe('Ста рублей 00 копеек'); + expect(numberToWordsRu.convert('101', options)) + .toBe('Ста одного рубля 00 копеек'); + expect(numberToWordsRu.convert('110', options)) + .toBe('Ста десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('200', options)) + .toBe('Двухсот рублей 00 копеек'); + expect(numberToWordsRu.convert('201', options)) + .toBe('Двухсот одного рубля 00 копеек'); + expect(numberToWordsRu.convert('210', options)) + .toBe('Двухсот десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('500', options)) + .toBe('Пятисот рублей 00 копеек'); + expect(numberToWordsRu.convert('501', options)) + .toBe('Пятисот одного рубля 00 копеек'); + expect(numberToWordsRu.convert('510', options)) + .toBe('Пятисот десяти рублей 00 копеек'); + expect(numberToWordsRu.convert('1000', options)) + .toBe('Одной тысячи рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', options)) + .toBe('Одной тысячи одного рубля 00 копеек'); + expect(numberToWordsRu.convert('1002', options)) + .toBe('Одной тысячи двух рублей 00 копеек'); + expect(numberToWordsRu.convert('1005', options)) + .toBe('Одной тысячи пяти рублей 00 копеек'); + expect(numberToWordsRu.convert('1100', options)) + .toBe('Одной тысячи ста рублей 00 копеек'); + expect(numberToWordsRu.convert('1000000', options)) + .toBe('Одного миллиона рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', options)) + .toBe('Девятисот восьмидесяти семи миллионов шестисот пятидесяти четырёх тысяч трёхсот двадцати одного рубля 00 копеек'); + expect(numberToWordsRu.convert('1001121.01',{...options, convertNumbertToWords: {fractional: true}})) + .toBe('Одного миллиона одной тысячи ста двадцати одного рубля одной копейки'); + expect(numberToWordsRu.convert('2002122.02', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Двух миллионов двух тысяч ста двадцати двух рублей двух копеек'); + expect(numberToWordsRu.convert('5005125.05', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Пяти миллионов пяти тысяч ста двадцати пяти рублей пяти копеек'); + }); + test('С валютой "number"', () => { + const options = { + currency: 'number', + declension: 'genitive', + convertNumbertToWords: {fractional: true}, + }; + expect(numberToWordsRu.convert('1.0', options)) + .toBe('Одной целой ноля десятых'); + expect(numberToWordsRu.convert('1.1', options)) + .toBe('Одной целой одной десятой'); + expect(numberToWordsRu.convert('2.1', options)) + .toBe('Двух целых одной десятой'); + expect(numberToWordsRu.convert('5.1', options)) + .toBe('Пяти целых одной десятой'); + expect(numberToWordsRu.convert('11.1', options)) + .toBe('Одиннадцати целых одной десятой'); + expect(numberToWordsRu.convert('101.1', options)) + .toBe('Ста одной целой одной десятой'); + expect(numberToWordsRu.convert('102.1', options)) + .toBe('Ста двух целых одной десятой'); + expect(numberToWordsRu.convert('1.2', options)) + .toBe('Одной целой двух десятых'); + expect(numberToWordsRu.convert('1.5', options)) + .toBe('Одной целой пяти десятых'); + expect(numberToWordsRu.convert('1.11', options)) + .toBe('Одной целой одиннадцати сотых'); + expect(numberToWordsRu.convert('1.21', options)) + .toBe('Одной целой двадцати одной сотой'); + expect(numberToWordsRu.convert('1.22', options)) + .toBe('Одной целой двадцати двух сотых'); + expect(numberToWordsRu.convert('1.101', options)) + .toBe('Одной целой ста одной тысячной'); + expect(numberToWordsRu.convert('1.102', options)) + .toBe('Одной целой ста двух тысячных'); + expect(numberToWordsRu.convert('1.00001', options)) + .toBe('Одной целой одной стотысячной'); + expect(numberToWordsRu.convert('1.00002', options)) + .toBe('Одной целой двух стотысячных'); + }); + test('С разделителем "/"', () => { + const options = { + declension: 'genitive', + convertNumbertToWords: { + integer: true, + fractional: true, + }, + }; + expect(numberToWordsRu.convert('1/0', options)) + .toBe('Одной нулевой рубля'); + expect(numberToWordsRu.convert('1/1', options)) + .toBe('Одной первой рубля'); + expect(numberToWordsRu.convert('1/2', options)) + .toBe('Одной второй рубля'); + expect(numberToWordsRu.convert('1/5', options)) + .toBe('Одной пятой рубля'); + expect(numberToWordsRu.convert('2/0', options)) + .toBe('Двух нулевых рубля'); + expect(numberToWordsRu.convert('2/1', options)) + .toBe('Двух первых рубля'); + expect(numberToWordsRu.convert('2/2', options)) + .toBe('Двух вторых рубля'); + expect(numberToWordsRu.convert('2/5', options)) + .toBe('Двух пятых рубля'); + expect(numberToWordsRu.convert('1/10', options)) + .toBe('Одной десятой рубля'); + expect(numberToWordsRu.convert('1/11', options)) + .toBe('Одной одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/12', options)) + .toBe('Одной двенадцатой рубля'); + expect(numberToWordsRu.convert('1/15', options)) + .toBe('Одной пятнадцатой рубля'); + expect(numberToWordsRu.convert('1/20', options)) + .toBe('Одной двадцатой рубля'); + expect(numberToWordsRu.convert('1/21', options)) + .toBe('Одной двадцать первой рубля'); + expect(numberToWordsRu.convert('1/100', options)) + .toBe('Одной сотой рубля'); + expect(numberToWordsRu.convert('1/101', options)) + .toBe('Одной сто первой рубля'); + expect(numberToWordsRu.convert('1/102', options)) + .toBe('Одной сто второй рубля'); + expect(numberToWordsRu.convert('1/110', options)) + .toBe('Одной сто десятой рубля'); + expect(numberToWordsRu.convert('1/112', options)) + .toBe('Одной сто двенадцатой рубля'); + expect(numberToWordsRu.convert('1/1000', options)) + .toBe('Одной тысячной рубля'); + expect(numberToWordsRu.convert('1/1001', options)) + .toBe('Одной одна тысяча первой рубля'); + expect(numberToWordsRu.convert('1/1002', options)) + .toBe('Одной одна тысяча второй рубля'); + expect(numberToWordsRu.convert('1/1010', options)) + .toBe('Одной одна тысяча десятой рубля'); + expect(numberToWordsRu.convert('1/1011', options)) + .toBe('Одной одна тысяча одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/1020', options)) + .toBe('Одной одна тысяча двадцатой рубля'); + expect(numberToWordsRu.convert('1/1021', options)) + .toBe('Одной одна тысяча двадцать первой рубля'); + expect(numberToWordsRu.convert('1/10000', options)) + .toBe('Одной десятитысячной рубля'); + expect(numberToWordsRu.convert('1/11000', options)) + .toBe('Одной одиннадцатитысячной рубля'); + expect(numberToWordsRu.convert('1/521000', options)) + .toBe('Одной пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1521000', options)) + .toBe('Одной один миллион пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1001002', options)) + .toBe('Одной один миллион одна тысяча второй рубля'); + }); }); - test('Дательный', () => { - expect(numberToWordsRu.convert('0', {declension: 'dative'})) - .toBe('Нолю рублям 00 копейкам'); - expect(numberToWordsRu.convert('1', {declension: 'dative'})) - .toBe('Одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('2', {declension: 'dative'})) - .toBe('Двум рублям 00 копейкам'); - expect(numberToWordsRu.convert('3', {declension: 'dative'})) - .toBe('Трём рублям 00 копейкам'); - expect(numberToWordsRu.convert('4', {declension: 'dative'})) - .toBe('Четырём рублям 00 копейкам'); - expect(numberToWordsRu.convert('5', {declension: 'dative'})) - .toBe('Пяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('10', {declension: 'dative'})) - .toBe('Десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('11', {declension: 'dative'})) - .toBe('Одиннадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('12', {declension: 'dative'})) - .toBe('Двенадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('13', {declension: 'dative'})) - .toBe('Тринадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('14', {declension: 'dative'})) - .toBe('Четырнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('15', {declension: 'dative'})) - .toBe('Пятнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('16', {declension: 'dative'})) - .toBe('Шестнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('17', {declension: 'dative'})) - .toBe('Семнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('18', {declension: 'dative'})) - .toBe('Восемнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('19', {declension: 'dative'})) - .toBe('Девятнадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('20', {declension: 'dative'})) - .toBe('Двадцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('21', {declension: 'dative'})) - .toBe('Двадцати одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('30', {declension: 'dative'})) - .toBe('Тридцати рублям 00 копейкам'); - expect(numberToWordsRu.convert('32', {declension: 'dative'})) - .toBe('Тридцати двум рублям 00 копейкам'); - expect(numberToWordsRu.convert('40', {declension: 'dative'})) - .toBe('Сорока рублям 00 копейкам'); - expect(numberToWordsRu.convert('43', {declension: 'dative'})) - .toBe('Сорока трём рублям 00 копейкам'); - expect(numberToWordsRu.convert('50', {declension: 'dative'})) - .toBe('Пятидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('54', {declension: 'dative'})) - .toBe('Пятидесяти четырём рублям 00 копейкам'); - expect(numberToWordsRu.convert('60', {declension: 'dative'})) - .toBe('Шестидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('70', {declension: 'dative'})) - .toBe('Семидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('80', {declension: 'dative'})) - .toBe('Восьмидесяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('90', {declension: 'dative'})) - .toBe('Девяноста рублям 00 копейкам'); - expect(numberToWordsRu.convert('99', {declension: 'dative'})) - .toBe('Девяноста девяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('100', {declension: 'dative'})) - .toBe('Ста рублям 00 копейкам'); - expect(numberToWordsRu.convert('101', {declension: 'dative'})) - .toBe('Ста одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('110', {declension: 'dative'})) - .toBe('Ста десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('200', {declension: 'dative'})) - .toBe('Двумстам рублям 00 копейкам'); - expect(numberToWordsRu.convert('201', {declension: 'dative'})) - .toBe('Двумстам одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('210', {declension: 'dative'})) - .toBe('Двумстам десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('500', {declension: 'dative'})) - .toBe('Пятистам рублям 00 копейкам'); - expect(numberToWordsRu.convert('501', {declension: 'dative'})) - .toBe('Пятистам одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('510', {declension: 'dative'})) - .toBe('Пятистам десяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('1000', {declension: 'dative'})) - .toBe('Одной тысяче рублей 00 копейкам'); - expect(numberToWordsRu.convert('1001', {declension: 'dative'})) - .toBe('Одной тысяче одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('1002', {declension: 'dative'})) - .toBe('Одной тысяче двум рублям 00 копейкам'); - expect(numberToWordsRu.convert('1005', {declension: 'dative'})) - .toBe('Одной тысяче пяти рублям 00 копейкам'); - expect(numberToWordsRu.convert('1100', {declension: 'dative'})) - .toBe('Одной тысяче ста рублям 00 копейкам'); - expect(numberToWordsRu.convert('1000000', {declension: 'dative'})) - .toBe('Одному миллиону рублей 00 копейкам'); - expect(numberToWordsRu.convert('987654321', {declension: 'dative'})) - .toBe('Девятистам восьмидесяти семи миллионам шестистам пятидесяти четырём тысячам трёмстам двадцати одному рублю 00 копейкам'); - expect(numberToWordsRu.convert('1001121.01', {declension: 'dative', convertNumbertToWords: {fractional: true}})) - .toBe('Одному миллиону одной тысяче ста двадцати одному рублю одной копейке'); - expect(numberToWordsRu.convert('2002122.02', {declension: 'dative', convertNumbertToWords: {fractional: true}})) - .toBe('Двум миллионам двум тысячам ста двадцати двум рублям двум копейкам'); - expect(numberToWordsRu.convert('5005125.05', {declension: 'dative', convertNumbertToWords: {fractional: true}})) - .toBe('Пяти миллионам пяти тысячам ста двадцати пяти рублям пяти копейкам'); + describe('Дательный', () => { + test('Обычные числа', () => { + const options = { + declension: 'dative', + }; + expect(numberToWordsRu.convert('0', options)) + .toBe('Нолю рублей 00 копеек'); + expect(numberToWordsRu.convert('1', options)) + .toBe('Одному рублю 00 копеек'); + expect(numberToWordsRu.convert('2', options)) + .toBe('Двум рублям 00 копеек'); + expect(numberToWordsRu.convert('3', options)) + .toBe('Трём рублям 00 копеек'); + expect(numberToWordsRu.convert('4', options)) + .toBe('Четырём рублям 00 копеек'); + expect(numberToWordsRu.convert('5', options)) + .toBe('Пяти рублям 00 копеек'); + expect(numberToWordsRu.convert('10', options)) + .toBe('Десяти рублям 00 копеек'); + expect(numberToWordsRu.convert('11', options)) + .toBe('Одиннадцати рублям 00 копеек'); + expect(numberToWordsRu.convert('12', options)) + .toBe('Двенадцати рублям 00 копеек'); + expect(numberToWordsRu.convert('15', options)) + .toBe('Пятнадцати рублям 00 копеек'); + expect(numberToWordsRu.convert('20', options)) + .toBe('Двадцати рублям 00 копеек'); + expect(numberToWordsRu.convert('21', options)) + .toBe('Двадцати одному рублю 00 копеек'); + expect(numberToWordsRu.convert('30', options)) + .toBe('Тридцати рублям 00 копеек'); + expect(numberToWordsRu.convert('32', options)) + .toBe('Тридцати двум рублям 00 копеек'); + expect(numberToWordsRu.convert('40', options)) + .toBe('Сорока рублям 00 копеек'); + expect(numberToWordsRu.convert('43', options)) + .toBe('Сорока трём рублям 00 копеек'); + expect(numberToWordsRu.convert('50', options)) + .toBe('Пятидесяти рублям 00 копеек'); + expect(numberToWordsRu.convert('54', options)) + .toBe('Пятидесяти четырём рублям 00 копеек'); + expect(numberToWordsRu.convert('60', options)) + .toBe('Шестидесяти рублям 00 копеек'); + expect(numberToWordsRu.convert('65', options)) + .toBe('Шестидесяти пяти рублям 00 копеек'); + expect(numberToWordsRu.convert('90', options)) + .toBe('Девяноста рублям 00 копеек'); + expect(numberToWordsRu.convert('99', options)) + .toBe('Девяноста девяти рублям 00 копеек'); + expect(numberToWordsRu.convert('100', options)) + .toBe('Ста рублям 00 копеек'); + expect(numberToWordsRu.convert('101', options)) + .toBe('Ста одному рублю 00 копеек'); + expect(numberToWordsRu.convert('110', options)) + .toBe('Ста десяти рублям 00 копеек'); + expect(numberToWordsRu.convert('200', options)) + .toBe('Двумстам рублям 00 копеек'); + expect(numberToWordsRu.convert('201', options)) + .toBe('Двумстам одному рублю 00 копеек'); + expect(numberToWordsRu.convert('210', options)) + .toBe('Двумстам десяти рублям 00 копеек'); + expect(numberToWordsRu.convert('500', options)) + .toBe('Пятистам рублям 00 копеек'); + expect(numberToWordsRu.convert('501', options)) + .toBe('Пятистам одному рублю 00 копеек'); + expect(numberToWordsRu.convert('510', options)) + .toBe('Пятистам десяти рублям 00 копеек'); + expect(numberToWordsRu.convert('1000', options)) + .toBe('Одной тысяче рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', options)) + .toBe('Одной тысяче одному рублю 00 копеек'); + expect(numberToWordsRu.convert('1002', options)) + .toBe('Одной тысяче двум рублям 00 копеек'); + expect(numberToWordsRu.convert('1005', options)) + .toBe('Одной тысяче пяти рублям 00 копеек'); + expect(numberToWordsRu.convert('1100', options)) + .toBe('Одной тысяче ста рублям 00 копеек'); + expect(numberToWordsRu.convert('1000000', options)) + .toBe('Одному миллиону рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', options)) + .toBe('Девятистам восьмидесяти семи миллионам шестистам пятидесяти четырём тысячам трёмстам двадцати одному рублю 00 копеек'); + expect(numberToWordsRu.convert('1001121.01', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Одному миллиону одной тысяче ста двадцати одному рублю одной копейке'); + expect(numberToWordsRu.convert('2002122.02', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Двум миллионам двум тысячам ста двадцати двум рублям двум копейкам'); + expect(numberToWordsRu.convert('5005125.05', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Пяти миллионам пяти тысячам ста двадцати пяти рублям пяти копейкам'); + }); + test('С валютой "number"', () => { + const options = { + currency: 'number', + declension: 'dative', + convertNumbertToWords: {fractional: true}, + }; + expect(numberToWordsRu.convert('1.0', options)) + .toBe('Одной целой нолю десятых'); + expect(numberToWordsRu.convert('1.1', options)) + .toBe('Одной целой одной десятой'); + expect(numberToWordsRu.convert('2.1', options)) + .toBe('Двум целым одной десятой'); + expect(numberToWordsRu.convert('5.1', options)) + .toBe('Пяти целым одной десятой'); + expect(numberToWordsRu.convert('11.1', options)) + .toBe('Одиннадцати целым одной десятой'); + expect(numberToWordsRu.convert('101.1', options)) + .toBe('Ста одной целой одной десятой'); + expect(numberToWordsRu.convert('102.1', options)) + .toBe('Ста двум целым одной десятой'); + expect(numberToWordsRu.convert('1.2', options)) + .toBe('Одной целой двум десятым'); + expect(numberToWordsRu.convert('1.5', options)) + .toBe('Одной целой пяти десятым'); + expect(numberToWordsRu.convert('1.11', options)) + .toBe('Одной целой одиннадцати сотым'); + expect(numberToWordsRu.convert('1.21', options)) + .toBe('Одной целой двадцати одной сотой'); + expect(numberToWordsRu.convert('1.22', options)) + .toBe('Одной целой двадцати двум сотым'); + expect(numberToWordsRu.convert('1.101', options)) + .toBe('Одной целой ста одной тысячной'); + expect(numberToWordsRu.convert('1.102', options)) + .toBe('Одной целой ста двум тысячным'); + expect(numberToWordsRu.convert('1.00001', options)) + .toBe('Одной целой одной стотысячной'); + expect(numberToWordsRu.convert('1.00002', options)) + .toBe('Одной целой двум стотысячным'); + }); + test('С разделителем "/"', () => { + const options = { + declension: 'dative', + convertNumbertToWords: { + integer: true, + fractional: true, + }, + }; + expect(numberToWordsRu.convert('1/0', options)) + .toBe('Одной нулевой рубля'); + expect(numberToWordsRu.convert('1/1', options)) + .toBe('Одной первой рубля'); + expect(numberToWordsRu.convert('1/2', options)) + .toBe('Одной второй рубля'); + expect(numberToWordsRu.convert('1/5', options)) + .toBe('Одной пятой рубля'); + expect(numberToWordsRu.convert('2/0', options)) + .toBe('Двум нулевым рубля'); + expect(numberToWordsRu.convert('2/1', options)) + .toBe('Двум первым рубля'); + expect(numberToWordsRu.convert('2/2', options)) + .toBe('Двум вторым рубля'); + expect(numberToWordsRu.convert('2/5', options)) + .toBe('Двум пятым рубля'); + expect(numberToWordsRu.convert('1/10', options)) + .toBe('Одной десятой рубля'); + expect(numberToWordsRu.convert('1/11', options)) + .toBe('Одной одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/12', options)) + .toBe('Одной двенадцатой рубля'); + expect(numberToWordsRu.convert('1/15', options)) + .toBe('Одной пятнадцатой рубля'); + expect(numberToWordsRu.convert('1/20', options)) + .toBe('Одной двадцатой рубля'); + expect(numberToWordsRu.convert('1/21', options)) + .toBe('Одной двадцать первой рубля'); + expect(numberToWordsRu.convert('1/100', options)) + .toBe('Одной сотой рубля'); + expect(numberToWordsRu.convert('1/101', options)) + .toBe('Одной сто первой рубля'); + expect(numberToWordsRu.convert('1/102', options)) + .toBe('Одной сто второй рубля'); + expect(numberToWordsRu.convert('1/110', options)) + .toBe('Одной сто десятой рубля'); + expect(numberToWordsRu.convert('1/112', options)) + .toBe('Одной сто двенадцатой рубля'); + expect(numberToWordsRu.convert('1/1000', options)) + .toBe('Одной тысячной рубля'); + expect(numberToWordsRu.convert('1/1001', options)) + .toBe('Одной одна тысяча первой рубля'); + expect(numberToWordsRu.convert('1/1002', options)) + .toBe('Одной одна тысяча второй рубля'); + expect(numberToWordsRu.convert('1/1010', options)) + .toBe('Одной одна тысяча десятой рубля'); + expect(numberToWordsRu.convert('1/1011', options)) + .toBe('Одной одна тысяча одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/1020', options)) + .toBe('Одной одна тысяча двадцатой рубля'); + expect(numberToWordsRu.convert('1/1021', options)) + .toBe('Одной одна тысяча двадцать первой рубля'); + expect(numberToWordsRu.convert('1/10000', options)) + .toBe('Одной десятитысячной рубля'); + expect(numberToWordsRu.convert('1/11000', options)) + .toBe('Одной одиннадцатитысячной рубля'); + expect(numberToWordsRu.convert('1/521000', options)) + .toBe('Одной пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1521000', options)) + .toBe('Одной один миллион пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1001002', options)) + .toBe('Одной один миллион одна тысяча второй рубля'); + }); }); - test('Винительный', () => { - expect(numberToWordsRu.convert('0', {declension: 'accusative'})) - .toBe('Ноль рублей 00 копеек'); - expect(numberToWordsRu.convert('1', {declension: 'accusative'})) - .toBe('Один рубль 00 копеек'); - expect(numberToWordsRu.convert('2', {declension: 'accusative'})) - .toBe('Два рубля 00 копеек'); - expect(numberToWordsRu.convert('3', {declension: 'accusative'})) - .toBe('Три рубля 00 копеек'); - expect(numberToWordsRu.convert('4', {declension: 'accusative'})) - .toBe('Четыре рубля 00 копеек'); - expect(numberToWordsRu.convert('5', {declension: 'accusative'})) - .toBe('Пять рублей 00 копеек'); - expect(numberToWordsRu.convert('10', {declension: 'accusative'})) - .toBe('Десять рублей 00 копеек'); - expect(numberToWordsRu.convert('11', {declension: 'accusative'})) - .toBe('Одиннадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('12', {declension: 'accusative'})) - .toBe('Двенадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('13', {declension: 'accusative'})) - .toBe('Тринадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('14', {declension: 'accusative'})) - .toBe('Четырнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('15', {declension: 'accusative'})) - .toBe('Пятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('16', {declension: 'accusative'})) - .toBe('Шестнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('17', {declension: 'accusative'})) - .toBe('Семнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('18', {declension: 'accusative'})) - .toBe('Восемнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('19', {declension: 'accusative'})) - .toBe('Девятнадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('20', {declension: 'accusative'})) - .toBe('Двадцать рублей 00 копеек'); - expect(numberToWordsRu.convert('21', {declension: 'accusative'})) - .toBe('Двадцать один рубль 00 копеек'); - expect(numberToWordsRu.convert('30', {declension: 'accusative'})) - .toBe('Тридцать рублей 00 копеек'); - expect(numberToWordsRu.convert('32', {declension: 'accusative'})) - .toBe('Тридцать два рубля 00 копеек'); - expect(numberToWordsRu.convert('40', {declension: 'accusative'})) - .toBe('Сорок рублей 00 копеек'); - expect(numberToWordsRu.convert('43', {declension: 'accusative'})) - .toBe('Сорок три рубля 00 копеек'); - expect(numberToWordsRu.convert('50', {declension: 'accusative'})) - .toBe('Пятьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('54', {declension: 'accusative'})) - .toBe('Пятьдесят четыре рубля 00 копеек'); - expect(numberToWordsRu.convert('60', {declension: 'accusative'})) - .toBe('Шестьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('70', {declension: 'accusative'})) - .toBe('Семьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('80', {declension: 'accusative'})) - .toBe('Восемьдесят рублей 00 копеек'); - expect(numberToWordsRu.convert('90', {declension: 'accusative'})) - .toBe('Девяносто рублей 00 копеек'); - expect(numberToWordsRu.convert('99', {declension: 'accusative'})) - .toBe('Девяносто девять рублей 00 копеек'); - expect(numberToWordsRu.convert('100', {declension: 'accusative'})) - .toBe('Сто рублей 00 копеек'); - expect(numberToWordsRu.convert('101', {declension: 'accusative'})) - .toBe('Сто один рубль 00 копеек'); - expect(numberToWordsRu.convert('110', {declension: 'accusative'})) - .toBe('Сто десять рублей 00 копеек'); - expect(numberToWordsRu.convert('200', {declension: 'accusative'})) - .toBe('Двести рублей 00 копеек'); - expect(numberToWordsRu.convert('201', {declension: 'accusative'})) - .toBe('Двести один рубль 00 копеек'); - expect(numberToWordsRu.convert('210', {declension: 'accusative'})) - .toBe('Двести десять рублей 00 копеек'); - expect(numberToWordsRu.convert('500', {declension: 'accusative'})) - .toBe('Пятьсот рублей 00 копеек'); - expect(numberToWordsRu.convert('501', {declension: 'accusative'})) - .toBe('Пятьсот один рубль 00 копеек'); - expect(numberToWordsRu.convert('510', {declension: 'accusative'})) - .toBe('Пятьсот десять рублей 00 копеек'); - expect(numberToWordsRu.convert('1000', {declension: 'accusative'})) - .toBe('Одну тысячу рублей 00 копеек'); - expect(numberToWordsRu.convert('1001', {declension: 'accusative'})) - .toBe('Одну тысячу один рубль 00 копеек'); - expect(numberToWordsRu.convert('1002', {declension: 'accusative'})) - .toBe('Одну тысячу два рубля 00 копеек'); - expect(numberToWordsRu.convert('1005', {declension: 'accusative'})) - .toBe('Одну тысячу пять рублей 00 копеек'); - expect(numberToWordsRu.convert('1100', {declension: 'accusative'})) - .toBe('Одну тысячу сто рублей 00 копеек'); - expect(numberToWordsRu.convert('1000000', {declension: 'accusative'})) - .toBe('Один миллион рублей 00 копеек'); - expect(numberToWordsRu.convert('987654321', {declension: 'accusative'})) - .toBe('Девятьсот восемьдесят семь миллионов шестьсот пятьдесят четыре тысячи триста двадцать один рубль 00 копеек'); - expect(numberToWordsRu.convert('1001121.01', {declension: 'accusative', convertNumbertToWords: {fractional: true}})) - .toBe('Один миллион одну тысячу сто двадцать один рубль одну копейку'); - expect(numberToWordsRu.convert('2002122.02', {declension: 'accusative', convertNumbertToWords: {fractional: true}})) - .toBe('Два миллиона две тысячи сто двадцать два рубля две копейки'); - expect(numberToWordsRu.convert('5005125.05', {declension: 'accusative', convertNumbertToWords: {fractional: true}})) - .toBe('Пять миллионов пять тысяч сто двадцать пять рублей пять копеек'); + describe('Винительный', () => { + test('Обычные числа', () => { + const options = { + declension: 'accusative', + }; + expect(numberToWordsRu.convert('0', options)) + .toBe('Ноль рублей 00 копеек'); + expect(numberToWordsRu.convert('1', options)) + .toBe('Один рубль 00 копеек'); + expect(numberToWordsRu.convert('2', options)) + .toBe('Два рубля 00 копеек'); + expect(numberToWordsRu.convert('3', options)) + .toBe('Три рубля 00 копеек'); + expect(numberToWordsRu.convert('4', options)) + .toBe('Четыре рубля 00 копеек'); + expect(numberToWordsRu.convert('5', options)) + .toBe('Пять рублей 00 копеек'); + expect(numberToWordsRu.convert('10', options)) + .toBe('Десять рублей 00 копеек'); + expect(numberToWordsRu.convert('11', options)) + .toBe('Одиннадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('12', options)) + .toBe('Двенадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('15', options)) + .toBe('Пятнадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('20', options)) + .toBe('Двадцать рублей 00 копеек'); + expect(numberToWordsRu.convert('21', options)) + .toBe('Двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert('30', options)) + .toBe('Тридцать рублей 00 копеек'); + expect(numberToWordsRu.convert('32', options)) + .toBe('Тридцать два рубля 00 копеек'); + expect(numberToWordsRu.convert('40', options)) + .toBe('Сорок рублей 00 копеек'); + expect(numberToWordsRu.convert('43', options)) + .toBe('Сорок три рубля 00 копеек'); + expect(numberToWordsRu.convert('50', options)) + .toBe('Пятьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('54', options)) + .toBe('Пятьдесят четыре рубля 00 копеек'); + expect(numberToWordsRu.convert('60', options)) + .toBe('Шестьдесят рублей 00 копеек'); + expect(numberToWordsRu.convert('65', options)) + .toBe('Шестьдесят пять рублей 00 копеек'); + expect(numberToWordsRu.convert('90', options)) + .toBe('Девяносто рублей 00 копеек'); + expect(numberToWordsRu.convert('99', options)) + .toBe('Девяносто девять рублей 00 копеек'); + expect(numberToWordsRu.convert('100', options)) + .toBe('Сто рублей 00 копеек'); + expect(numberToWordsRu.convert('101', options)) + .toBe('Сто один рубль 00 копеек'); + expect(numberToWordsRu.convert('110', options)) + .toBe('Сто десять рублей 00 копеек'); + expect(numberToWordsRu.convert('200', options)) + .toBe('Двести рублей 00 копеек'); + expect(numberToWordsRu.convert('201', options)) + .toBe('Двести один рубль 00 копеек'); + expect(numberToWordsRu.convert('210', options)) + .toBe('Двести десять рублей 00 копеек'); + expect(numberToWordsRu.convert('500', options)) + .toBe('Пятьсот рублей 00 копеек'); + expect(numberToWordsRu.convert('501', options)) + .toBe('Пятьсот один рубль 00 копеек'); + expect(numberToWordsRu.convert('510', options)) + .toBe('Пятьсот десять рублей 00 копеек'); + expect(numberToWordsRu.convert('1000', options)) + .toBe('Одну тысячу рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', options)) + .toBe('Одну тысячу один рубль 00 копеек'); + expect(numberToWordsRu.convert('1002', options)) + .toBe('Одну тысячу два рубля 00 копеек'); + expect(numberToWordsRu.convert('1005', options)) + .toBe('Одну тысячу пять рублей 00 копеек'); + expect(numberToWordsRu.convert('1100', options)) + .toBe('Одну тысячу сто рублей 00 копеек'); + expect(numberToWordsRu.convert('1000000', options)) + .toBe('Один миллион рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', options)) + .toBe('Девятьсот восемьдесят семь миллионов шестьсот пятьдесят четыре тысячи триста двадцать один рубль 00 копеек'); + expect(numberToWordsRu.convert('1001121.01', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Один миллион одну тысячу сто двадцать один рубль одну копейку'); + expect(numberToWordsRu.convert('2002122.02', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Два миллиона две тысячи сто двадцать два рубля две копейки'); + expect(numberToWordsRu.convert('5005125.05', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Пять миллионов пять тысяч сто двадцать пять рублей пять копеек'); + }); + test('С валютой "number"', () => { + const options = { + currency: 'number', + declension: 'accusative', + convertNumbertToWords: {fractional: true}, + }; + expect(numberToWordsRu.convert('1.0', options)) + .toBe('Одну целую ноль десятых'); + expect(numberToWordsRu.convert('1.1', options)) + .toBe('Одну целую одну десятую'); + expect(numberToWordsRu.convert('2.1', options)) + .toBe('Две целых одну десятую'); + expect(numberToWordsRu.convert('5.1', options)) + .toBe('Пять целых одну десятую'); + expect(numberToWordsRu.convert('11.1', options)) + .toBe('Одиннадцать целых одну десятую'); + expect(numberToWordsRu.convert('101.1', options)) + .toBe('Сто одну целую одну десятую'); + expect(numberToWordsRu.convert('102.1', options)) + .toBe('Сто две целых одну десятую'); + expect(numberToWordsRu.convert('1.2', options)) + .toBe('Одну целую две десятых'); + expect(numberToWordsRu.convert('1.5', options)) + .toBe('Одну целую пять десятых'); + expect(numberToWordsRu.convert('1.11', options)) + .toBe('Одну целую одиннадцать сотых'); + expect(numberToWordsRu.convert('1.21', options)) + .toBe('Одну целую двадцать одну сотую'); + expect(numberToWordsRu.convert('1.22', options)) + .toBe('Одну целую двадцать две сотых'); + expect(numberToWordsRu.convert('1.101', options)) + .toBe('Одну целую сто одну тысячную'); + expect(numberToWordsRu.convert('1.102', options)) + .toBe('Одну целую сто две тысячных'); + expect(numberToWordsRu.convert('1.00001', options)) + .toBe('Одну целую одну стотысячную'); + expect(numberToWordsRu.convert('1.00002', options)) + .toBe('Одну целую две стотысячных'); + }); + test('С разделителем "/"', () => { + const options = { + declension: 'accusative', + convertNumbertToWords: { + integer: true, + fractional: true, + }, + }; + expect(numberToWordsRu.convert('1/0', options)) + .toBe('Одну нулевую рубля'); + expect(numberToWordsRu.convert('1/1', options)) + .toBe('Одну первую рубля'); + expect(numberToWordsRu.convert('1/2', options)) + .toBe('Одну вторую рубля'); + expect(numberToWordsRu.convert('1/5', options)) + .toBe('Одну пятую рубля'); + expect(numberToWordsRu.convert('2/0', options)) + .toBe('Две нулевых рубля'); + expect(numberToWordsRu.convert('2/1', options)) + .toBe('Две первых рубля'); + expect(numberToWordsRu.convert('2/2', options)) + .toBe('Две вторых рубля'); + expect(numberToWordsRu.convert('2/5', options)) + .toBe('Две пятых рубля'); + expect(numberToWordsRu.convert('1/10', options)) + .toBe('Одну десятую рубля'); + expect(numberToWordsRu.convert('1/11', options)) + .toBe('Одну одиннадцатую рубля'); + expect(numberToWordsRu.convert('1/12', options)) + .toBe('Одну двенадцатую рубля'); + expect(numberToWordsRu.convert('1/15', options)) + .toBe('Одну пятнадцатую рубля'); + expect(numberToWordsRu.convert('1/20', options)) + .toBe('Одну двадцатую рубля'); + expect(numberToWordsRu.convert('1/21', options)) + .toBe('Одну двадцать первую рубля'); + expect(numberToWordsRu.convert('1/100', options)) + .toBe('Одну сотую рубля'); + expect(numberToWordsRu.convert('1/101', options)) + .toBe('Одну сто первую рубля'); + expect(numberToWordsRu.convert('1/102', options)) + .toBe('Одну сто вторую рубля'); + expect(numberToWordsRu.convert('1/110', options)) + .toBe('Одну сто десятую рубля'); + expect(numberToWordsRu.convert('1/112', options)) + .toBe('Одну сто двенадцатую рубля'); + expect(numberToWordsRu.convert('1/1000', options)) + .toBe('Одну тысячную рубля'); + expect(numberToWordsRu.convert('1/1001', options)) + .toBe('Одну одна тысяча первую рубля'); + expect(numberToWordsRu.convert('1/1002', options)) + .toBe('Одну одна тысяча вторую рубля'); + expect(numberToWordsRu.convert('1/1010', options)) + .toBe('Одну одна тысяча десятую рубля'); + expect(numberToWordsRu.convert('1/1011', options)) + .toBe('Одну одна тысяча одиннадцатую рубля'); + expect(numberToWordsRu.convert('1/1020', options)) + .toBe('Одну одна тысяча двадцатую рубля'); + expect(numberToWordsRu.convert('1/1021', options)) + .toBe('Одну одна тысяча двадцать первую рубля'); + expect(numberToWordsRu.convert('1/10000', options)) + .toBe('Одну десятитысячную рубля'); + expect(numberToWordsRu.convert('1/11000', options)) + .toBe('Одну одиннадцатитысячную рубля'); + expect(numberToWordsRu.convert('1/521000', options)) + .toBe('Одну пятисотдвадцатиоднотысячную рубля'); + expect(numberToWordsRu.convert('1/1521000', options)) + .toBe('Одну один миллион пятисотдвадцатиоднотысячную рубля'); + expect(numberToWordsRu.convert('1/1001002', options)) + .toBe('Одну один миллион одна тысяча вторую рубля'); + }); }); - test('Творительный', () => { - expect(numberToWordsRu.convert('0', {declension: 'instrumental'})) - .toBe('Нолём рублями 00 копейками'); - expect(numberToWordsRu.convert('1', {declension: 'instrumental'})) - .toBe('Одним рублём 00 копейками'); - expect(numberToWordsRu.convert('2', {declension: 'instrumental'})) - .toBe('Двумя рублями 00 копейками'); - expect(numberToWordsRu.convert('3', {declension: 'instrumental'})) - .toBe('Тремя рублями 00 копейками'); - expect(numberToWordsRu.convert('4', {declension: 'instrumental'})) - .toBe('Четырьмя рублями 00 копейками'); - expect(numberToWordsRu.convert('5', {declension: 'instrumental'})) - .toBe('Пятью рублями 00 копейками'); - expect(numberToWordsRu.convert('10', {declension: 'instrumental'})) - .toBe('Десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('11', {declension: 'instrumental'})) - .toBe('Одиннадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('12', {declension: 'instrumental'})) - .toBe('Двенадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('13', {declension: 'instrumental'})) - .toBe('Тринадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('14', {declension: 'instrumental'})) - .toBe('Четырнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('15', {declension: 'instrumental'})) - .toBe('Пятнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('16', {declension: 'instrumental'})) - .toBe('Шестнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('17', {declension: 'instrumental'})) - .toBe('Семнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('18', {declension: 'instrumental'})) - .toBe('Восемнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('19', {declension: 'instrumental'})) - .toBe('Девятнадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('20', {declension: 'instrumental'})) - .toBe('Двадцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('21', {declension: 'instrumental'})) - .toBe('Двадцатью одним рублём 00 копейками'); - expect(numberToWordsRu.convert('30', {declension: 'instrumental'})) - .toBe('Тридцатью рублями 00 копейками'); - expect(numberToWordsRu.convert('32', {declension: 'instrumental'})) - .toBe('Тридцатью двумя рублями 00 копейками'); - expect(numberToWordsRu.convert('40', {declension: 'instrumental'})) - .toBe('Сорока рублями 00 копейками'); - expect(numberToWordsRu.convert('43', {declension: 'instrumental'})) - .toBe('Сорока тремя рублями 00 копейками'); - expect(numberToWordsRu.convert('50', {declension: 'instrumental'})) - .toBe('Пятьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('54', {declension: 'instrumental'})) - .toBe('Пятьюдесятью четырьмя рублями 00 копейками'); - expect(numberToWordsRu.convert('60', {declension: 'instrumental'})) - .toBe('Шестьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('70', {declension: 'instrumental'})) - .toBe('Семьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('80', {declension: 'instrumental'})) - .toBe('Восемьюдесятью рублями 00 копейками'); - expect(numberToWordsRu.convert('90', {declension: 'instrumental'})) - .toBe('Девяноста рублями 00 копейками'); - expect(numberToWordsRu.convert('99', {declension: 'instrumental'})) - .toBe('Девяноста девятью рублями 00 копейками'); - expect(numberToWordsRu.convert('100', {declension: 'instrumental'})) - .toBe('Ста рублями 00 копейками'); - expect(numberToWordsRu.convert('101', {declension: 'instrumental'})) - .toBe('Ста одним рублём 00 копейками'); - expect(numberToWordsRu.convert('110', {declension: 'instrumental'})) - .toBe('Ста десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('200', {declension: 'instrumental'})) - .toBe('Двумястами рублями 00 копейками'); - expect(numberToWordsRu.convert('201', {declension: 'instrumental'})) - .toBe('Двумястами одним рублём 00 копейками'); - expect(numberToWordsRu.convert('210', {declension: 'instrumental'})) - .toBe('Двумястами десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('500', {declension: 'instrumental'})) - .toBe('Пятьюстами рублями 00 копейками'); - expect(numberToWordsRu.convert('501', {declension: 'instrumental'})) - .toBe('Пятьюстами одним рублём 00 копейками'); - expect(numberToWordsRu.convert('510', {declension: 'instrumental'})) - .toBe('Пятьюстами десятью рублями 00 копейками'); - expect(numberToWordsRu.convert('1000', {declension: 'instrumental'})) - .toBe('Одной тысячей рублей 00 копейками'); - expect(numberToWordsRu.convert('1001', {declension: 'instrumental'})) - .toBe('Одной тысячей одним рублём 00 копейками'); - expect(numberToWordsRu.convert('1002', {declension: 'instrumental'})) - .toBe('Одной тысячей двумя рублями 00 копейками'); - expect(numberToWordsRu.convert('1005', {declension: 'instrumental'})) - .toBe('Одной тысячей пятью рублями 00 копейками'); - expect(numberToWordsRu.convert('1100', {declension: 'instrumental'})) - .toBe('Одной тысячей ста рублями 00 копейками'); - expect(numberToWordsRu.convert('1000000', {declension: 'instrumental'})) - .toBe('Одним миллионом рублей 00 копейками'); - expect(numberToWordsRu.convert('987654321', {declension: 'instrumental'})) - .toBe('Девятьюстами восемьюдесятью семью миллионами шестьюстами пятьюдесятью четырьмя тысячами тремястами двадцатью одним рублём 00 копейками'); - expect(numberToWordsRu.convert('1001121.01', {declension: 'instrumental', convertNumbertToWords: {fractional: true}})) - .toBe('Одним миллионом одной тысячей ста двадцатью одним рублём одной копейкой'); - expect(numberToWordsRu.convert('2002122.02', {declension: 'instrumental', convertNumbertToWords: {fractional: true}})) - .toBe('Двумя миллионами двумя тысячами ста двадцатью двумя рублями двумя копейками'); - expect(numberToWordsRu.convert('5005125.05', {declension: 'instrumental', convertNumbertToWords: {fractional: true}})) - .toBe('Пятью миллионами пятью тысячами ста двадцатью пятью рублями пятью копейками'); + describe('Творительный', () => { + test('Обычные числа', () => { + const options = { + declension: 'instrumental', + }; + expect(numberToWordsRu.convert('0', options)) + .toBe('Нолём рублей 00 копеек'); + expect(numberToWordsRu.convert('1', options)) + .toBe('Одним рублём 00 копеек'); + expect(numberToWordsRu.convert('2', options)) + .toBe('Двумя рублями 00 копеек'); + expect(numberToWordsRu.convert('3', options)) + .toBe('Тремя рублями 00 копеек'); + expect(numberToWordsRu.convert('4', options)) + .toBe('Четырьмя рублями 00 копеек'); + expect(numberToWordsRu.convert('5', options)) + .toBe('Пятью рублями 00 копеек'); + expect(numberToWordsRu.convert('10', options)) + .toBe('Десятью рублями 00 копеек'); + expect(numberToWordsRu.convert('11', options)) + .toBe('Одиннадцатью рублями 00 копеек'); + expect(numberToWordsRu.convert('12', options)) + .toBe('Двенадцатью рублями 00 копеек'); + expect(numberToWordsRu.convert('15', options)) + .toBe('Пятнадцатью рублями 00 копеек'); + expect(numberToWordsRu.convert('20', options)) + .toBe('Двадцатью рублями 00 копеек'); + expect(numberToWordsRu.convert('21', options)) + .toBe('Двадцатью одним рублём 00 копеек'); + expect(numberToWordsRu.convert('30', options)) + .toBe('Тридцатью рублями 00 копеек'); + expect(numberToWordsRu.convert('32', options)) + .toBe('Тридцатью двумя рублями 00 копеек'); + expect(numberToWordsRu.convert('40', options)) + .toBe('Сорока рублями 00 копеек'); + expect(numberToWordsRu.convert('43', options)) + .toBe('Сорока тремя рублями 00 копеек'); + expect(numberToWordsRu.convert('50', options)) + .toBe('Пятьюдесятью рублями 00 копеек'); + expect(numberToWordsRu.convert('54', options)) + .toBe('Пятьюдесятью четырьмя рублями 00 копеек'); + expect(numberToWordsRu.convert('60', options)) + .toBe('Шестьюдесятью рублями 00 копеек'); + expect(numberToWordsRu.convert('65', options)) + .toBe('Шестьюдесятью пятью рублями 00 копеек'); + expect(numberToWordsRu.convert('90', options)) + .toBe('Девяноста рублями 00 копеек'); + expect(numberToWordsRu.convert('99', options)) + .toBe('Девяноста девятью рублями 00 копеек'); + expect(numberToWordsRu.convert('100', options)) + .toBe('Ста рублями 00 копеек'); + expect(numberToWordsRu.convert('101', options)) + .toBe('Ста одним рублём 00 копеек'); + expect(numberToWordsRu.convert('110', options)) + .toBe('Ста десятью рублями 00 копеек'); + expect(numberToWordsRu.convert('200', options)) + .toBe('Двумястами рублями 00 копеек'); + expect(numberToWordsRu.convert('201', options)) + .toBe('Двумястами одним рублём 00 копеек'); + expect(numberToWordsRu.convert('210', options)) + .toBe('Двумястами десятью рублями 00 копеек'); + expect(numberToWordsRu.convert('500', options)) + .toBe('Пятьюстами рублями 00 копеек'); + expect(numberToWordsRu.convert('501', options)) + .toBe('Пятьюстами одним рублём 00 копеек'); + expect(numberToWordsRu.convert('510', options)) + .toBe('Пятьюстами десятью рублями 00 копеек'); + expect(numberToWordsRu.convert('1000', options)) + .toBe('Одной тысячей рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', options)) + .toBe('Одной тысячей одним рублём 00 копеек'); + expect(numberToWordsRu.convert('1002', options)) + .toBe('Одной тысячей двумя рублями 00 копеек'); + expect(numberToWordsRu.convert('1005', options)) + .toBe('Одной тысячей пятью рублями 00 копеек'); + expect(numberToWordsRu.convert('1100', options)) + .toBe('Одной тысячей ста рублями 00 копеек'); + expect(numberToWordsRu.convert('1000000', options)) + .toBe('Одним миллионом рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', options)) + .toBe('Девятьюстами восемьюдесятью семью миллионами шестьюстами пятьюдесятью четырьмя тысячами тремястами двадцатью одним рублём 00 копеек'); + expect(numberToWordsRu.convert('1001121.01', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Одним миллионом одной тысячей ста двадцатью одним рублём одной копейкой'); + expect(numberToWordsRu.convert('2002122.02', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Двумя миллионами двумя тысячами ста двадцатью двумя рублями двумя копейками'); + expect(numberToWordsRu.convert('5005125.05', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Пятью миллионами пятью тысячами ста двадцатью пятью рублями пятью копейками'); + }); + test('С валютой "number"', () => { + const options = { + currency: 'number', + declension: 'instrumental', + convertNumbertToWords: {fractional: true}, + }; + expect(numberToWordsRu.convert('1.0', options)) + .toBe('Одной целой нолём десятых'); + expect(numberToWordsRu.convert('1.1', options)) + .toBe('Одной целой одной десятой'); + expect(numberToWordsRu.convert('2.1', options)) + .toBe('Двумя целыми одной десятой'); + expect(numberToWordsRu.convert('5.1', options)) + .toBe('Пятью целыми одной десятой'); + expect(numberToWordsRu.convert('11.1', options)) + .toBe('Одиннадцатью целыми одной десятой'); + expect(numberToWordsRu.convert('101.1', options)) + .toBe('Ста одной целой одной десятой'); + expect(numberToWordsRu.convert('102.1', options)) + .toBe('Ста двумя целыми одной десятой'); + expect(numberToWordsRu.convert('1.2', options)) + .toBe('Одной целой двумя десятыми'); + expect(numberToWordsRu.convert('1.5', options)) + .toBe('Одной целой пятью десятыми'); + expect(numberToWordsRu.convert('1.11', options)) + .toBe('Одной целой одиннадцатью сотыми'); + expect(numberToWordsRu.convert('1.21', options)) + .toBe('Одной целой двадцатью одной сотой'); + expect(numberToWordsRu.convert('1.22', options)) + .toBe('Одной целой двадцатью двумя сотыми'); + expect(numberToWordsRu.convert('1.101', options)) + .toBe('Одной целой ста одной тысячной'); + expect(numberToWordsRu.convert('1.102', options)) + .toBe('Одной целой ста двумя тысячными'); + expect(numberToWordsRu.convert('1.00001', options)) + .toBe('Одной целой одной стотысячной'); + expect(numberToWordsRu.convert('1.00002', options)) + .toBe('Одной целой двумя стотысячными'); + }); + test('С разделителем "/"', () => { + const options = { + declension: 'instrumental', + convertNumbertToWords: { + integer: true, + fractional: true, + }, + }; + expect(numberToWordsRu.convert('1/0', options)) + .toBe('Одной нулевой рубля'); + expect(numberToWordsRu.convert('1/1', options)) + .toBe('Одной первой рубля'); + expect(numberToWordsRu.convert('1/2', options)) + .toBe('Одной второй рубля'); + expect(numberToWordsRu.convert('1/5', options)) + .toBe('Одной пятой рубля'); + expect(numberToWordsRu.convert('2/0', options)) + .toBe('Двумя нулевыми рубля'); + expect(numberToWordsRu.convert('2/1', options)) + .toBe('Двумя первыми рубля'); + expect(numberToWordsRu.convert('2/2', options)) + .toBe('Двумя вторыми рубля'); + expect(numberToWordsRu.convert('2/5', options)) + .toBe('Двумя пятыми рубля'); + expect(numberToWordsRu.convert('1/10', options)) + .toBe('Одной десятой рубля'); + expect(numberToWordsRu.convert('1/11', options)) + .toBe('Одной одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/12', options)) + .toBe('Одной двенадцатой рубля'); + expect(numberToWordsRu.convert('1/15', options)) + .toBe('Одной пятнадцатой рубля'); + expect(numberToWordsRu.convert('1/20', options)) + .toBe('Одной двадцатой рубля'); + expect(numberToWordsRu.convert('1/21', options)) + .toBe('Одной двадцать первой рубля'); + expect(numberToWordsRu.convert('1/100', options)) + .toBe('Одной сотой рубля'); + expect(numberToWordsRu.convert('1/101', options)) + .toBe('Одной сто первой рубля'); + expect(numberToWordsRu.convert('1/102', options)) + .toBe('Одной сто второй рубля'); + expect(numberToWordsRu.convert('1/110', options)) + .toBe('Одной сто десятой рубля'); + expect(numberToWordsRu.convert('1/112', options)) + .toBe('Одной сто двенадцатой рубля'); + expect(numberToWordsRu.convert('1/1000', options)) + .toBe('Одной тысячной рубля'); + expect(numberToWordsRu.convert('1/1001', options)) + .toBe('Одной одна тысяча первой рубля'); + expect(numberToWordsRu.convert('1/1002', options)) + .toBe('Одной одна тысяча второй рубля'); + expect(numberToWordsRu.convert('1/1010', options)) + .toBe('Одной одна тысяча десятой рубля'); + expect(numberToWordsRu.convert('1/1011', options)) + .toBe('Одной одна тысяча одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/1020', options)) + .toBe('Одной одна тысяча двадцатой рубля'); + expect(numberToWordsRu.convert('1/1021', options)) + .toBe('Одной одна тысяча двадцать первой рубля'); + expect(numberToWordsRu.convert('1/10000', options)) + .toBe('Одной десятитысячной рубля'); + expect(numberToWordsRu.convert('1/11000', options)) + .toBe('Одной одиннадцатитысячной рубля'); + expect(numberToWordsRu.convert('1/521000', options)) + .toBe('Одной пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1521000', options)) + .toBe('Одной один миллион пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1001002', options)) + .toBe('Одной один миллион одна тысяча второй рубля'); + }); }); - test('Предложный', () => { - expect(numberToWordsRu.convert('0', {declension: 'prepositional'})) - .toBe('Ноле рублях 00 копейках'); - expect(numberToWordsRu.convert('1', {declension: 'prepositional'})) - .toBe('Одном рубле 00 копейках'); - expect(numberToWordsRu.convert('2', {declension: 'prepositional'})) - .toBe('Двух рублях 00 копейках'); - expect(numberToWordsRu.convert('3', {declension: 'prepositional'})) - .toBe('Трёх рублях 00 копейках'); - expect(numberToWordsRu.convert('4', {declension: 'prepositional'})) - .toBe('Четырёх рублях 00 копейках'); - expect(numberToWordsRu.convert('5', {declension: 'prepositional'})) - .toBe('Пяти рублях 00 копейках'); - expect(numberToWordsRu.convert('10', {declension: 'prepositional'})) - .toBe('Десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('11', {declension: 'prepositional'})) - .toBe('Одиннадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('12', {declension: 'prepositional'})) - .toBe('Двенадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('13', {declension: 'prepositional'})) - .toBe('Тринадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('14', {declension: 'prepositional'})) - .toBe('Четырнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('15', {declension: 'prepositional'})) - .toBe('Пятнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('16', {declension: 'prepositional'})) - .toBe('Шестнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('17', {declension: 'prepositional'})) - .toBe('Семнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('18', {declension: 'prepositional'})) - .toBe('Восемнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('19', {declension: 'prepositional'})) - .toBe('Девятнадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('20', {declension: 'prepositional'})) - .toBe('Двадцати рублях 00 копейках'); - expect(numberToWordsRu.convert('21', {declension: 'prepositional'})) - .toBe('Двадцати одном рубле 00 копейках'); - expect(numberToWordsRu.convert('30', {declension: 'prepositional'})) - .toBe('Тридцати рублях 00 копейках'); - expect(numberToWordsRu.convert('32', {declension: 'prepositional'})) - .toBe('Тридцати двух рублях 00 копейках'); - expect(numberToWordsRu.convert('40', {declension: 'prepositional'})) - .toBe('Сорока рублях 00 копейках'); - expect(numberToWordsRu.convert('43', {declension: 'prepositional'})) - .toBe('Сорока трёх рублях 00 копейках'); - expect(numberToWordsRu.convert('50', {declension: 'prepositional'})) - .toBe('Пятидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('54', {declension: 'prepositional'})) - .toBe('Пятидесяти четырёх рублях 00 копейках'); - expect(numberToWordsRu.convert('60', {declension: 'prepositional'})) - .toBe('Шестидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('70', {declension: 'prepositional'})) - .toBe('Семидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('80', {declension: 'prepositional'})) - .toBe('Восьмидесяти рублях 00 копейках'); - expect(numberToWordsRu.convert('90', {declension: 'prepositional'})) - .toBe('Девяноста рублях 00 копейках'); - expect(numberToWordsRu.convert('99', {declension: 'prepositional'})) - .toBe('Девяноста девяти рублях 00 копейках'); - expect(numberToWordsRu.convert('100', {declension: 'prepositional'})) - .toBe('Ста рублях 00 копейках'); - expect(numberToWordsRu.convert('101', {declension: 'prepositional'})) - .toBe('Ста одном рубле 00 копейках'); - expect(numberToWordsRu.convert('110', {declension: 'prepositional'})) - .toBe('Ста десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('200', {declension: 'prepositional'})) - .toBe('Двухстах рублях 00 копейках'); - expect(numberToWordsRu.convert('201', {declension: 'prepositional'})) - .toBe('Двухстах одном рубле 00 копейках'); - expect(numberToWordsRu.convert('210', {declension: 'prepositional'})) - .toBe('Двухстах десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('500', {declension: 'prepositional'})) - .toBe('Пятистах рублях 00 копейках'); - expect(numberToWordsRu.convert('501', {declension: 'prepositional'})) - .toBe('Пятистах одном рубле 00 копейках'); - expect(numberToWordsRu.convert('510', {declension: 'prepositional'})) - .toBe('Пятистах десяти рублях 00 копейках'); - expect(numberToWordsRu.convert('1000', {declension: 'prepositional'})) - .toBe('Одной тысяче рублей 00 копейках'); - expect(numberToWordsRu.convert('1001', {declension: 'prepositional'})) - .toBe('Одной тысяче одном рубле 00 копейках'); - expect(numberToWordsRu.convert('1002', {declension: 'prepositional'})) - .toBe('Одной тысяче двух рублях 00 копейках'); - expect(numberToWordsRu.convert('1005', {declension: 'prepositional'})) - .toBe('Одной тысяче пяти рублях 00 копейках'); - expect(numberToWordsRu.convert('1100', {declension: 'prepositional'})) - .toBe('Одной тысяче ста рублях 00 копейках'); - expect(numberToWordsRu.convert('1000000', {declension: 'prepositional'})) - .toBe('Одном миллионе рублей 00 копейках'); - expect(numberToWordsRu.convert('987654321', {declension: 'prepositional'})) - .toBe('Девятистах восьмидесяти семи миллионах шестистах пятидесяти четырёх тысячах трёхстах двадцати одном рубле 00 копейках'); - expect(numberToWordsRu.convert('1001121.01', {declension: 'prepositional', convertNumbertToWords: {fractional: true}})) - .toBe('Одном миллионе одной тысяче ста двадцати одном рубле одной копейке'); - expect(numberToWordsRu.convert('2002122.02', {declension: 'prepositional', convertNumbertToWords: {fractional: true}})) - .toBe('Двух миллионах двух тысячах ста двадцати двух рублях двух копейках'); - expect(numberToWordsRu.convert('5005125.05', {declension: 'prepositional', convertNumbertToWords: {fractional: true}})) - .toBe('Пяти миллионах пяти тысячах ста двадцати пяти рублях пяти копейках'); + describe('Предложный', () => { + test('Обычные числа', () => { + const options = { + declension: 'prepositional', + }; + expect(numberToWordsRu.convert('0', options)) + .toBe('Ноле рублей 00 копеек'); + expect(numberToWordsRu.convert('1', options)) + .toBe('Одном рубле 00 копеек'); + expect(numberToWordsRu.convert('2', options)) + .toBe('Двух рублях 00 копеек'); + expect(numberToWordsRu.convert('3', options)) + .toBe('Трёх рублях 00 копеек'); + expect(numberToWordsRu.convert('4', options)) + .toBe('Четырёх рублях 00 копеек'); + expect(numberToWordsRu.convert('5', options)) + .toBe('Пяти рублях 00 копеек'); + expect(numberToWordsRu.convert('10', options)) + .toBe('Десяти рублях 00 копеек'); + expect(numberToWordsRu.convert('11', options)) + .toBe('Одиннадцати рублях 00 копеек'); + expect(numberToWordsRu.convert('12', options)) + .toBe('Двенадцати рублях 00 копеек'); + expect(numberToWordsRu.convert('15', options)) + .toBe('Пятнадцати рублях 00 копеек'); + expect(numberToWordsRu.convert('20', options)) + .toBe('Двадцати рублях 00 копеек'); + expect(numberToWordsRu.convert('21', options)) + .toBe('Двадцати одном рубле 00 копеек'); + expect(numberToWordsRu.convert('30', options)) + .toBe('Тридцати рублях 00 копеек'); + expect(numberToWordsRu.convert('32', options)) + .toBe('Тридцати двух рублях 00 копеек'); + expect(numberToWordsRu.convert('40', options)) + .toBe('Сорока рублях 00 копеек'); + expect(numberToWordsRu.convert('43', options)) + .toBe('Сорока трёх рублях 00 копеек'); + expect(numberToWordsRu.convert('50', options)) + .toBe('Пятидесяти рублях 00 копеек'); + expect(numberToWordsRu.convert('54', options)) + .toBe('Пятидесяти четырёх рублях 00 копеек'); + expect(numberToWordsRu.convert('60', options)) + .toBe('Шестидесяти рублях 00 копеек'); + expect(numberToWordsRu.convert('65', options)) + .toBe('Шестидесяти пяти рублях 00 копеек'); + expect(numberToWordsRu.convert('90', options)) + .toBe('Девяноста рублях 00 копеек'); + expect(numberToWordsRu.convert('99', options)) + .toBe('Девяноста девяти рублях 00 копеек'); + expect(numberToWordsRu.convert('100', options)) + .toBe('Ста рублях 00 копеек'); + expect(numberToWordsRu.convert('101', options)) + .toBe('Ста одном рубле 00 копеек'); + expect(numberToWordsRu.convert('110', options)) + .toBe('Ста десяти рублях 00 копеек'); + expect(numberToWordsRu.convert('200', options)) + .toBe('Двухстах рублях 00 копеек'); + expect(numberToWordsRu.convert('201', options)) + .toBe('Двухстах одном рубле 00 копеек'); + expect(numberToWordsRu.convert('210', options)) + .toBe('Двухстах десяти рублях 00 копеек'); + expect(numberToWordsRu.convert('500', options)) + .toBe('Пятистах рублях 00 копеек'); + expect(numberToWordsRu.convert('501', options)) + .toBe('Пятистах одном рубле 00 копеек'); + expect(numberToWordsRu.convert('510', options)) + .toBe('Пятистах десяти рублях 00 копеек'); + expect(numberToWordsRu.convert('1000', options)) + .toBe('Одной тысяче рублей 00 копеек'); + expect(numberToWordsRu.convert('1001', options)) + .toBe('Одной тысяче одном рубле 00 копеек'); + expect(numberToWordsRu.convert('1002', options)) + .toBe('Одной тысяче двух рублях 00 копеек'); + expect(numberToWordsRu.convert('1005', options)) + .toBe('Одной тысяче пяти рублях 00 копеек'); + expect(numberToWordsRu.convert('1100', options)) + .toBe('Одной тысяче ста рублях 00 копеек'); + expect(numberToWordsRu.convert('1000000', options)) + .toBe('Одном миллионе рублей 00 копеек'); + expect(numberToWordsRu.convert('987654321', options)) + .toBe('Девятистах восьмидесяти семи миллионах шестистах пятидесяти четырёх тысячах трёхстах двадцати одном рубле 00 копеек'); + expect(numberToWordsRu.convert('1001121.01', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Одном миллионе одной тысяче ста двадцати одном рубле одной копейке'); + expect(numberToWordsRu.convert('2002122.02', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Двух миллионах двух тысячах ста двадцати двух рублях двух копейках'); + expect(numberToWordsRu.convert('5005125.05', {...options, convertNumbertToWords: {fractional: true}})) + .toBe('Пяти миллионах пяти тысячах ста двадцати пяти рублях пяти копейках'); + }); + test('С валютой "number"', () => { + const options = { + currency: 'number', + declension: 'prepositional', + convertNumbertToWords: {fractional: true}, + }; + expect(numberToWordsRu.convert('1.0', options)) + .toBe('Одной целой ноле десятых'); + expect(numberToWordsRu.convert('1.1', options)) + .toBe('Одной целой одной десятой'); + expect(numberToWordsRu.convert('2.1', options)) + .toBe('Двух целых одной десятой'); + expect(numberToWordsRu.convert('5.1', options)) + .toBe('Пяти целых одной десятой'); + expect(numberToWordsRu.convert('11.1', options)) + .toBe('Одиннадцати целых одной десятой'); + expect(numberToWordsRu.convert('101.1', options)) + .toBe('Ста одной целой одной десятой'); + expect(numberToWordsRu.convert('102.1', options)) + .toBe('Ста двух целых одной десятой'); + expect(numberToWordsRu.convert('1.2', options)) + .toBe('Одной целой двух десятых'); + expect(numberToWordsRu.convert('1.5', options)) + .toBe('Одной целой пяти десятых'); + expect(numberToWordsRu.convert('1.11', options)) + .toBe('Одной целой одиннадцати сотых'); + expect(numberToWordsRu.convert('1.21', options)) + .toBe('Одной целой двадцати одной сотой'); + expect(numberToWordsRu.convert('1.22', options)) + .toBe('Одной целой двадцати двух сотых'); + expect(numberToWordsRu.convert('1.101', options)) + .toBe('Одной целой ста одной тысячной'); + expect(numberToWordsRu.convert('1.102', options)) + .toBe('Одной целой ста двух тысячных'); + expect(numberToWordsRu.convert('1.00001', options)) + .toBe('Одной целой одной стотысячной'); + expect(numberToWordsRu.convert('1.00002', options)) + .toBe('Одной целой двух стотысячных'); + }); + test('С разделителем "/"', () => { + const options = { + declension: 'prepositional', + convertNumbertToWords: { + integer: true, + fractional: true, + }, + }; + expect(numberToWordsRu.convert('1/0', options)) + .toBe('Одной нулевой рубля'); + expect(numberToWordsRu.convert('1/1', options)) + .toBe('Одной первой рубля'); + expect(numberToWordsRu.convert('1/2', options)) + .toBe('Одной второй рубля'); + expect(numberToWordsRu.convert('1/5', options)) + .toBe('Одной пятой рубля'); + expect(numberToWordsRu.convert('2/0', options)) + .toBe('Двух нулевых рубля'); + expect(numberToWordsRu.convert('2/1', options)) + .toBe('Двух первых рубля'); + expect(numberToWordsRu.convert('2/2', options)) + .toBe('Двух вторых рубля'); + expect(numberToWordsRu.convert('2/5', options)) + .toBe('Двух пятых рубля'); + expect(numberToWordsRu.convert('1/10', options)) + .toBe('Одной десятой рубля'); + expect(numberToWordsRu.convert('1/11', options)) + .toBe('Одной одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/12', options)) + .toBe('Одной двенадцатой рубля'); + expect(numberToWordsRu.convert('1/15', options)) + .toBe('Одной пятнадцатой рубля'); + expect(numberToWordsRu.convert('1/20', options)) + .toBe('Одной двадцатой рубля'); + expect(numberToWordsRu.convert('1/21', options)) + .toBe('Одной двадцать первой рубля'); + expect(numberToWordsRu.convert('1/100', options)) + .toBe('Одной сотой рубля'); + expect(numberToWordsRu.convert('1/101', options)) + .toBe('Одной сто первой рубля'); + expect(numberToWordsRu.convert('1/102', options)) + .toBe('Одной сто второй рубля'); + expect(numberToWordsRu.convert('1/110', options)) + .toBe('Одной сто десятой рубля'); + expect(numberToWordsRu.convert('1/112', options)) + .toBe('Одной сто двенадцатой рубля'); + expect(numberToWordsRu.convert('1/1000', options)) + .toBe('Одной тысячной рубля'); + expect(numberToWordsRu.convert('1/1001', options)) + .toBe('Одной одна тысяча первой рубля'); + expect(numberToWordsRu.convert('1/1002', options)) + .toBe('Одной одна тысяча второй рубля'); + expect(numberToWordsRu.convert('1/1010', options)) + .toBe('Одной одна тысяча десятой рубля'); + expect(numberToWordsRu.convert('1/1011', options)) + .toBe('Одной одна тысяча одиннадцатой рубля'); + expect(numberToWordsRu.convert('1/1020', options)) + .toBe('Одной одна тысяча двадцатой рубля'); + expect(numberToWordsRu.convert('1/1021', options)) + .toBe('Одной одна тысяча двадцать первой рубля'); + expect(numberToWordsRu.convert('1/10000', options)) + .toBe('Одной десятитысячной рубля'); + expect(numberToWordsRu.convert('1/11000', options)) + .toBe('Одной одиннадцатитысячной рубля'); + expect(numberToWordsRu.convert('1/521000', options)) + .toBe('Одной пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1521000', options)) + .toBe('Одной один миллион пятисотдвадцатиоднотысячной рубля'); + expect(numberToWordsRu.convert('1/1001002', options)) + .toBe('Одной один миллион одна тысяча второй рубля'); + }); + }); + describe('Падежи с настроенной валютой', () => { + test('Объект падежей не указан', () => { + const options = { + convertNumbertToWords: { + integer: true, + fractional: true, + }, + }; + const currency = { + currencyNameCases: ['доллар', 'доллара', 'долларов'], + fractionalPartNameCases: ['цент', 'цента', 'центов'], + }; + expect(numberToWordsRu.convert('4011121.01', { + ...options, + declension: 'nominative', + currency: { + ...currency, + currencyNounGender: { + integer: 0, + fractionalPart: 0, + }, + }, + })) + .toBe('Четыре миллиона одиннадцать тысяч сто двадцать один доллар один цент'); + expect(numberToWordsRu.convert('4011123.02', { + ...options, + declension: 'nominative', + currency: { + ...currency, + currencyNounGender: { + integer: 0, + fractionalPart: 0, + }, + }, + })) + .toBe('Четыре миллиона одиннадцать тысяч сто двадцать три доллара два цента'); + expect(numberToWordsRu.convert('4011121.01', { + ...options, + declension: 'genitive', + currency: { + ...currency, + }, + })) + .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати одного рубля одной копейки'); + expect(numberToWordsRu.convert('4011122.02', { + ...options, + declension: 'genitive', + currency: { + ...currency, + }, + })) + .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати двух рублей двух копеек'); + expect(numberToWordsRu.convert('4011121.01', { + ...options, + declension: 'instrumental', + currency: { + ...currency, + }, + })) + .toBe('Четырьмя миллионами одиннадцатью тысячами ста двадцатью одним рублём одной копейкой'); + expect(numberToWordsRu.convert('4011122.02', { + ...options, + declension: 'instrumental', + currency: { + ...currency, + }, + })) + .toBe('Четырьмя миллионами одиннадцатью тысячами ста двадцатью двумя рублями двумя копейками'); + }); + test('Объект падежей указан', () => { + const options = { + currency: { + currencyNameCases: ['доллар', 'доллара', 'долларов'], + currencyNameDeclensions: { + nominative: ['доллар', 'доллары'], + genitive: ['доллара', 'долларов'], + dative: ['доллару', 'долларам'], + accusative: ['доллар', 'доллары'], + instrumental: ['долларом', 'долларами'], + prepositional: ['долларе', 'долларах'], + }, + fractionalPartNameCases: ['цент', 'цента', 'центов'], + fractionalPartNameDeclensions: { + nominative: ['цент', 'центы'], + genitive: ['цента', 'центов'], + dative: ['центу', 'центам'], + accusative: ['цент', 'центы'], + instrumental: ['центом', 'центами'], + prepositional: ['центе', 'центах'], + }, + currencyNounGender: { + integer: 0, + fractionalPart: 0, + }, + }, + convertNumbertToWords: { + integer: true, + fractional: true, + }, + }; + expect(numberToWordsRu.convert('4011121.01', { + ...options, + declension: 'nominative', + })) + .toBe('Четыре миллиона одиннадцать тысяч сто двадцать один доллар один цент'); + expect(numberToWordsRu.convert('4011122.02', { + ...options, + declension: 'nominative', + })) + .toBe('Четыре миллиона одиннадцать тысяч сто двадцать два доллара два цента'); + expect(numberToWordsRu.convert('4011121.01', { + ...options, + declension: 'genitive', + })) + .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати одного доллара одного цента'); + expect(numberToWordsRu.convert('4011122.02', { + ...options, + declension: 'genitive', + })) + .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати двух долларов двух центов'); + expect(numberToWordsRu.convert('4011121.01', { + ...options, + declension: 'instrumental', + })) + .toBe('Четырьмя миллионами одиннадцатью тысячами ста двадцатью одним долларом одним центом'); + expect(numberToWordsRu.convert('4011122.02', { + ...options, + declension: 'instrumental', + })) + .toBe('Четырьмя миллионами одиннадцатью тысячами ста двадцатью двумя долларами двумя центами'); + }); }); - // describe('Падежи с настроенной валютой', () => { - // test('Объект падежей не указан', () => { - - // }); - // test('Объект падежей указан', () => { - - // }); - // expect(numberToWordsRu.convert('4011123.02', { - // declension: 'nominative', - // currency: { - // currencyNameCases: ['доллар', 'доллара', 'долларов'], - // fractionalPartNameCases: ['цент', 'цента', 'центов'], - // currencyNounGender: { - // integer: 0, - // fractionalPart: 0, - // }, - // }, - // convertNumbertToWords: { - // integer: true, - // fractional: true, - // }, - // })) - // .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати трёх рублей двух копеек'); - // expect(numberToWordsRu.convert('4011123.02', { - // declension: 'instrumental', - // currency: { - // currencyNameCases: ['доллар', 'доллара', 'долларов'], - // fractionalPartNameCases: ['цент', 'цента', 'центов'], - // currencyNounGender: { - // integer: 0, - // fractionalPart: 0, - // }, - // }, - // convertNumbertToWords: { - // integer: true, - // fractional: true, - // }, - // })) - // .toBe('Четырьмя миллионами одиннадцатью тысячами ста двадцатью тремя рублями двумя копейками'); - // expect(numberToWordsRu.convert('4011121.02', { - // declension: 'genitive', - // currency: { - // currencyNameCases: ['доллар', 'доллара', 'долларов'], - // fractionalPartNameCases: ['цент', 'цента', 'центов'], - // currencyNounGender: { - // integer: 0, - // fractionalPart: 0, - // }, - // }, - // convertNumbertToWords: { - // integer: true, - // fractional: true, - // }, - // })) - // .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати одного рубля двух копеек'); - // expect(numberToWordsRu.convert('4011121.02', { - // declension: 'instrumental', - // currencyNameCases: ['доллар', 'доллара', 'долларов'], - // currencyNameDeclensions: { - // [declensions.NOMINATIVE]: ['доллар', 'доллары'], - // [declensions.GENITIVE]: ['доллара', 'долларов'], - // [declensions.DATIVE]: ['доллару', 'долларам'], - // [declensions.ACCUSATIVE]: ['доллар', 'доллары'], - // [declensions.INSTRUMENTAL]: ['долларом', 'долларами'], - // [declensions.PREPOSITIONAL]: ['долларе', 'долларах'], - // }, - // fractionalPartNameCases: ['цент', 'цента', 'центов'], - // fractionalPartNameDeclensions: { - // [declensions.NOMINATIVE]: ['цент', 'центы'], - // [declensions.GENITIVE]: ['цента', 'центов'], - // [declensions.DATIVE]: ['центу', 'центам'], - // [declensions.ACCUSATIVE]: ['цент', 'центы'], - // [declensions.INSTRUMENTAL]: ['центом', 'центами'], - // [declensions.PREPOSITIONAL]: ['центе', 'центах'], - // }, - // currencyNounGender: { - // integer: 0, - // fractionalPart: 0, - // }, - // })) - // .toBe('Четырёх миллионов одиннадцати тысяч ста двадцати одного доллара двух центов'); - // }); }); From d6a46f7c4f19b57feaecb60e209b22586c870403 Mon Sep 17 00:00:00 2001 From: Anton Moskovskiy <7397158+Ant1mas@users.noreply.github.com> Date: Mon, 8 Feb 2021 17:53:46 +0500 Subject: [PATCH 10/12] edited README files --- README-english.md | 150 +++++++++++++++++++++++++++++++++++++++++---- README.md | 151 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 278 insertions(+), 23 deletions(-) diff --git a/README-english.md b/README-english.md index 6706b5c..4f74261 100644 --- a/README-english.md +++ b/README-english.md @@ -33,10 +33,11 @@ # Features - **Max 306** digits **before point** and **305** digits **after point** can be converted in words (if typed as String). -- Use any **own custom currency**. -- Use with any object (for example "сообщение", "комментарий", работа"...). +- Flexible **customization of currency**. +- Use **with any object** (for example "сообщение", "комментарий", работа"...). - Convert number in words without real currency ("целых", "десятых", "стотысячных" etc.) - Convert **number with slash** in words (delimiter "/"). +- Convert **in any declension**. - **Round number** to specified precision. - **Auto round to 2 digits** after point long number with common currency. - **Hide part** before point or after point. @@ -67,6 +68,7 @@ numberToWordsRu.convert('104'); // or with options numberToWordsRu.convert('-4201512.21', { currency: 'rub', + declension: 'nominative', roundNumber: -1, convertMinusSignToWord: true, showNumberParts: { @@ -93,6 +95,11 @@ numberToWordsRu.convert('-4201512.21', { ------------------------ +

+ + +#### **Метод `convert`** + ``` convert(number, [options]) ``` @@ -118,6 +125,7 @@ Convert number to words. ```js { currency: 'rub', + declension: 'nominative', roundNumber: -1, convertMinusSignToWord: true, showNumberParts: { @@ -136,8 +144,12 @@ Convert number to words. ``` ------------------------ +

+ ### **Argument `options`** +#### **`options.currency`** + ``` currency: (string|Object) ``` @@ -161,7 +173,7 @@ Currency of number. **Note**: For all common currencies except `number` set `fractionalPartMinLength: 2`. Also these currencies will be rounded to `2`. -- Own currency: +- Customize currency: ```js { @@ -174,6 +186,30 @@ Currency of number. fractionalPartMinLength: 2 } // or +{ + currencyNameDeclensions: { + nominative: ['рубль', 'рубли'], + genitive: ['рубля', 'рублей'], + dative: ['рублю', 'рублям'], + accusative: ['рубль', 'рубли'], + instrumental: ['рублём', 'рублями'], + prepositional: ['рубле', 'рублях'], + }, + fractionalPartNameDeclensions: { + nominative: ['копейка', 'копейки'], + genitive: ['копейки', 'копеек'], + dative: ['копейке', 'копейкам'], + accusative: ['копейку', 'копейки'], + instrumental: ['копейкой', 'копейками'], + prepositional: ['копейке', 'копейках'], + }, + currencyNounGender: { + integer: 0, + fractionalPart: 1 + }, + fractionalPartMinLength: 2 +} +// or { currencyNameCases: ['сообщение', 'сообщения', 'сообщений'], fractionalPartNameCases: ['', '', ''], @@ -186,12 +222,46 @@ Currency of number. **Note**: If currency object will not be filled completely then missing data will be taken from default currency (`'rub'`). -#### Parameters of object `currency` +- Default currency object (`'rub'`): + +```js +{ + currencyNameCases: ['рубль', 'рубля', 'рублей'], // [1 рубль, 2-4 рубля, 5-9 рублей] + currencyNameDeclensions: { + nominative: ['рубль', 'рубли'], // [singular, plural] + genitive: ['рубля', 'рублей'], + dative: ['рублю', 'рублям'], + accusative: ['рубль', 'рубли'], + instrumental: ['рублём', 'рублями'], + prepositional: ['рубле', 'рублях'], + }, + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + fractionalPartNameDeclensions: { + nominative: ['копейка', 'копейки'], + genitive: ['копейки', 'копеек'], + dative: ['копейке', 'копейкам'], + accusative: ['копейку', 'копейки'], + instrumental: ['копейкой', 'копейками'], + prepositional: ['копейке', 'копейках'], + }, + currencyNounGender: { + integer: 0, // 0 => ('один', 'два'...) + fractionalPart: 1 // 1 => ('одна', 'две'...) + }, + fractionalPartMinLength: 2 +} +``` + +#### Fields of object `currency` `currencyNameCases: (Array)`: Currency form name of integer part. 3 elements in array. +`currencyNameDeclensions: (Object)`: Declensions of integer part. In object 6 declensions, inside of each placed array with singular and plural. + `fractionalPartNameCases: (Array)`: Currency form name of fractional part. 3 elements in array. +`fractionalPartNameDeclensions: (Object)`: Declensions of fractional part. In object 6 declensions, inside of each placed array with singular and plural. + `currencyNounGender: (Object)`: Form of number: 0 - ("один"), 1 - ("одна"), 2 - ("одно"). - `integer` - For integer part. @@ -200,9 +270,60 @@ Currency of number. `fractionalPartMinLength: (number)`: Minimal length of fractional part. For example if set `3` then in fractional part mey be number `002`. -**Note**: In arrays `currencyNameCases` and `fractionalPartNameCases`: first element for digit 1 (1 `рубль`), second elemet for digits 2-4 (2 `рубля`), third element for digits 5-9 and 0 (5 `рублей`). +**Note**: In arrays `currencyNameCases` and `fractionalPartNameCases`: first element for digit 1 (`1 рубль`), second elemet for digits 2-4 (`2 рубля`), third element for digits 5-9 and 0 (`5 рублей`). + +

+ +#### **`options.declension`** + +``` +declension: (string) +``` + +Select declension. + +#### **Default value** + +'nominative' + +#### **Possible values** + +- `'nominative'` - For example, "Двадцать одна тысяча рублей". +- `'genitive'` - For example, "Двадцати одной тысячи рублей". +- `'dative'` - For example, "Двадцати одной тысяче рублей". +- `'accusative'` - For example, "Двадцать одну тысячу рублей". +- `'instrumental'` - For example, "Двадцатью одной тысячей рублей". +- `'prepositional'` - For example, "Двадцати одной тысяче рублей". + +#### Example + +```js +numberToWordsRu.convert('41521000', { + declension: 'instrumental', +}); +// Сорока одним миллионом пятьюстами двадцатью одной тысячей рублей 00 копеек + +numberToWordsRu.convert('2711.00052', { + declension: 'instrumental', + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, +}); +// Двумя тысячами семьюстами одиннадцатью целыми пятьюдесятью двумя стотысячными + +numberToWordsRu.convert('672/15', { + declension: 'instrumental', + convertNumbertToWords: { + fractional: true, + }, +}); +// Шестьюстами семьюдесятью двумя пятнадцатыми рубля +``` -
+

+ +#### **`options.roundNumber`** ``` roundNumber: (number) @@ -217,7 +338,6 @@ Round number to specified precision. #### **Possible values** - `(number)` - Precision. Integer. - - `-1` - Disable rounding. **Note**: If option `currency` is a common currency (`rub` / `usd` / `eur`) then after rounding it will be rounded again to 2 digits. @@ -246,7 +366,9 @@ numberToWordsRu.convert('129.6789', { **Note**: If delimiter is slash ("`/`") then number will NOT be rounded in any case. -
+

+ +#### **`options.convertMinusSignToWord`** ``` convertMinusSignToWord: (Boolean) @@ -258,7 +380,9 @@ Convert minus sign to word ( '-' --> 'минус' ). true -
+

+ +#### **`options.showNumberParts`** ``` showNumberParts: (Object) @@ -295,7 +419,9 @@ numberToWordsRu.convert('123.45', { // 45 копеек ``` -
+

+ +#### **`options.convertNumbertToWords`** ``` convertNumbertToWords: (Object) @@ -332,7 +458,9 @@ numberToWordsRu.convert('123.45', { // 123 рубля сорок пять копеек ``` -
+

+ +#### **`options.showCurrency`** ``` showCurrency: (Object) diff --git a/README.md b/README.md index 26e4540..90251ee 100644 --- a/README.md +++ b/README.md @@ -33,10 +33,11 @@ # Возможности - **Максимум 306** цифр **до запятой** и **305** цифр **после запятой** в числе могут быть конвертированы в слова (если число указано как строка). -- Использование **любой своей валюты**. -- Использование с любым объектом (напр. "сообщение", "комментарий", "работа"...). +- Гибкая **настройка валюты**. +- Использование **с любым объектом** (напр. "сообщение", "комментарий", "работа"...). - Конвертирование числа в слова без реальной валюты ("целых", "десятых", "стотысячных" и т. д.) - Конвертирование **дробных чисел** (с разделителем "/"). +- Конвертирование **в любом падеже**. - **Округление числа** до заданной точности. - **Автоматическое округление** до 2-ух знаков после запятой числа со стандартной валютой. - **Скрытие части числа** до запятой или после запятой. @@ -67,6 +68,7 @@ numberToWordsRu.convert('104'); // или с опциями numberToWordsRu.convert('-4201512.21', { currency: 'rub', + declension: 'nominative', roundNumber: -1, convertMinusSignToWord: true, showNumberParts: { @@ -93,6 +95,10 @@ numberToWordsRu.convert('-4201512.21', { ------------------------ +

+ +#### **Метод `convert`** + ``` convert(number, [options]) ``` @@ -118,6 +124,7 @@ convert(number, [options]) ```js { currency: 'rub', + declension: 'nominative', roundNumber: -1, convertMinusSignToWord: true, showNumberParts: { @@ -136,8 +143,12 @@ convert(number, [options]) ``` ------------------------ +

+ ### **Аргумент `options`** +#### **`options.currency`** + ``` currency: (string|Object) ``` @@ -161,7 +172,7 @@ currency: (string|Object) **Примечание**: Для всех стандартных валют, кроме `number` установлено `fractionalPartMinLength: 2`. Также эти валюты автоматически округляются до `2` знаков после запятой. -- Своя валюта: +- Настроить валюту: ```js { @@ -174,6 +185,30 @@ currency: (string|Object) fractionalPartMinLength: 2 } // или +{ + currencyNameDeclensions: { + nominative: ['рубль', 'рубли'], + genitive: ['рубля', 'рублей'], + dative: ['рублю', 'рублям'], + accusative: ['рубль', 'рубли'], + instrumental: ['рублём', 'рублями'], + prepositional: ['рубле', 'рублях'], + }, + fractionalPartNameDeclensions: { + nominative: ['копейка', 'копейки'], + genitive: ['копейки', 'копеек'], + dative: ['копейке', 'копейкам'], + accusative: ['копейку', 'копейки'], + instrumental: ['копейкой', 'копейками'], + prepositional: ['копейке', 'копейках'], + }, + currencyNounGender: { + integer: 0, + fractionalPart: 1 + }, + fractionalPartMinLength: 2 +} +// или { currencyNameCases: ['сообщение', 'сообщения', 'сообщений'], fractionalPartNameCases: ['', '', ''], @@ -186,12 +221,46 @@ currency: (string|Object) **Примечание**: Если объект валюты заполнить не полностью, то недостающие параметры будут взяты из объекта валюты по умолчанию (`'rub'`). -#### Параметры объекта `currency` +- Обект валюты по умолчанию (`'rub'`): + +```js +{ + currencyNameCases: ['рубль', 'рубля', 'рублей'], // [1 рубль, 2-4 рубля, 5-9 рублей] + currencyNameDeclensions: { + nominative: ['рубль', 'рубли'], // [Единственное число, Множественное число] + genitive: ['рубля', 'рублей'], + dative: ['рублю', 'рублям'], + accusative: ['рубль', 'рубли'], + instrumental: ['рублём', 'рублями'], + prepositional: ['рубле', 'рублях'], + }, + fractionalPartNameCases: ['копейка', 'копейки', 'копеек'], + fractionalPartNameDeclensions: { + nominative: ['копейка', 'копейки'], + genitive: ['копейки', 'копеек'], + dative: ['копейке', 'копейкам'], + accusative: ['копейку', 'копейки'], + instrumental: ['копейкой', 'копейками'], + prepositional: ['копейке', 'копейках'], + }, + currencyNounGender: { + integer: 0, // 0 => Мужской род ('один', 'два'...) + fractionalPart: 1 // 1 => Женский род ('одна', 'две'...) + }, + fractionalPartMinLength: 2 +} +``` + +#### Поля объекта `currency`: `currencyNameCases: (Array)`: Формы названия валюты целой части числа. 3 элемента в массиве. +`currencyNameDeclensions: (Object)`: Падежи названия валюты целой части числа. В объекте 6 падежей, внутри каждого в массиве указаны формы единственного и множественного числа. + `fractionalPartNameCases: (Array)`: Формы названия валюты дробной части числа. 3 элемента в массиве. +`fractionalPartNameDeclensions: (Object)`: Падежи названия валюты дробной части числа. В объекте 6 падежей, внутри каждого в массиве указаны формы единственного и множественного числа. + `currencyNounGender: (Object)`: Род числа: 0 - мужской род (один), 1 - женский род (одна), 2 - средний род (одно). - `integer` - Для целой части числа. @@ -200,9 +269,60 @@ currency: (string|Object) `fractionalPartMinLength: (number)`: Минимальное количество знаков, котрое может остаться в дробной части. Например, при значении `3` в дробной части возможно число `002`. -**Примечание**: В массивах `currencyNameCases` и `fractionalPartNameCases`: первый элемент для цифры 1 (1 `рубль`), второй элемент для цифр 2-4 (2 `рубля`), третий элемент для цифр 5-9 и 0 (5 `рублей`). +**Примечание**: В массивах `currencyNameCases` и `fractionalPartNameCases`: первый элемент для цифры 1 (`1 рубль`), второй элемент для цифр 2-4 (`2 рубля`), третий элемент для цифр 5-9 и 0 (`5 рублей`). + +

+ +#### **`options.declension`** + +``` +declension: (string) +``` + +Выбрать падеж. + +#### **Значение по умолчанию** + +'nominative' + +#### **Возможные значения** + +- `'nominative'` - Именительный падеж. Например, "Двадцать одна тысяча рублей". +- `'genitive'` - Родительный падеж. Например, "Двадцати одной тысячи рублей". +- `'dative'` - Дательный падеж. Например, "Двадцати одной тысяче рублей". +- `'accusative'` - Винительный падеж. Например, "Двадцать одну тысячу рублей". +- `'instrumental'` - Творительный падеж. Например, "Двадцатью одной тысячей рублей". +- `'prepositional'` - Предложный падеж. Например, "Двадцати одной тысяче рублей". + +#### Пример + +```js +numberToWordsRu.convert('41521000', { + declension: 'instrumental', +}); +// Сорока одним миллионом пятьюстами двадцатью одной тысячей рублей 00 копеек + +numberToWordsRu.convert('2711.00052', { + declension: 'instrumental', + currency: 'number', + convertNumbertToWords: { + fractional: true, + }, +}); +// Двумя тысячами семьюстами одиннадцатью целыми пятьюдесятью двумя стотысячными + +numberToWordsRu.convert('672/15', { + declension: 'instrumental', + convertNumbertToWords: { + fractional: true, + }, +}); +// Шестьюстами семьюдесятью двумя пятнадцатыми рубля +``` -
+

+ +#### **`options.roundNumber`** ``` roundNumber: (number) @@ -217,7 +337,6 @@ roundNumber: (number) #### **Возможные значения** - `(number)` - Целое число. Количество знаков после запятой, до которой нужно округлить число. - - `-1` - Отключить округление. **Примечание**: Если опция `currency` является стандартной валютой (`'rub'` / `'usd'` / `'eur'`), то даже после округления число будет еще раз округлено до 2 знаков после запятой. @@ -246,7 +365,9 @@ numberToWordsRu.convert('129.6789', { **Примечание**: Если разделитель числа является дробной чертой ("`/`"), то число НЕ будет округлено в любом случае. -
+

+ +#### **`options.convertMinusSignToWord`** ``` convertMinusSignToWord: (Boolean) @@ -258,7 +379,9 @@ convertMinusSignToWord: (Boolean) true -
+

+ +#### **`options.showNumberParts`** ``` showNumberParts: (Object) @@ -295,7 +418,9 @@ numberToWordsRu.convert('123.45', { // 45 копеек ``` -
+

+ +#### **`options.convertNumbertToWords`** ``` convertNumbertToWords: (Object) @@ -332,7 +457,9 @@ numberToWordsRu.convert('123.45', { // 123 рубля сорок пять копеек ``` -
+

+ +#### **`options.showCurrency`** ``` showCurrency: (Object) @@ -369,7 +496,7 @@ numberToWordsRu.convert('123.45', { // Сто двадцать три 45 копеек ``` -
+

# Примеры From 0b6e79c530ecc560d37a77cde6d106ffe11082e3 Mon Sep 17 00:00:00 2001 From: Anton Moskovskiy <7397158+Ant1mas@users.noreply.github.com> Date: Mon, 8 Feb 2021 18:13:56 +0500 Subject: [PATCH 11/12] Packages updated --- package-lock.json | 2832 +++++++++++++++++++++++++++++---------------- package.json | 18 +- yarn.lock | 1485 ++++++++++++------------ 3 files changed, 2563 insertions(+), 1772 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3c4bfc3..9f601b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,25 +14,25 @@ } }, "@babel/compat-data": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", - "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.13.tgz", + "integrity": "sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg==", "dev": true }, "@babel/core": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.10.tgz", - "integrity": "sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helpers": "^7.12.5", - "@babel/parser": "^7.12.10", - "@babel/template": "^7.12.7", - "@babel/traverse": "^7.12.10", - "@babel/types": "^7.12.10", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.12.13.tgz", + "integrity": "sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helpers": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", @@ -42,58 +42,113 @@ "source-map": "^0.5.0" }, "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, "@babel/generator": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.10.tgz", - "integrity": "sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", "dev": true, "requires": { - "@babel/types": "^7.12.10", + "@babel/types": "^7.12.13", "jsesc": "^2.5.1", "source-map": "^0.5.0" } }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, "@babel/parser": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.10.tgz", - "integrity": "sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA==", + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", "dev": true }, "@babel/template": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", - "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/parser": "^7.12.7", - "@babel/types": "^7.12.7" + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" } }, "@babel/traverse": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.10.tgz", - "integrity": "sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", "dev": true, "requires": { - "@babel/code-frame": "^7.10.4", - "@babel/generator": "^7.12.10", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/parser": "^7.12.10", - "@babel/types": "^7.12.10", + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.19" } }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -112,12 +167,12 @@ } }, "@babel/helper-annotate-as-pure": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", - "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz", + "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.12.13" }, "dependencies": { "@babel/helper-validator-identifier": { @@ -127,9 +182,9 @@ "dev": true }, "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -140,68 +195,180 @@ } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", - "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz", + "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-explode-assignable-expression": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-compilation-targets": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", - "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.13.tgz", + "integrity": "sha512-dXof20y/6wB5HnLOGyLh/gobsMvDNoekcC+8MCV2iaTd5JemhFkPD73QB+tK3iFC9P0xJC73B6MvKkyUfS9cCw==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.5", - "@babel/helper-validator-option": "^7.12.1", + "@babel/compat-data": "^7.12.13", + "@babel/helper-validator-option": "^7.12.11", "browserslist": "^4.14.5", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz", - "integrity": "sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz", + "integrity": "sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", - "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.13.tgz", + "integrity": "sha512-XC+kiA0J3at6E85dL5UnCYfVOcIZ834QcAY0TIpgUVnz0zDzg+0TtvZTnJ4g9L1dPRGe30Qi03XCIS4tYCLtqw==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", "regexpu-core": "^4.7.1" } }, - "@babel/helper-define-map": { - "version": "7.10.5", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", - "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/types": "^7.10.5", - "lodash": "^4.17.19" - } - }, "@babel/helper-explode-assignable-expression": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", - "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz", + "integrity": "sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-function-name": { @@ -225,30 +392,55 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", - "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz", + "integrity": "sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw==", "dev": true, "requires": { - "@babel/types": "^7.10.4" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-member-expression-to-functions": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", - "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz", + "integrity": "sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ==", "dev": true, "requires": { - "@babel/types": "^7.12.7" + "@babel/types": "^7.12.13" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -256,47 +448,185 @@ } }, "@babel/helper-module-imports": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", - "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz", + "integrity": "sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g==", "dev": true, "requires": { - "@babel/types": "^7.12.5" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-module-transforms": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", - "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-simple-access": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.11.0", - "@babel/helper-validator-identifier": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.1", - "@babel/types": "^7.12.1", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz", + "integrity": "sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13", "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", - "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz", + "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==", "dev": true, "requires": { - "@babel/types": "^7.12.10" + "@babel/types": "^7.12.13" }, "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, "@babel/types": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.10.tgz", - "integrity": "sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-validator-identifier": "^7.12.11", "lodash": "^4.17.19", "to-fast-properties": "^2.0.0" } @@ -310,35 +640,186 @@ "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", - "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz", + "integrity": "sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-wrap-function": "^7.10.4", - "@babel/types": "^7.12.1" + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-wrap-function": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz", - "integrity": "sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz", + "integrity": "sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg==", "dev": true, "requires": { - "@babel/helper-member-expression-to-functions": "^7.12.1", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/helper-member-expression-to-functions": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-simple-access": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", - "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz", + "integrity": "sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA==", "dev": true, "requires": { - "@babel/types": "^7.12.1" + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -372,26 +853,252 @@ "dev": true }, "@babel/helper-wrap-function": { - "version": "7.12.3", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", - "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz", + "integrity": "sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.10.4", - "@babel/types": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/helpers": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", - "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.13.tgz", + "integrity": "sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ==", "dev": true, "requires": { - "@babel/template": "^7.10.4", - "@babel/traverse": "^7.12.5", - "@babel/types": "^7.12.5" + "@babel/template": "^7.12.13", + "@babel/traverse": "^7.12.13", + "@babel/types": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/generator": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.15.tgz", + "integrity": "sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/traverse": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.13.tgz", + "integrity": "sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/generator": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/highlight": { @@ -412,24 +1119,40 @@ "dev": true }, "@babel/plugin-proposal-async-generator-functions": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", - "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz", + "integrity": "sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-remap-async-to-generator": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-class-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz", - "integrity": "sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz", + "integrity": "sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-dynamic-import": { @@ -443,105 +1166,185 @@ } }, "@babel/plugin-proposal-export-namespace-from": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz", - "integrity": "sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz", + "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-json-strings": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", - "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz", + "integrity": "sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz", - "integrity": "sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz", + "integrity": "sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", - "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz", + "integrity": "sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-numeric-separator": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz", - "integrity": "sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz", + "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", - "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz", + "integrity": "sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-object-rest-spread": "^7.8.0", - "@babel/plugin-transform-parameters": "^7.12.1" + "@babel/plugin-transform-parameters": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", - "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz", + "integrity": "sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-optional-chaining": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", - "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz", + "integrity": "sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-private-methods": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz", - "integrity": "sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz", + "integrity": "sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-class-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", - "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz", + "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-syntax-async-generators": { @@ -671,344 +1474,746 @@ } }, "@babel/plugin-transform-arrow-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", - "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz", + "integrity": "sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", - "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz", + "integrity": "sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-remap-async-to-generator": "^7.12.1" + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-remap-async-to-generator": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", - "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz", + "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-block-scoping": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", - "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz", + "integrity": "sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-classes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", - "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz", + "integrity": "sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.10.4", - "@babel/helper-define-map": "^7.10.4", - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-optimise-call-expression": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1", - "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/helper-annotate-as-pure": "^7.12.13", + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-optimise-call-expression": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13", + "@babel/helper-split-export-declaration": "^7.12.13", "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz", + "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-computed-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", - "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz", + "integrity": "sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-destructuring": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", - "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz", + "integrity": "sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", - "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz", + "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", - "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz", + "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", - "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz", + "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-for-of": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", - "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz", + "integrity": "sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-function-name": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", - "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz", + "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.10.4", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-function-name": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz", + "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.12.13" + } + }, + "@babel/helper-function-name": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz", + "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.13", + "@babel/template": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz", + "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==", + "dev": true, + "requires": { + "@babel/types": "^7.12.13" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.12.13.tgz", + "integrity": "sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.12.15", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.15.tgz", + "integrity": "sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA==", + "dev": true + }, + "@babel/template": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz", + "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@babel/parser": "^7.12.13", + "@babel/types": "^7.12.13" + } + }, + "@babel/types": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + } } }, "@babel/plugin-transform-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", - "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz", + "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", - "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz", + "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-modules-amd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", - "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz", + "integrity": "sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", - "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz", + "integrity": "sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-simple-access": "^7.12.13", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", - "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz", + "integrity": "sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.10.4", - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-validator-identifier": "^7.10.4", + "@babel/helper-hoist-variables": "^7.12.13", + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-validator-identifier": "^7.12.11", "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", + "dev": true + } } }, "@babel/plugin-transform-modules-umd": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", - "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz", + "integrity": "sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-module-transforms": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", - "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz", + "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1" + "@babel/helper-create-regexp-features-plugin": "^7.12.13" } }, "@babel/plugin-transform-new-target": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", - "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz", + "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-object-super": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", - "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz", + "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-replace-supers": "^7.12.1" + "@babel/helper-plugin-utils": "^7.12.13", + "@babel/helper-replace-supers": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-parameters": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", - "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz", + "integrity": "sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", - "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz", + "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-regenerator": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", - "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz", + "integrity": "sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA==", "dev": true, "requires": { "regenerator-transform": "^0.14.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", - "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz", + "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", - "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz", + "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-spread": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", - "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz", + "integrity": "sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.12.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", - "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz", + "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-template-literals": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", - "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz", + "integrity": "sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.12.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", - "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz", + "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz", - "integrity": "sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz", + "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.12.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", - "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz", + "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.12.1", - "@babel/helper-plugin-utils": "^7.10.4" + "@babel/helper-create-regexp-features-plugin": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + } } }, "@babel/preset-env": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.11.tgz", - "integrity": "sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.12.13.tgz", + "integrity": "sha512-JUVlizG8SoFTz4LmVUL8++aVwzwxcvey3N0j1tRbMAXVEy95uQ/cnEkmEKHN00Bwq4voAV3imQGnQvpkLAxsrw==", "dev": true, "requires": { - "@babel/compat-data": "^7.12.7", - "@babel/helper-compilation-targets": "^7.12.5", - "@babel/helper-module-imports": "^7.12.5", - "@babel/helper-plugin-utils": "^7.10.4", + "@babel/compat-data": "^7.12.13", + "@babel/helper-compilation-targets": "^7.12.13", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.12.13", "@babel/helper-validator-option": "^7.12.11", - "@babel/plugin-proposal-async-generator-functions": "^7.12.1", - "@babel/plugin-proposal-class-properties": "^7.12.1", + "@babel/plugin-proposal-async-generator-functions": "^7.12.13", + "@babel/plugin-proposal-class-properties": "^7.12.13", "@babel/plugin-proposal-dynamic-import": "^7.12.1", - "@babel/plugin-proposal-export-namespace-from": "^7.12.1", - "@babel/plugin-proposal-json-strings": "^7.12.1", - "@babel/plugin-proposal-logical-assignment-operators": "^7.12.1", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.1", - "@babel/plugin-proposal-numeric-separator": "^7.12.7", - "@babel/plugin-proposal-object-rest-spread": "^7.12.1", - "@babel/plugin-proposal-optional-catch-binding": "^7.12.1", - "@babel/plugin-proposal-optional-chaining": "^7.12.7", - "@babel/plugin-proposal-private-methods": "^7.12.1", - "@babel/plugin-proposal-unicode-property-regex": "^7.12.1", + "@babel/plugin-proposal-export-namespace-from": "^7.12.13", + "@babel/plugin-proposal-json-strings": "^7.12.13", + "@babel/plugin-proposal-logical-assignment-operators": "^7.12.13", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.12.13", + "@babel/plugin-proposal-numeric-separator": "^7.12.13", + "@babel/plugin-proposal-object-rest-spread": "^7.12.13", + "@babel/plugin-proposal-optional-catch-binding": "^7.12.13", + "@babel/plugin-proposal-optional-chaining": "^7.12.13", + "@babel/plugin-proposal-private-methods": "^7.12.13", + "@babel/plugin-proposal-unicode-property-regex": "^7.12.13", "@babel/plugin-syntax-async-generators": "^7.8.0", - "@babel/plugin-syntax-class-properties": "^7.12.1", + "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-dynamic-import": "^7.8.0", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.0", @@ -1018,55 +2223,79 @@ "@babel/plugin-syntax-object-rest-spread": "^7.8.0", "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/plugin-syntax-top-level-await": "^7.12.1", - "@babel/plugin-transform-arrow-functions": "^7.12.1", - "@babel/plugin-transform-async-to-generator": "^7.12.1", - "@babel/plugin-transform-block-scoped-functions": "^7.12.1", - "@babel/plugin-transform-block-scoping": "^7.12.11", - "@babel/plugin-transform-classes": "^7.12.1", - "@babel/plugin-transform-computed-properties": "^7.12.1", - "@babel/plugin-transform-destructuring": "^7.12.1", - "@babel/plugin-transform-dotall-regex": "^7.12.1", - "@babel/plugin-transform-duplicate-keys": "^7.12.1", - "@babel/plugin-transform-exponentiation-operator": "^7.12.1", - "@babel/plugin-transform-for-of": "^7.12.1", - "@babel/plugin-transform-function-name": "^7.12.1", - "@babel/plugin-transform-literals": "^7.12.1", - "@babel/plugin-transform-member-expression-literals": "^7.12.1", - "@babel/plugin-transform-modules-amd": "^7.12.1", - "@babel/plugin-transform-modules-commonjs": "^7.12.1", - "@babel/plugin-transform-modules-systemjs": "^7.12.1", - "@babel/plugin-transform-modules-umd": "^7.12.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.1", - "@babel/plugin-transform-new-target": "^7.12.1", - "@babel/plugin-transform-object-super": "^7.12.1", - "@babel/plugin-transform-parameters": "^7.12.1", - "@babel/plugin-transform-property-literals": "^7.12.1", - "@babel/plugin-transform-regenerator": "^7.12.1", - "@babel/plugin-transform-reserved-words": "^7.12.1", - "@babel/plugin-transform-shorthand-properties": "^7.12.1", - "@babel/plugin-transform-spread": "^7.12.1", - "@babel/plugin-transform-sticky-regex": "^7.12.7", - "@babel/plugin-transform-template-literals": "^7.12.1", - "@babel/plugin-transform-typeof-symbol": "^7.12.10", - "@babel/plugin-transform-unicode-escapes": "^7.12.1", - "@babel/plugin-transform-unicode-regex": "^7.12.1", + "@babel/plugin-syntax-top-level-await": "^7.12.13", + "@babel/plugin-transform-arrow-functions": "^7.12.13", + "@babel/plugin-transform-async-to-generator": "^7.12.13", + "@babel/plugin-transform-block-scoped-functions": "^7.12.13", + "@babel/plugin-transform-block-scoping": "^7.12.13", + "@babel/plugin-transform-classes": "^7.12.13", + "@babel/plugin-transform-computed-properties": "^7.12.13", + "@babel/plugin-transform-destructuring": "^7.12.13", + "@babel/plugin-transform-dotall-regex": "^7.12.13", + "@babel/plugin-transform-duplicate-keys": "^7.12.13", + "@babel/plugin-transform-exponentiation-operator": "^7.12.13", + "@babel/plugin-transform-for-of": "^7.12.13", + "@babel/plugin-transform-function-name": "^7.12.13", + "@babel/plugin-transform-literals": "^7.12.13", + "@babel/plugin-transform-member-expression-literals": "^7.12.13", + "@babel/plugin-transform-modules-amd": "^7.12.13", + "@babel/plugin-transform-modules-commonjs": "^7.12.13", + "@babel/plugin-transform-modules-systemjs": "^7.12.13", + "@babel/plugin-transform-modules-umd": "^7.12.13", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13", + "@babel/plugin-transform-new-target": "^7.12.13", + "@babel/plugin-transform-object-super": "^7.12.13", + "@babel/plugin-transform-parameters": "^7.12.13", + "@babel/plugin-transform-property-literals": "^7.12.13", + "@babel/plugin-transform-regenerator": "^7.12.13", + "@babel/plugin-transform-reserved-words": "^7.12.13", + "@babel/plugin-transform-shorthand-properties": "^7.12.13", + "@babel/plugin-transform-spread": "^7.12.13", + "@babel/plugin-transform-sticky-regex": "^7.12.13", + "@babel/plugin-transform-template-literals": "^7.12.13", + "@babel/plugin-transform-typeof-symbol": "^7.12.13", + "@babel/plugin-transform-unicode-escapes": "^7.12.13", + "@babel/plugin-transform-unicode-regex": "^7.12.13", "@babel/preset-modules": "^0.1.3", - "@babel/types": "^7.12.11", + "@babel/types": "^7.12.13", "core-js-compat": "^3.8.0", "semver": "^5.5.0" }, "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz", + "integrity": "sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA==", + "dev": true + }, "@babel/helper-validator-identifier": { "version": "7.12.11", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==", "dev": true }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz", + "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, "@babel/types": { - "version": "7.12.12", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", - "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.13.tgz", + "integrity": "sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.12.11", @@ -1090,9 +2319,9 @@ } }, "@babel/runtime": { - "version": "7.12.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", - "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.13.tgz", + "integrity": "sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==", "dev": true, "requires": { "regenerator-runtime": "^0.13.4" @@ -1153,6 +2382,12 @@ "minimist": "^1.2.0" } }, + "@discoveryjs/json-ext": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz", + "integrity": "sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==", + "dev": true + }, "@eslint/eslintrc": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.3.0.tgz", @@ -1814,9 +3049,9 @@ } }, "@types/estree": { - "version": "0.0.45", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.45.tgz", - "integrity": "sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g==", + "version": "0.0.46", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz", + "integrity": "sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==", "dev": true }, "@types/glob": { @@ -1897,9 +3132,9 @@ "dev": true }, "@types/lodash": { - "version": "4.14.167", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.167.tgz", - "integrity": "sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw==", + "version": "4.14.168", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.168.tgz", + "integrity": "sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q==", "dev": true }, "@types/minimatch": { @@ -2169,6 +3404,27 @@ "@xtuc/long": "4.2.2" } }, + "@webpack-cli/configtest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", + "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "dev": true + }, + "@webpack-cli/info": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", + "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "dev": true, + "requires": { + "envinfo": "^7.7.3" + } + }, + "@webpack-cli/serve": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", + "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "dev": true + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -3345,15 +4601,46 @@ "dev": true }, "core-js-compat": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.1.tgz", - "integrity": "sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.3.tgz", + "integrity": "sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog==", "dev": true, "requires": { - "browserslist": "^4.15.0", + "browserslist": "^4.16.1", "semver": "7.0.0" }, "dependencies": { + "browserslist": { + "version": "4.16.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz", + "integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001181", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.649", + "escalade": "^3.1.1", + "node-releases": "^1.1.70" + } + }, + "caniuse-lite": { + "version": "1.0.30001185", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz", + "integrity": "sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg==", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.657", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.657.tgz", + "integrity": "sha512-/9ROOyvEflEbaZFUeGofD+Tqs/WynbSTbNgNF+/TJJxH1ePD/e6VjZlDJpW3FFFd3nj5l3Hd8ki2vRwy+gyRFw==", + "dev": true + }, + "node-releases": { + "version": "1.1.70", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.70.tgz", + "integrity": "sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw==", + "dev": true + }, "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", @@ -3586,12 +4873,6 @@ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", "dev": true }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3807,9 +5088,15 @@ } }, "entities": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", - "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "envinfo": { + "version": "7.7.4", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.7.4.tgz", + "integrity": "sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ==", "dev": true }, "errno": { @@ -3830,43 +5117,12 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.18.0-next.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz", - "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.2.2", - "is-negative-zero": "^2.0.0", - "is-regex": "^1.1.1", - "object-inspect": "^1.8.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.1", - "string.prototype.trimend": "^1.0.1", - "string.prototype.trimstart": "^1.0.1" - } - }, "es-module-lexer": { "version": "0.3.26", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.3.26.tgz", "integrity": "sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA==", "dev": true }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -3947,9 +5203,9 @@ } }, "eslint": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.18.0.tgz", - "integrity": "sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ==", + "version": "7.19.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.19.0.tgz", + "integrity": "sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -4125,9 +5381,9 @@ "dev": true }, "esquery": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz", - "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -4319,15 +5575,6 @@ } } }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, "expect": { "version": "26.6.2", "resolved": "https://registry.npmjs.org/expect/-/expect-26.6.2.tgz", @@ -4551,6 +5798,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fastest-levenshtein": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", + "dev": true + }, "faye-websocket": { "version": "0.11.3", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", @@ -4684,123 +5937,6 @@ "locate-path": "^3.0.0" } }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -4823,9 +5959,9 @@ } }, "flatted": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.0.tgz", - "integrity": "sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.1.1.tgz", + "integrity": "sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA==", "dev": true }, "follow-redirects": { @@ -4985,61 +6121,6 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, - "global-modules": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", - "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", - "dev": true, - "requires": { - "global-prefix": "^3.0.0" - }, - "dependencies": { - "global-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", - "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", - "dev": true, - "requires": { - "ini": "^1.3.5", - "kind-of": "^6.0.2", - "which": "^1.3.1" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -5181,15 +6262,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, "hosted-git-info": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", @@ -5271,20 +6343,36 @@ } }, "html-webpack-plugin": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.5.1.tgz", - "integrity": "sha512-yzK7RQZwv9xB+pcdHNTjcqbaaDZ+5L0zJHXfi89iWIZmb/FtzxhLk0635rmJihcQbs3ZUF27Xp4oWGx6EK56zg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.0.0.tgz", + "integrity": "sha512-kxTyb8cyZwEyUqXTgdHRUOF4C7uCrquzw2T+YTudehm/yspodgCkREjdmc4dXI8k2P4NEjqOVbnOOlPZg4TKJA==", "dev": true, "requires": { "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", + "loader-utils": "^2.0.0", "lodash": "^4.17.20", "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" + "tapable": "^2.0.0" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "tapable": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", + "dev": true + } } }, "htmlparser2": { @@ -5589,12 +6677,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "internal-ip": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", @@ -5606,9 +6688,9 @@ } }, "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", "dev": true }, "ip": { @@ -5685,12 +6767,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", - "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", - "dev": true - }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -5794,12 +6870,6 @@ "is-extglob": "^2.1.1" } }, - "is-negative-zero": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", - "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -5860,15 +6930,6 @@ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -7329,9 +8390,9 @@ "dev": true }, "json5": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", - "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", "dev": true, "requires": { "minimist": "^1.2.5" @@ -7884,12 +8945,6 @@ } } }, - "object-inspect": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", - "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", - "dev": true - }, "object-is": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", @@ -7927,17 +8982,6 @@ "object-keys": "^1.1.1" } }, - "object.getownpropertydescriptors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", - "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3", - "es-abstract": "^1.18.0-next.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -8116,12 +9160,6 @@ "lines-and-columns": "^1.1.6" } }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, "parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", @@ -8670,6 +9708,15 @@ } } }, + "rechoir": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz", + "integrity": "sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==", + "dev": true, + "requires": { + "resolve": "^1.9.0" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -8770,9 +9817,9 @@ "dev": true }, "regjsparser": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", - "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.7.tgz", + "integrity": "sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ==", "dev": true, "requires": { "jsesc": "~0.5.0" @@ -8969,29 +10016,6 @@ } } }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "dependencies": { - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - } - } - }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", @@ -9878,26 +10902,6 @@ } } }, - "string.prototype.trimend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", - "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, - "string.prototype.trimstart": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", - "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "define-properties": "^1.1.3" - } - }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -10003,9 +11007,9 @@ }, "dependencies": { "ajv": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.3.tgz", - "integrity": "sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-7.0.4.tgz", + "integrity": "sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -10262,9 +11266,9 @@ } }, "ts-loader": { - "version": "8.0.14", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.14.tgz", - "integrity": "sha512-Jt/hHlUnApOZjnSjTmZ+AbD5BGlQFx3f1D0nYuNKwz0JJnuDGHJas6az+FlWKwwRTu+26GXpv249A8UAnYUpqA==", + "version": "8.0.15", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.0.15.tgz", + "integrity": "sha512-WYXfCEglgUPU6adGcx6I9DsMwSxYFU99rzteIEoZKDQn4IMbe4KpO934zRkwSOFcwEzh+gx/RaH8hhgoCAfF9w==", "dev": true, "requires": { "chalk": "^4.1.0", @@ -10559,16 +11563,6 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", "dev": true }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -10668,9 +11662,9 @@ } }, "watchpack": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.0.tgz", - "integrity": "sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz", + "integrity": "sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -10693,13 +11687,13 @@ "dev": true }, "webpack": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.15.0.tgz", - "integrity": "sha512-y/xG+ONDz78yn3VvP6gAvGr1/gkxOgitvHSXBmquyN8KDtrGEyE3K9WkXOPB7QmfcOBCpO4ELXwNcCYQnEmexA==", + "version": "5.21.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.21.2.tgz", + "integrity": "sha512-xHflCenx+AM4uWKX71SWHhxml5aMXdy2tu/vdi4lClm7PADKxlyDAFFN1rEFzNV0MAoPpHtBeJnl/+K6F4QBPg==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.0", - "@types/estree": "^0.0.45", + "@types/estree": "^0.0.46", "@webassemblyjs/ast": "1.11.0", "@webassemblyjs/wasm-edit": "1.11.0", "@webassemblyjs/wasm-parser": "1.11.0", @@ -10716,7 +11710,6 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "pkg-dir": "^5.0.0", "schema-utils": "^3.0.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.1.1", @@ -10725,9 +11718,9 @@ }, "dependencies": { "acorn": { - "version": "8.0.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.4.tgz", - "integrity": "sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.0.5.tgz", + "integrity": "sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg==", "dev": true }, "enhanced-resolve": { @@ -10740,58 +11733,6 @@ "tapable": "^2.2.0" } }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "pkg-dir": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", - "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", - "dev": true, - "requires": { - "find-up": "^5.0.0" - } - }, "schema-utils": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", @@ -10812,164 +11753,75 @@ } }, "webpack-cli": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", - "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", + "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", "dev": true, "requires": { - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "enhanced-resolve": "^4.1.1", - "findup-sync": "^3.0.0", - "global-modules": "^2.0.0", - "import-local": "^2.0.0", - "interpret": "^1.4.0", - "loader-utils": "^1.4.0", - "supports-color": "^6.1.0", - "v8-compile-cache": "^2.1.1", - "yargs": "^13.3.2" + "@discoveryjs/json-ext": "^0.5.0", + "@webpack-cli/configtest": "^1.0.1", + "@webpack-cli/info": "^1.2.2", + "@webpack-cli/serve": "^1.3.0", + "colorette": "^1.2.1", + "commander": "^7.0.0", + "enquirer": "^2.3.6", + "execa": "^5.0.0", + "fastest-levenshtein": "^1.0.12", + "import-local": "^3.0.2", + "interpret": "^2.2.0", + "rechoir": "^0.7.0", + "v8-compile-cache": "^2.2.0", + "webpack-merge": "^5.7.3" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "commander": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.0.0.tgz", + "integrity": "sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA==", "dev": true }, - "cliui": { + "execa": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", - "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", - "dev": true, - "requires": { - "string-width": "^3.1.0", - "strip-ansi": "^5.2.0", - "wrap-ansi": "^5.1.0" - } - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "import-local": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", - "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", "dev": true, "requires": { - "pkg-dir": "^3.0.0", - "resolve-cwd": "^2.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" } }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "get-stream": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", + "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", "dev": true }, - "resolve-cwd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", - "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", - "dev": true, - "requires": { - "resolve-from": "^3.0.0" - } - }, - "resolve-from": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", "dev": true }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", - "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "string-width": "^3.0.0", - "strip-ansi": "^5.0.0" - } - }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "path-key": "^3.0.0" } } } diff --git a/package.json b/package.json index c8fa9ac..8fca4c0 100644 --- a/package.json +++ b/package.json @@ -9,26 +9,26 @@ "main": "dist/bundle.js", "types": "index.d.ts", "scripts": { - "dev": "webpack-dev-server --config ./webpack/webpack.dev.js --hot", + "dev": "webpack serve --config ./webpack/webpack.dev.js --hot", "build": "webpack --config ./webpack/webpack.prod.js", "test": "jest" }, "devDependencies": { - "@babel/core": "^7.12.10", - "@babel/preset-env": "^7.12.11", + "@babel/core": "^7.12.13", + "@babel/preset-env": "^7.12.13", "@types/html-webpack-plugin": "^3.2.3", - "@types/lodash": "^4.14.167", + "@types/lodash": "^4.14.168", "babel-loader": "^8.2.2", "clean-webpack-plugin": "^3.0.0", - "eslint": "^7.18.0", + "eslint": "^7.19.0", "eslint-config-google": "^0.14.0", - "html-webpack-plugin": "^4.5.1", + "html-webpack-plugin": "^5.0.0", "jest": "^26.0.1", "lodash": "^4.17.20", - "ts-loader": "^8.0.14", + "ts-loader": "^8.0.15", "typescript": "^4.1.3", - "webpack": "^5.15.0", - "webpack-cli": "^3.3.12", + "webpack": "^5.21.2", + "webpack-cli": "^4.5.0", "webpack-dev-server": "^3.11.2", "webpack-merge": "^5.7.3" }, diff --git a/yarn.lock b/yarn.lock index 19cc482..f401b68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9,24 +9,31 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/compat-data@^7.12.5", "@babel/compat-data@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.7.tgz#9329b4782a7d6bbd7eef57e11addf91ee3ef1e41" - integrity sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw== - -"@babel/core@^7.1.0", "@babel/core@^7.12.10", "@babel/core@^7.7.5": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" - integrity sha512-eTAlQKq65zHfkHZV0sIVODCPGVgoo1HdBlbSLi9CqOzuZanMv2ihzY+4paiKr1mH+XmYESMAmJ/dpZ68eN6d8w== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helpers" "^7.12.5" - "@babel/parser" "^7.12.10" - "@babel/template" "^7.12.7" - "@babel/traverse" "^7.12.10" - "@babel/types" "^7.12.10" +"@babel/code-frame@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.12.13.tgz#dcfc826beef65e75c50e21d3837d7d95798dd658" + integrity sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g== + dependencies: + "@babel/highlight" "^7.12.13" + +"@babel/compat-data@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.13.tgz#27e19e0ed3726ccf54067ced4109501765e7e2e8" + integrity sha512-U/hshG5R+SIoW7HVWIdmy1cB7s3ki+r3FpyEZiCgpi4tFgPnX/vynY80ZGSASOIrUM6O7VxOgCZgdt7h97bUGg== + +"@babel/core@^7.1.0", "@babel/core@^7.12.13", "@babel/core@^7.7.5": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.13.tgz#b73a87a3a3e7d142a66248bf6ad88b9ceb093425" + integrity sha512-BQKE9kXkPlXHPeqissfxo0lySWJcYdEP0hdtJOH/iJfDdhOCcgtNCjftCJg3qqauB4h+lz2N6ixM++b9DN1Tcw== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helpers" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.1" @@ -35,12 +42,12 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.10.tgz#2b188fc329fb8e4f762181703beffc0fe6df3460" - integrity sha512-6mCdfhWgmqLdtTkhXjnIz0LcdVCd26wS2JXRtj2XY0u5klDsXBREA/pG5NVOuVnF2LUrBGNFtQkIqqTbblg0ww== +"@babel/generator@^7.12.13": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.12.15.tgz#4617b5d0b25cc572474cc1aafee1edeaf9b5368f" + integrity sha512-6F2xHxBiFXWNSGb7vyCUTBF8RCLY66rS0zEPcP8t/nQyXjha5EuK4z7H5o7fWG8B4M7y6mqVWq1J+1PuwRhecQ== dependencies: - "@babel/types" "^7.12.10" + "@babel/types" "^7.12.13" jsesc "^2.5.1" source-map "^0.5.0" @@ -53,65 +60,56 @@ jsesc "^2.5.1" source-map "^0.5.0" -"@babel/helper-annotate-as-pure@^7.10.4": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz#54ab9b000e60a93644ce17b3f37d313aaf1d115d" - integrity sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ== +"@babel/helper-annotate-as-pure@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz#0f58e86dfc4bb3b1fcd7db806570e177d439b6ab" + integrity sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw== dependencies: - "@babel/types" "^7.12.10" + "@babel/types" "^7.12.13" -"@babel/helper-builder-binary-assignment-operator-visitor@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz#bb0b75f31bf98cbf9ff143c1ae578b87274ae1a3" - integrity sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz#6bc20361c88b0a74d05137a65cac8d3cbf6f61fc" + integrity sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA== dependencies: - "@babel/helper-explode-assignable-expression" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-explode-assignable-expression" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-compilation-targets@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz#cb470c76198db6a24e9dbc8987275631e5d29831" - integrity sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw== +"@babel/helper-compilation-targets@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.13.tgz#d689cdef88810aa74e15a7a94186f26a3d773c98" + integrity sha512-dXof20y/6wB5HnLOGyLh/gobsMvDNoekcC+8MCV2iaTd5JemhFkPD73QB+tK3iFC9P0xJC73B6MvKkyUfS9cCw== dependencies: - "@babel/compat-data" "^7.12.5" - "@babel/helper-validator-option" "^7.12.1" + "@babel/compat-data" "^7.12.13" + "@babel/helper-validator-option" "^7.12.11" browserslist "^4.14.5" semver "^5.5.0" -"@babel/helper-create-class-features-plugin@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.1.tgz#3c45998f431edd4a9214c5f1d3ad1448a6137f6e" - integrity sha512-hkL++rWeta/OVOBTRJc9a5Azh5mt5WgZUGAKMD8JM141YsE08K//bp1unBBieO6rUKkIPyUE0USQ30jAy3Sk1w== +"@babel/helper-create-class-features-plugin@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.12.13.tgz#0f1707c2eec1a4604f2a22a6fb209854ef2a399a" + integrity sha512-Vs/e9wv7rakKYeywsmEBSRC9KtmE7Px+YBlESekLeJOF0zbGUicGfXSNi3o+tfXSNS48U/7K9mIOOCR79Cl3+Q== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" -"@babel/helper-create-regexp-features-plugin@^7.12.1": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz#2084172e95443fa0a09214ba1bb328f9aea1278f" - integrity sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ== +"@babel/helper-create-regexp-features-plugin@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.13.tgz#0996d370a92896c612ae41a4215544bd152579c0" + integrity sha512-XC+kiA0J3at6E85dL5UnCYfVOcIZ834QcAY0TIpgUVnz0zDzg+0TtvZTnJ4g9L1dPRGe30Qi03XCIS4tYCLtqw== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.12.13" regexpu-core "^4.7.1" -"@babel/helper-define-map@^7.10.4": - version "7.10.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz#b53c10db78a640800152692b13393147acb9bb30" - integrity sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ== +"@babel/helper-explode-assignable-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.13.tgz#0e46990da9e271502f77507efa4c9918d3d8634a" + integrity sha512-5loeRNvMo9mx1dA/d6yNi+YiKziJZFylZnCo1nmFF4qPU4yJ14abhWESuSMQSlQxWdxdOFzxXjk/PpfudTtYyw== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/types" "^7.10.5" - lodash "^4.17.19" - -"@babel/helper-explode-assignable-expression@^7.10.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz#8006a466695c4ad86a2a5f2fb15b5f2c31ad5633" - integrity sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA== - dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.13" "@babel/helper-function-name@^7.10.4": version "7.10.4" @@ -122,6 +120,15 @@ "@babel/template" "^7.10.4" "@babel/types" "^7.10.4" +"@babel/helper-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz#93ad656db3c3c2232559fd7b2c3dbdcbe0eb377a" + integrity sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA== + dependencies: + "@babel/helper-get-function-arity" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/types" "^7.12.13" + "@babel/helper-get-function-arity@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz#98c1cbea0e2332f33f9a4661b8ce1505b2c19ba2" @@ -129,79 +136,91 @@ dependencies: "@babel/types" "^7.10.4" -"@babel/helper-hoist-variables@^7.10.4": - version "7.10.4" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz#d49b001d1d5a68ca5e6604dda01a6297f7c9381e" - integrity sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA== +"@babel/helper-get-function-arity@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz#bc63451d403a3b3082b97e1d8b3fe5bd4091e583" + integrity sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg== dependencies: - "@babel/types" "^7.10.4" + "@babel/types" "^7.12.13" -"@babel/helper-member-expression-to-functions@^7.12.1": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz#aa77bd0396ec8114e5e30787efa78599d874a855" - integrity sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw== +"@babel/helper-hoist-variables@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.12.13.tgz#13aba58b7480b502362316ea02f52cca0e9796cd" + integrity sha512-KSC5XSj5HreRhYQtZ3cnSnQwDzgnbdUDEFsxkN0m6Q3WrCRt72xrnZ8+h+pX7YxM7hr87zIO3a/v5p/H3TrnVw== dependencies: - "@babel/types" "^7.12.7" + "@babel/types" "^7.12.13" -"@babel/helper-module-imports@^7.12.1", "@babel/helper-module-imports@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz#1bfc0229f794988f76ed0a4d4e90860850b54dfb" - integrity sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA== +"@babel/helper-member-expression-to-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.13.tgz#c5715695b4f8bab32660dbdcdc2341dec7e3df40" + integrity sha512-B+7nN0gIL8FZ8SvMcF+EPyB21KnCcZHQZFczCxbiNGV/O0rsrSBlWGLzmtBJ3GMjSVMIm4lpFhR+VdVBuIsUcQ== dependencies: - "@babel/types" "^7.12.5" + "@babel/types" "^7.12.13" -"@babel/helper-module-transforms@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" - integrity sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w== +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-simple-access" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/helper-validator-identifier" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.1" - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.13" + +"@babel/helper-module-transforms@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.13.tgz#01afb052dcad2044289b7b20beb3fa8bd0265bea" + integrity sha512-acKF7EjqOR67ASIlDTupwkKM1eUisNAjaSduo5Cz+793ikfnpe7p4Q7B7EWU2PCoSTPWsQkR7hRUWEIZPiVLGA== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" lodash "^4.17.19" -"@babel/helper-optimise-call-expression@^7.10.4": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz#94ca4e306ee11a7dd6e9f42823e2ac6b49881e2d" - integrity sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ== +"@babel/helper-optimise-call-expression@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" + integrity sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA== dependencies: - "@babel/types" "^7.12.10" + "@babel/types" "^7.12.13" "@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz#2f75a831269d4f677de49986dff59927533cf375" integrity sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg== -"@babel/helper-remap-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz#8c4dbbf916314f6047dc05e6a2217074238347fd" - integrity sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A== +"@babel/helper-plugin-utils@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.12.13.tgz#174254d0f2424d8aefb4dd48057511247b0a9eeb" + integrity sha512-C+10MXCXJLiR6IeG9+Wiejt9jmtFpxUc3MQqCmPY8hfCjyUGl9kT+B2okzEZrtykiwrc4dbCPdDoz0A/HQbDaA== + +"@babel/helper-remap-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.13.tgz#170365f4140e2d20e5c88f8ba23c24468c296878" + integrity sha512-Qa6PU9vNcj1NZacZZI1Mvwt+gXDH6CTfgAkSjeRMLE8HxtDK76+YDId6NQR+z7Rgd5arhD2cIbS74r0SxD6PDA== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-wrap-function" "^7.10.4" - "@babel/types" "^7.12.1" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-wrap-function" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-replace-supers@^7.12.1": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.5.tgz#f009a17543bbbbce16b06206ae73b63d3fca68d9" - integrity sha512-5YILoed0ZyIpF4gKcpZitEnXEJ9UoDRki1Ey6xz46rxOzfNMAhVIJMoune1hmPVxh40LRv1+oafz7UsWX+vyWA== +"@babel/helper-replace-supers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.12.13.tgz#00ec4fb6862546bd3d0aff9aac56074277173121" + integrity sha512-pctAOIAMVStI2TMLhozPKbf5yTEXc0OJa0eENheb4w09SrgOWEs+P4nTOZYJQCqs8JlErGLDPDJTiGIp3ygbLg== dependencies: - "@babel/helper-member-expression-to-functions" "^7.12.1" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/helper-member-expression-to-functions" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helper-simple-access@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz#32427e5aa61547d38eb1e6eaf5fd1426fdad9136" - integrity sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA== +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== dependencies: - "@babel/types" "^7.12.1" + "@babel/types" "^7.12.13" "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" @@ -210,13 +229,20 @@ dependencies: "@babel/types" "^7.12.1" -"@babel/helper-split-export-declaration@^7.10.4", "@babel/helper-split-export-declaration@^7.11.0": +"@babel/helper-split-export-declaration@^7.11.0": version "7.11.0" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.11.0.tgz#f8a491244acf6a676158ac42072911ba83ad099f" integrity sha512-74Vejvp6mHkGE+m+k5vHY93FX2cAtrw1zXrZXRlG4l410Nm9PxfEiVTn1PjDPV5SnmieiueY4AFg2xqhNFuuZg== dependencies: "@babel/types" "^7.11.0" +"@babel/helper-split-export-declaration@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz#e9430be00baf3e88b0e13e6f9d4eaf2136372b05" + integrity sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-validator-identifier@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz#a78c7a7251e01f616512d31b10adcf52ada5e0d2" @@ -227,29 +253,29 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz#c9a1f021917dcb5ccf0d4e453e399022981fc9ed" integrity sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw== -"@babel/helper-validator-option@^7.12.1", "@babel/helper-validator-option@^7.12.11": +"@babel/helper-validator-option@^7.12.11": version "7.12.11" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz#d66cb8b7a3e7fe4c6962b32020a131ecf0847f4f" integrity sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw== -"@babel/helper-wrap-function@^7.10.4": - version "7.12.3" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz#3332339fc4d1fbbf1c27d7958c27d34708e990d9" - integrity sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow== +"@babel/helper-wrap-function@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.12.13.tgz#e3ea8cb3ee0a16911f9c1b50d9e99fe8fe30f9ff" + integrity sha512-t0aZFEmBJ1LojdtJnhOaQEVejnzYhyjWHSsNSNo8vOYRbAJNh6r6GQF7pd36SqG7OKGbn+AewVQ/0IfYfIuGdw== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.10.4" - "@babel/types" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/helpers@^7.12.5": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.5.tgz#1a1ba4a768d9b58310eda516c449913fe647116e" - integrity sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA== +"@babel/helpers@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.12.13.tgz#3c75e993632e4dadc0274eae219c73eb7645ba47" + integrity sha512-oohVzLRZ3GQEk4Cjhfs9YkJA4TdIDTObdBEZGrd6F/T0GPSnuV6l22eMcxlvcvzVIPH3VTtxbseudM1zIE+rPQ== dependencies: - "@babel/template" "^7.10.4" - "@babel/traverse" "^7.12.5" - "@babel/types" "^7.12.5" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.12.13" + "@babel/types" "^7.12.13" "@babel/highlight@^7.10.4": version "7.10.4" @@ -260,32 +286,41 @@ chalk "^2.0.0" js-tokens "^4.0.0" +"@babel/highlight@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.12.13.tgz#8ab538393e00370b26271b01fa08f7f27f2e795c" + integrity sha512-kocDQvIbgMKlWxXe9fof3TQ+gkIPOUSEYhJjqUjvKMez3krV7vbzYCDq39Oj11UAVK7JqPVGQPlgE85dPNlQww== + dependencies: + "@babel/helper-validator-identifier" "^7.12.11" + chalk "^2.0.0" + js-tokens "^4.0.0" + "@babel/parser@^7.1.0", "@babel/parser@^7.10.4", "@babel/parser@^7.12.5": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.5.tgz#b4af32ddd473c0bfa643bd7ff0728b8e71b81ea0" integrity sha512-FVM6RZQ0mn2KCf1VUED7KepYeUWoVShczewOCfm3nzoBybaih51h+sYVVGthW9M6lPByEPTQf+xm27PBdlpwmQ== -"@babel/parser@^7.12.10", "@babel/parser@^7.12.7": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.10.tgz#824600d59e96aea26a5a2af5a9d812af05c3ae81" - integrity sha512-PJdRPwyoOqFAWfLytxrWwGrAxghCgh/yTNCYciOz8QgjflA7aZhECPZAa2VUedKg2+QMWkI0L9lynh2SNmNEgA== +"@babel/parser@^7.12.13": + version "7.12.15" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.12.15.tgz#2b20de7f0b4b332d9b119dd9c33409c538b8aacf" + integrity sha512-AQBOU2Z9kWwSZMd6lNjCX0GUgFonL1wAM1db8L8PMk9UDaGsRCArBkU4Sc+UCM3AE4hjbXx+h58Lb3QT4oRmrA== -"@babel/plugin-proposal-async-generator-functions@^7.12.1": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz#04b8f24fd4532008ab4e79f788468fd5a8476566" - integrity sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A== +"@babel/plugin-proposal-async-generator-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.13.tgz#d1c6d841802ffb88c64a2413e311f7345b9e66b5" + integrity sha512-1KH46Hx4WqP77f978+5Ye/VUbuwQld2hph70yaw2hXS2v7ER2f3nlpNMu909HO2rbvP0NKLlMVDPh9KXklVMhA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" "@babel/plugin-syntax-async-generators" "^7.8.0" -"@babel/plugin-proposal-class-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.1.tgz#a082ff541f2a29a4821065b8add9346c0c16e5de" - integrity sha512-cKp3dlQsFsEs5CWKnN7BnSHOd0EOW8EKpEjkoz1pO2E5KzIDNV9Ros1b0CnmbVgAGXJubOYVBOGCT1OmJwOI7w== +"@babel/plugin-proposal-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.12.13.tgz#3d2ce350367058033c93c098e348161d6dc0d8c8" + integrity sha512-8SCJ0Ddrpwv4T7Gwb33EmW1V9PY5lggTO+A8WjyIwxrSHDUyBw4MtF96ifn1n8H806YlxbVCoKXbbmzD6RD+cA== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-proposal-dynamic-import@^7.12.1": version "7.12.1" @@ -295,87 +330,87 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-dynamic-import" "^7.8.0" -"@babel/plugin-proposal-export-namespace-from@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.1.tgz#8b9b8f376b2d88f5dd774e4d24a5cc2e3679b6d4" - integrity sha512-6CThGf0irEkzujYS5LQcjBx8j/4aQGiVv7J9+2f7pGfxqyKh3WnmVJYW3hdrQjyksErMGBPQrCnHfOtna+WLbw== +"@babel/plugin-proposal-export-namespace-from@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz#393be47a4acd03fa2af6e3cde9b06e33de1b446d" + integrity sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-proposal-json-strings@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz#d45423b517714eedd5621a9dfdc03fa9f4eb241c" - integrity sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw== +"@babel/plugin-proposal-json-strings@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.13.tgz#ced7888a2db92a3d520a2e35eb421fdb7fcc9b5d" + integrity sha512-v9eEi4GiORDg8x+Dmi5r8ibOe0VXoKDeNPYcTTxdGN4eOWikrJfDJCJrr1l5gKGvsNyGJbrfMftC2dTL6oz7pg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-logical-assignment-operators@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.1.tgz#f2c490d36e1b3c9659241034a5d2cd50263a2751" - integrity sha512-k8ZmVv0JU+4gcUGeCDZOGd0lCIamU/sMtIiX3UWnUc5yzgq6YUGyEolNYD+MLYKfSzgECPcqetVcJP9Afe/aCA== +"@babel/plugin-proposal-logical-assignment-operators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.12.13.tgz#575b5d9a08d8299eeb4db6430da6e16e5cf14350" + integrity sha512-fqmiD3Lz7jVdK6kabeSr1PZlWSUVqSitmHEe3Z00dtGTKieWnX9beafvavc32kjORa5Bai4QNHgFDwWJP+WtSQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz#3ed4fff31c015e7f3f1467f190dbe545cd7b046c" - integrity sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg== +"@babel/plugin-proposal-nullish-coalescing-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.13.tgz#24867307285cee4e1031170efd8a7ac807deefde" + integrity sha512-Qoxpy+OxhDBI5kRqliJFAl4uWXk3Bn24WeFstPH0iLymFehSAUR8MHpqU7njyXv/qbo7oN6yTy5bfCmXdKpo1Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.0" -"@babel/plugin-proposal-numeric-separator@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.7.tgz#8bf253de8139099fea193b297d23a9d406ef056b" - integrity sha512-8c+uy0qmnRTeukiGsjLGy6uVs/TFjJchGXUeBqlG4VWYOdJWkhhVPdQ3uHwbmalfJwv2JsV0qffXP4asRfL2SQ== +"@babel/plugin-proposal-numeric-separator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz#bd9da3188e787b5120b4f9d465a8261ce67ed1db" + integrity sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-numeric-separator" "^7.10.4" -"@babel/plugin-proposal-object-rest-spread@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz#def9bd03cea0f9b72283dac0ec22d289c7691069" - integrity sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA== +"@babel/plugin-proposal-object-rest-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.13.tgz#f93f3116381ff94bc676fdcb29d71045cd1ec011" + integrity sha512-WvA1okB/0OS/N3Ldb3sziSrXg6sRphsBgqiccfcQq7woEn5wQLNX82Oc4PlaFcdwcWHuQXAtb8ftbS8Fbsg/sg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-object-rest-spread" "^7.8.0" - "@babel/plugin-transform-parameters" "^7.12.1" + "@babel/plugin-transform-parameters" "^7.12.13" -"@babel/plugin-proposal-optional-catch-binding@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz#ccc2421af64d3aae50b558a71cede929a5ab2942" - integrity sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g== +"@babel/plugin-proposal-optional-catch-binding@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.13.tgz#4640520afe57728af14b4d1574ba844f263bcae5" + integrity sha512-9+MIm6msl9sHWg58NvqpNpLtuFbmpFYk37x8kgnGzAHvX35E1FyAwSUt5hIkSoWJFSAH+iwU8bJ4fcD1zKXOzg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz#e02f0ea1b5dc59d401ec16fb824679f683d3303c" - integrity sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA== +"@babel/plugin-proposal-optional-chaining@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.13.tgz#63a7d805bc8ce626f3234ee5421a2a7fb23f66d9" + integrity sha512-0ZwjGfTcnZqyV3y9DSD1Yk3ebp+sIUpT2YDqP8hovzaNZnQq2Kd7PEqa6iOIUDBXBt7Jl3P7YAcEIL5Pz8u09Q== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" "@babel/plugin-syntax-optional-chaining" "^7.8.0" -"@babel/plugin-proposal-private-methods@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.1.tgz#86814f6e7a21374c980c10d38b4493e703f4a389" - integrity sha512-mwZ1phvH7/NHK6Kf8LP7MYDogGV+DKB1mryFOEwx5EBNQrosvIczzZFTUmWaeujd5xT6G1ELYWUz3CutMhjE1w== +"@babel/plugin-proposal-private-methods@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.12.13.tgz#ea78a12554d784ecf7fc55950b752d469d9c4a71" + integrity sha512-sV0V57uUwpauixvR7s2o75LmwJI6JECwm5oPUY5beZB1nBl2i37hc7CJGqB5G+58fur5Y6ugvl3LRONk5x34rg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-class-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-proposal-unicode-property-regex@^7.12.1", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz#2a183958d417765b9eae334f47758e5d6a82e072" - integrity sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w== +"@babel/plugin-proposal-unicode-property-regex@^7.12.13", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz#bebde51339be829c17aaaaced18641deb62b39ba" + integrity sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/plugin-syntax-async-generators@^7.8.0", "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -391,7 +426,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-class-properties@^7.12.1", "@babel/plugin-syntax-class-properties@^7.8.3": +"@babel/plugin-syntax-class-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-properties@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.1.tgz#bcb297c5366e79bebadef509549cd93b04f19978" integrity sha512-U40A76x5gTwmESz+qiqssqmeEsKvcSyvtgktrm0uzcARAmM9I1jR221f6Oq+GmHrcD+LvZDag1UTOTe2fL3TeA== @@ -468,287 +510,293 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-top-level-await@^7.12.1", "@babel/plugin-syntax-top-level-await@^7.8.3": +"@babel/plugin-syntax-top-level-await@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz#c5f0fa6e249f5b739727f923540cf7a806130178" + integrity sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-top-level-await@^7.8.3": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz#dd6c0b357ac1bb142d98537450a319625d13d2a0" integrity sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A== dependencies: "@babel/helper-plugin-utils" "^7.10.4" -"@babel/plugin-transform-arrow-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" - integrity sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A== +"@babel/plugin-transform-arrow-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.13.tgz#eda5670b282952100c229f8a3bd49e0f6a72e9fe" + integrity sha512-tBtuN6qtCTd+iHzVZVOMNp+L04iIJBpqkdY42tWbmjIT5wvR2kx7gxMBsyhQtFzHwBbyGi9h8J8r9HgnOpQHxg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-async-to-generator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz#3849a49cc2a22e9743cbd6b52926d30337229af1" - integrity sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A== +"@babel/plugin-transform-async-to-generator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.13.tgz#fed8c69eebf187a535bfa4ee97a614009b24f7ae" + integrity sha512-psM9QHcHaDr+HZpRuJcE1PXESuGWSCcbiGFFhhwfzdbTxaGDVzuVtdNYliAwcRo3GFg0Bc8MmI+AvIGYIJG04A== dependencies: - "@babel/helper-module-imports" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-remap-async-to-generator" "^7.12.1" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-remap-async-to-generator" "^7.12.13" -"@babel/plugin-transform-block-scoped-functions@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz#f2a1a365bde2b7112e0a6ded9067fdd7c07905d9" - integrity sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA== +"@babel/plugin-transform-block-scoped-functions@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz#a9bf1836f2a39b4eb6cf09967739de29ea4bf4c4" + integrity sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-block-scoping@^7.12.11": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz#d93a567a152c22aea3b1929bb118d1d0a175cdca" - integrity sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ== +"@babel/plugin-transform-block-scoping@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.13.tgz#f36e55076d06f41dfd78557ea039c1b581642e61" + integrity sha512-Pxwe0iqWJX4fOOM2kEZeUuAxHMWb9nK+9oh5d11bsLoB0xMg+mkDpt0eYuDZB7ETrY9bbcVlKUGTOGWy7BHsMQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-classes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz#65e650fcaddd3d88ddce67c0f834a3d436a32db6" - integrity sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog== +"@babel/plugin-transform-classes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.13.tgz#9728edc1838b5d62fc93ad830bd523b1fcb0e1f6" + integrity sha512-cqZlMlhCC1rVnxE5ZGMtIb896ijL90xppMiuWXcwcOAuFczynpd3KYemb91XFFPi3wJSe/OcrX9lXoowatkkxA== dependencies: - "@babel/helper-annotate-as-pure" "^7.10.4" - "@babel/helper-define-map" "^7.10.4" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-optimise-call-expression" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" - "@babel/helper-split-export-declaration" "^7.10.4" + "@babel/helper-annotate-as-pure" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-optimise-call-expression" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz#d68cf6c9b7f838a8a4144badbe97541ea0904852" - integrity sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg== +"@babel/plugin-transform-computed-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.13.tgz#6a210647a3d67f21f699cfd2a01333803b27339d" + integrity sha512-dDfuROUPGK1mTtLKyDPUavmj2b6kFu82SmgpztBFEO974KMjJT+Ytj3/oWsTUMBmgPcp9J5Pc1SlcAYRpJ2hRA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-destructuring@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz#b9a570fe0d0a8d460116413cb4f97e8e08b2f847" - integrity sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw== +"@babel/plugin-transform-destructuring@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.13.tgz#fc56c5176940c5b41735c677124d1d20cecc9aeb" + integrity sha512-Dn83KykIFzjhA3FDPA1z4N+yfF3btDGhjnJwxIj0T43tP0flCujnU8fKgEkf0C1biIpSv9NZegPBQ1J6jYkwvQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-dotall-regex@^7.12.1", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz#a1d16c14862817b6409c0a678d6f9373ca9cd975" - integrity sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA== +"@babel/plugin-transform-dotall-regex@^7.12.13", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz#3f1601cc29905bfcb67f53910f197aeafebb25ad" + integrity sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-duplicate-keys@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz#745661baba295ac06e686822797a69fbaa2ca228" - integrity sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw== +"@babel/plugin-transform-duplicate-keys@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz#6f06b87a8b803fd928e54b81c258f0a0033904de" + integrity sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-exponentiation-operator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz#b0f2ed356ba1be1428ecaf128ff8a24f02830ae0" - integrity sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug== +"@babel/plugin-transform-exponentiation-operator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz#4d52390b9a273e651e4aba6aee49ef40e80cd0a1" + integrity sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-for-of@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz#07640f28867ed16f9511c99c888291f560921cfa" - integrity sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg== +"@babel/plugin-transform-for-of@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.13.tgz#561ff6d74d9e1c8879cb12dbaf4a14cd29d15cf6" + integrity sha512-xCbdgSzXYmHGyVX3+BsQjcd4hv4vA/FDy7Kc8eOpzKmBBPEOTurt0w5fCRQaGl+GSBORKgJdstQ1rHl4jbNseQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-function-name@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz#2ec76258c70fe08c6d7da154003a480620eba667" - integrity sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw== +"@babel/plugin-transform-function-name@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz#bb024452f9aaed861d374c8e7a24252ce3a50051" + integrity sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ== dependencies: - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz#d73b803a26b37017ddf9d3bb8f4dc58bfb806f57" - integrity sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ== +"@babel/plugin-transform-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz#2ca45bafe4a820197cf315794a4d26560fe4bdb9" + integrity sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-member-expression-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz#496038602daf1514a64d43d8e17cbb2755e0c3ad" - integrity sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg== +"@babel/plugin-transform-member-expression-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz#5ffa66cd59b9e191314c9f1f803b938e8c081e40" + integrity sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-modules-amd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz#3154300b026185666eebb0c0ed7f8415fefcf6f9" - integrity sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ== +"@babel/plugin-transform-modules-amd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.13.tgz#43db16249b274ee2e551e2422090aa1c47692d56" + integrity sha512-JHLOU0o81m5UqG0Ulz/fPC68/v+UTuGTWaZBUwpEk1fYQ1D9LfKV6MPn4ttJKqRo5Lm460fkzjLTL4EHvCprvA== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-commonjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" - integrity sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag== +"@babel/plugin-transform-modules-commonjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.13.tgz#5043b870a784a8421fa1fd9136a24f294da13e50" + integrity sha512-OGQoeVXVi1259HjuoDnsQMlMkT9UkZT9TpXAsqWplS/M0N1g3TJAn/ByOCeQu7mfjc5WpSsRU+jV1Hd89ts0kQ== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-simple-access" "^7.12.1" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-simple-access" "^7.12.13" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-systemjs@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz#663fea620d593c93f214a464cd399bf6dc683086" - integrity sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q== +"@babel/plugin-transform-modules-systemjs@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.13.tgz#351937f392c7f07493fc79b2118201d50404a3c5" + integrity sha512-aHfVjhZ8QekaNF/5aNdStCGzwTbU7SI5hUybBKlMzqIMC7w7Ho8hx5a4R/DkTHfRfLwHGGxSpFt9BfxKCoXKoA== dependencies: - "@babel/helper-hoist-variables" "^7.10.4" - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-validator-identifier" "^7.10.4" + "@babel/helper-hoist-variables" "^7.12.13" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" babel-plugin-dynamic-import-node "^2.3.3" -"@babel/plugin-transform-modules-umd@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz#eb5a218d6b1c68f3d6217b8fa2cc82fec6547902" - integrity sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q== +"@babel/plugin-transform-modules-umd@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.13.tgz#26c66f161d3456674e344b4b1255de4d530cfb37" + integrity sha512-BgZndyABRML4z6ibpi7Z98m4EVLFI9tVsZDADC14AElFaNHHBcJIovflJ6wtCqFxwy2YJ1tJhGRsr0yLPKoN+w== dependencies: - "@babel/helper-module-transforms" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-module-transforms" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-named-capturing-groups-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz#b407f5c96be0d9f5f88467497fa82b30ac3e8753" - integrity sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q== +"@babel/plugin-transform-named-capturing-groups-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz#2213725a5f5bbbe364b50c3ba5998c9599c5c9d9" + integrity sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" -"@babel/plugin-transform-new-target@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz#80073f02ee1bb2d365c3416490e085c95759dec0" - integrity sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw== +"@babel/plugin-transform-new-target@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz#e22d8c3af24b150dd528cbd6e685e799bf1c351c" + integrity sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-object-super@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz#4ea08696b8d2e65841d0c7706482b048bed1066e" - integrity sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw== +"@babel/plugin-transform-object-super@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz#b4416a2d63b8f7be314f3d349bd55a9c1b5171f7" + integrity sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" - "@babel/helper-replace-supers" "^7.12.1" + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/helper-replace-supers" "^7.12.13" -"@babel/plugin-transform-parameters@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz#d2e963b038771650c922eff593799c96d853255d" - integrity sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg== +"@babel/plugin-transform-parameters@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.13.tgz#461e76dfb63c2dfd327b8a008a9e802818ce9853" + integrity sha512-e7QqwZalNiBRHCpJg/P8s/VJeSRYgmtWySs1JwvfwPqhBbiWfOcHDKdeAi6oAyIimoKWBlwc8oTgbZHdhCoVZA== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-property-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz#41bc81200d730abb4456ab8b3fbd5537b59adecd" - integrity sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ== +"@babel/plugin-transform-property-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz#4e6a9e37864d8f1b3bc0e2dce7bf8857db8b1a81" + integrity sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-regenerator@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz#5f0a28d842f6462281f06a964e88ba8d7ab49753" - integrity sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng== +"@babel/plugin-transform-regenerator@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.13.tgz#b628bcc9c85260ac1aeb05b45bde25210194a2f5" + integrity sha512-lxb2ZAvSLyJ2PEe47hoGWPmW22v7CtSl9jW8mingV4H2sEX/JOcrAj2nPuGWi56ERUm2bUpjKzONAuT6HCn2EA== dependencies: regenerator-transform "^0.14.2" -"@babel/plugin-transform-reserved-words@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz#6fdfc8cc7edcc42b36a7c12188c6787c873adcd8" - integrity sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A== +"@babel/plugin-transform-reserved-words@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz#7d9988d4f06e0fe697ea1d9803188aa18b472695" + integrity sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-shorthand-properties@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" - integrity sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw== +"@babel/plugin-transform-shorthand-properties@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz#db755732b70c539d504c6390d9ce90fe64aff7ad" + integrity sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-spread@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz#527f9f311be4ec7fdc2b79bb89f7bf884b3e1e1e" - integrity sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng== +"@babel/plugin-transform-spread@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.13.tgz#ca0d5645abbd560719c354451b849f14df4a7949" + integrity sha512-dUCrqPIowjqk5pXsx1zPftSq4sT0aCeZVAxhdgs3AMgyaDmoUT0G+5h3Dzja27t76aUEIJWlFgPJqJ/d4dbTtg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-skip-transparent-expression-wrappers" "^7.12.1" -"@babel/plugin-transform-sticky-regex@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz#560224613ab23987453948ed21d0b0b193fa7fad" - integrity sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg== +"@babel/plugin-transform-sticky-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz#760ffd936face73f860ae646fb86ee82f3d06d1f" + integrity sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-template-literals@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz#b43ece6ed9a79c0c71119f576d299ef09d942843" - integrity sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw== +"@babel/plugin-transform-template-literals@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.13.tgz#655037b07ebbddaf3b7752f55d15c2fd6f5aa865" + integrity sha512-arIKlWYUgmNsF28EyfmiQHJLJFlAJNYkuQO10jL46ggjBpeb2re1P9K9YGxNJB45BqTbaslVysXDYm/g3sN/Qg== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-typeof-symbol@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz#de01c4c8f96580bd00f183072b0d0ecdcf0dec4b" - integrity sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA== +"@babel/plugin-transform-typeof-symbol@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz#785dd67a1f2ea579d9c2be722de8c84cb85f5a7f" + integrity sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-escapes@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.1.tgz#5232b9f81ccb07070b7c3c36c67a1b78f1845709" - integrity sha512-I8gNHJLIc7GdApm7wkVnStWssPNbSRMPtgHdmH3sRM1zopz09UWPS4x5V4n1yz/MIWTVnJ9sp6IkuXdWM4w+2Q== +"@babel/plugin-transform-unicode-escapes@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz#840ced3b816d3b5127dd1d12dcedc5dead1a5e74" + integrity sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw== dependencies: - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/plugin-transform-unicode-regex@^7.12.1": - version "7.12.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz#cc9661f61390db5c65e3febaccefd5c6ac3faecb" - integrity sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg== +"@babel/plugin-transform-unicode-regex@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz#b52521685804e155b1202e83fc188d34bb70f5ac" + integrity sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.12.1" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/helper-create-regexp-features-plugin" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" -"@babel/preset-env@^7.12.11": - version "7.12.11" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.11.tgz#55d5f7981487365c93dbbc84507b1c7215e857f9" - integrity sha512-j8Tb+KKIXKYlDBQyIOy4BLxzv1NUOwlHfZ74rvW+Z0Gp4/cI2IMDPBWAgWceGcE7aep9oL/0K9mlzlMGxA8yNw== +"@babel/preset-env@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.12.13.tgz#3aa2d09cf7d255177538dff292ac9af29ad46525" + integrity sha512-JUVlizG8SoFTz4LmVUL8++aVwzwxcvey3N0j1tRbMAXVEy95uQ/cnEkmEKHN00Bwq4voAV3imQGnQvpkLAxsrw== dependencies: - "@babel/compat-data" "^7.12.7" - "@babel/helper-compilation-targets" "^7.12.5" - "@babel/helper-module-imports" "^7.12.5" - "@babel/helper-plugin-utils" "^7.10.4" + "@babel/compat-data" "^7.12.13" + "@babel/helper-compilation-targets" "^7.12.13" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.12.13" "@babel/helper-validator-option" "^7.12.11" - "@babel/plugin-proposal-async-generator-functions" "^7.12.1" - "@babel/plugin-proposal-class-properties" "^7.12.1" + "@babel/plugin-proposal-async-generator-functions" "^7.12.13" + "@babel/plugin-proposal-class-properties" "^7.12.13" "@babel/plugin-proposal-dynamic-import" "^7.12.1" - "@babel/plugin-proposal-export-namespace-from" "^7.12.1" - "@babel/plugin-proposal-json-strings" "^7.12.1" - "@babel/plugin-proposal-logical-assignment-operators" "^7.12.1" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.1" - "@babel/plugin-proposal-numeric-separator" "^7.12.7" - "@babel/plugin-proposal-object-rest-spread" "^7.12.1" - "@babel/plugin-proposal-optional-catch-binding" "^7.12.1" - "@babel/plugin-proposal-optional-chaining" "^7.12.7" - "@babel/plugin-proposal-private-methods" "^7.12.1" - "@babel/plugin-proposal-unicode-property-regex" "^7.12.1" + "@babel/plugin-proposal-export-namespace-from" "^7.12.13" + "@babel/plugin-proposal-json-strings" "^7.12.13" + "@babel/plugin-proposal-logical-assignment-operators" "^7.12.13" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.12.13" + "@babel/plugin-proposal-numeric-separator" "^7.12.13" + "@babel/plugin-proposal-object-rest-spread" "^7.12.13" + "@babel/plugin-proposal-optional-catch-binding" "^7.12.13" + "@babel/plugin-proposal-optional-chaining" "^7.12.13" + "@babel/plugin-proposal-private-methods" "^7.12.13" + "@babel/plugin-proposal-unicode-property-regex" "^7.12.13" "@babel/plugin-syntax-async-generators" "^7.8.0" - "@babel/plugin-syntax-class-properties" "^7.12.1" + "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-dynamic-import" "^7.8.0" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" @@ -758,41 +806,41 @@ "@babel/plugin-syntax-object-rest-spread" "^7.8.0" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" "@babel/plugin-syntax-optional-chaining" "^7.8.0" - "@babel/plugin-syntax-top-level-await" "^7.12.1" - "@babel/plugin-transform-arrow-functions" "^7.12.1" - "@babel/plugin-transform-async-to-generator" "^7.12.1" - "@babel/plugin-transform-block-scoped-functions" "^7.12.1" - "@babel/plugin-transform-block-scoping" "^7.12.11" - "@babel/plugin-transform-classes" "^7.12.1" - "@babel/plugin-transform-computed-properties" "^7.12.1" - "@babel/plugin-transform-destructuring" "^7.12.1" - "@babel/plugin-transform-dotall-regex" "^7.12.1" - "@babel/plugin-transform-duplicate-keys" "^7.12.1" - "@babel/plugin-transform-exponentiation-operator" "^7.12.1" - "@babel/plugin-transform-for-of" "^7.12.1" - "@babel/plugin-transform-function-name" "^7.12.1" - "@babel/plugin-transform-literals" "^7.12.1" - "@babel/plugin-transform-member-expression-literals" "^7.12.1" - "@babel/plugin-transform-modules-amd" "^7.12.1" - "@babel/plugin-transform-modules-commonjs" "^7.12.1" - "@babel/plugin-transform-modules-systemjs" "^7.12.1" - "@babel/plugin-transform-modules-umd" "^7.12.1" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.1" - "@babel/plugin-transform-new-target" "^7.12.1" - "@babel/plugin-transform-object-super" "^7.12.1" - "@babel/plugin-transform-parameters" "^7.12.1" - "@babel/plugin-transform-property-literals" "^7.12.1" - "@babel/plugin-transform-regenerator" "^7.12.1" - "@babel/plugin-transform-reserved-words" "^7.12.1" - "@babel/plugin-transform-shorthand-properties" "^7.12.1" - "@babel/plugin-transform-spread" "^7.12.1" - "@babel/plugin-transform-sticky-regex" "^7.12.7" - "@babel/plugin-transform-template-literals" "^7.12.1" - "@babel/plugin-transform-typeof-symbol" "^7.12.10" - "@babel/plugin-transform-unicode-escapes" "^7.12.1" - "@babel/plugin-transform-unicode-regex" "^7.12.1" + "@babel/plugin-syntax-top-level-await" "^7.12.13" + "@babel/plugin-transform-arrow-functions" "^7.12.13" + "@babel/plugin-transform-async-to-generator" "^7.12.13" + "@babel/plugin-transform-block-scoped-functions" "^7.12.13" + "@babel/plugin-transform-block-scoping" "^7.12.13" + "@babel/plugin-transform-classes" "^7.12.13" + "@babel/plugin-transform-computed-properties" "^7.12.13" + "@babel/plugin-transform-destructuring" "^7.12.13" + "@babel/plugin-transform-dotall-regex" "^7.12.13" + "@babel/plugin-transform-duplicate-keys" "^7.12.13" + "@babel/plugin-transform-exponentiation-operator" "^7.12.13" + "@babel/plugin-transform-for-of" "^7.12.13" + "@babel/plugin-transform-function-name" "^7.12.13" + "@babel/plugin-transform-literals" "^7.12.13" + "@babel/plugin-transform-member-expression-literals" "^7.12.13" + "@babel/plugin-transform-modules-amd" "^7.12.13" + "@babel/plugin-transform-modules-commonjs" "^7.12.13" + "@babel/plugin-transform-modules-systemjs" "^7.12.13" + "@babel/plugin-transform-modules-umd" "^7.12.13" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.12.13" + "@babel/plugin-transform-new-target" "^7.12.13" + "@babel/plugin-transform-object-super" "^7.12.13" + "@babel/plugin-transform-parameters" "^7.12.13" + "@babel/plugin-transform-property-literals" "^7.12.13" + "@babel/plugin-transform-regenerator" "^7.12.13" + "@babel/plugin-transform-reserved-words" "^7.12.13" + "@babel/plugin-transform-shorthand-properties" "^7.12.13" + "@babel/plugin-transform-spread" "^7.12.13" + "@babel/plugin-transform-sticky-regex" "^7.12.13" + "@babel/plugin-transform-template-literals" "^7.12.13" + "@babel/plugin-transform-typeof-symbol" "^7.12.13" + "@babel/plugin-transform-unicode-escapes" "^7.12.13" + "@babel/plugin-transform-unicode-regex" "^7.12.13" "@babel/preset-modules" "^0.1.3" - "@babel/types" "^7.12.11" + "@babel/types" "^7.12.13" core-js-compat "^3.8.0" semver "^5.5.0" @@ -808,9 +856,9 @@ esutils "^2.0.2" "@babel/runtime@^7.8.4": - version "7.12.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.5.tgz#410e7e487441e1b360c29be715d870d9b985882e" - integrity sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg== + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d" + integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw== dependencies: regenerator-runtime "^0.13.4" @@ -823,16 +871,16 @@ "@babel/parser" "^7.10.4" "@babel/types" "^7.10.4" -"@babel/template@^7.12.7": - version "7.12.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.7.tgz#c817233696018e39fbb6c491d2fb684e05ed43bc" - integrity sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow== +"@babel/template@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.12.13.tgz#530265be8a2589dbb37523844c5bcb55947fb327" + integrity sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA== dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/parser" "^7.12.7" - "@babel/types" "^7.12.7" + "@babel/code-frame" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" -"@babel/traverse@^7.1.0", "@babel/traverse@^7.10.4", "@babel/traverse@^7.12.1", "@babel/traverse@^7.12.5": +"@babel/traverse@^7.1.0": version "7.12.5" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.5.tgz#78a0c68c8e8a35e4cacfd31db8bb303d5606f095" integrity sha512-xa15FbQnias7z9a62LwYAA5SZZPkHIXpd42C6uW68o8uTuua96FHZy1y61Va5P/i83FAAcMpW8+A/QayntzuqA== @@ -847,22 +895,22 @@ globals "^11.1.0" lodash "^4.17.19" -"@babel/traverse@^7.12.10": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.10.tgz#2d1f4041e8bf42ea099e5b2dc48d6a594c00017a" - integrity sha512-6aEtf0IeRgbYWzta29lePeYSk+YAFIC3kyqESeft8o5CkFlYIMX+EQDDWEiAQ9LHOA3d0oHdgrSsID/CKqXJlg== - dependencies: - "@babel/code-frame" "^7.10.4" - "@babel/generator" "^7.12.10" - "@babel/helper-function-name" "^7.10.4" - "@babel/helper-split-export-declaration" "^7.11.0" - "@babel/parser" "^7.12.10" - "@babel/types" "^7.12.10" +"@babel/traverse@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.12.13.tgz#689f0e4b4c08587ad26622832632735fb8c4e0c0" + integrity sha512-3Zb4w7eE/OslI0fTp8c7b286/cQps3+vdLW3UcwC8VSJC6GbKn55aeVVu2QJNuCDoeKyptLOFrPq8WqZZBodyA== + dependencies: + "@babel/code-frame" "^7.12.13" + "@babel/generator" "^7.12.13" + "@babel/helper-function-name" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/parser" "^7.12.13" + "@babel/types" "^7.12.13" debug "^4.1.0" globals "^11.1.0" lodash "^4.17.19" -"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.10.5", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": +"@babel/types@^7.0.0", "@babel/types@^7.10.4", "@babel/types@^7.11.0", "@babel/types@^7.12.1", "@babel/types@^7.12.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": version "7.12.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.6.tgz#ae0e55ef1cce1fbc881cd26f8234eb3e657edc96" integrity sha512-hwyjw6GvjBLiyy3W0YQf0Z5Zf4NpYejUnKFcfcUhZCSffoBBp30w6wP2Wn6pk31jMYZvcOrB/1b7cGXvEoKogA== @@ -871,24 +919,15 @@ lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.12.10", "@babel/types@^7.12.11": - version "7.12.12" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.12.tgz#4608a6ec313abbd87afa55004d373ad04a96c299" - integrity sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ== +"@babel/types@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.13.tgz#8be1aa8f2c876da11a9cf650c0ecf656913ad611" + integrity sha512-oKrdZTld2im1z8bDwTOQvUbxKwE+854zc16qWZQlcTqMN00pWxHQ4ZeOq0yDMnisOpRykH2/5Qqcrk/OlbAjiQ== dependencies: "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" to-fast-properties "^2.0.0" -"@babel/types@^7.12.7": - version "7.12.10" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.12.10.tgz#7965e4a7260b26f09c56bcfcb0498af1f6d9b260" - integrity sha512-sf6wboJV5mGyip2hIpDSKsr80RszPinEFjsHTalMxZAZkoQ2/2yQzxlcFN52SJqsyPfLtPmenL4g2KB3KJXPDw== - dependencies: - "@babel/helper-validator-identifier" "^7.10.4" - lodash "^4.17.19" - to-fast-properties "^2.0.0" - "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" @@ -902,6 +941,11 @@ exec-sh "^0.3.2" minimist "^1.2.0" +"@discoveryjs/json-ext@^0.5.0": + version "0.5.2" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz#8f03a22a04de437254e8ce8cc84ba39689288752" + integrity sha512-HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg== + "@eslint/eslintrc@^0.3.0": version "0.3.0" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.3.0.tgz#d736d6963d7003b6514e6324bec9c602ac340318" @@ -1180,10 +1224,10 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^0.0.45": - version "0.0.45" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.45.tgz#e9387572998e5ecdac221950dab3e8c3b16af884" - integrity sha512-jnqIUKDUqJbDIUxm0Uj7bnlMnRm1T/eZ9N+AVMqhPgzrba2GhGG5o/jCTwmdPK709nEZsGoMzXEDUjcXHa3W0g== +"@types/estree@*", "@types/estree@^0.0.46": + version "0.0.46" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.46.tgz#0fb6bfbbeabd7a30880504993369c4bf1deab1fe" + integrity sha512-laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg== "@types/glob@^7.1.1": version "7.1.3" @@ -1247,10 +1291,10 @@ resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.6.tgz#f4c7ec43e81b319a9815115031709f26987891f0" integrity sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw== -"@types/lodash@^4.14.167": - version "4.14.167" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.167.tgz#ce7d78553e3c886d4ea643c37ec7edc20f16765e" - integrity sha512-w7tQPjARrvdeBkX/Rwg95S592JwxqOjmms3zWQ0XZgSyxSLdzWaYH3vErBhdVS/lRBX7F8aBYcYJYTr5TMGOzw== +"@types/lodash@^4.14.168": + version "4.14.168" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.168.tgz#fe24632e79b7ade3f132891afff86caa5e5ce008" + integrity sha512-oVfRvqHV/V6D1yifJbVRU3TMp8OT6o6BG+U9MkwuJ3U8/CsDHvalRpsxBqivn71ztOFZBTfJMvETbqHiaNSj7Q== "@types/minimatch@*": version "3.0.3" @@ -1287,7 +1331,7 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.0.tgz#7036640b4e21cc2f259ae826ce843d277dad8cff" integrity sha512-RJJrrySY7A8havqpGObOB4W92QXKJo63/jFLLgpvOtsGUqbQZ9Sbgl35KMm1DjC6j7AvmmU2bIno+3IyEaemaw== -"@types/tapable@*", "@types/tapable@^1.0.5": +"@types/tapable@*": version "1.0.6" resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.6.tgz#a9ca4b70a18b270ccb2bc0aaafefd1d486b7ea74" integrity sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA== @@ -1308,7 +1352,7 @@ "@types/source-list-map" "*" source-map "^0.7.3" -"@types/webpack@*", "@types/webpack@^4.4.31", "@types/webpack@^4.41.8": +"@types/webpack@*", "@types/webpack@^4.4.31": version "4.41.24" resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.24.tgz#75b664abe3d5bcfe54e64313ca3b43e498550422" integrity sha512-1A0MXPwZiMOD3DPMuOKUKcpkdPo8Lq33UGggZ7xio6wJ/jV1dAu5cXDrOfGDnldUroPIRLsr/DT43/GqOA4RFQ== @@ -1453,6 +1497,23 @@ "@webassemblyjs/ast" "1.11.0" "@xtuc/long" "4.2.2" +"@webpack-cli/configtest@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.0.1.tgz#241aecfbdc715eee96bed447ed402e12ec171935" + integrity sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ== + +"@webpack-cli/info@^1.2.2": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.2.2.tgz#ef3c0cd947a1fa083e174a59cb74e0b6195c236c" + integrity sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.3.0.tgz#2730c770f5f1f132767c63dcaaa4ec28f8c56a6c" + integrity sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw== + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -1500,9 +1561,9 @@ acorn@^7.1.1, acorn@^7.4.0: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.0.4: - version "8.0.4" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.4.tgz#7a3ae4191466a6984eee0fe3407a4f3aa9db8354" - integrity sha512-XNP0PqF1XD19ZlLKvB7cMmnZswW4C/03pRHgirB30uSJTaS3A3V1/P4sS3HPvFmjoriPCJQs+JDSbm4bL1TxGQ== + version "8.0.5" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.0.5.tgz#a3bfb872a74a6a7f661bc81b9849d9cac12601b7" + integrity sha512-v+DieK/HJkJOpFBETDJioequtc3PfxsWMaxIdIwujtF7FEV/MAyDQLlm6/zPvr7Mix07mLh6ccVwIsloceodlg== ajv-errors@^1.0.0: version "1.0.1" @@ -1525,9 +1586,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" ajv@^7.0.2: - version "7.0.3" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.3.tgz#13ae747eff125cafb230ac504b2406cf371eece2" - integrity sha512-R50QRlXSxqXcQP5SvKUrw8VZeypvo12i2IX0EeR5PiZ7bEKeHWgzgo264LDadUsCU42lTJVhFikTqJwNeH34gQ== + version "7.0.4" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-7.0.4.tgz#827e5f5ae32f5e5c1637db61f253a112229b5e2f" + integrity sha512-xzzzaqgEQfmuhbhAoqjJ8T/1okb6gAzXn/eQRNpAN1AEUoHJTNF9xCDRTtf/s3SKldtZfa+RJeTs+BQq+eZ/sw== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -1903,7 +1964,7 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.14.5, browserslist@^4.15.0: +browserslist@^4.14.5: version "4.16.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.0.tgz#410277627500be3cb28a1bfe037586fbedf9488b" integrity sha512-/j6k8R0p3nxOC6kx5JGAxsnhc9ixaWJfYc+TNTzxg6+ARaESAvQGV7h0uNOB4t+pLQJZWzcrMxXOxjgsCj3dqQ== @@ -1914,6 +1975,17 @@ browserslist@^4.14.5, browserslist@^4.15.0: escalade "^3.1.1" node-releases "^1.1.67" +browserslist@^4.16.1: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + bser@2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.1.tgz#e6787da20ece9d07998533cfd9de6f5c38f4bc05" @@ -2000,6 +2072,11 @@ caniuse-lite@^1.0.30001165: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001165.tgz#32955490d2f60290bb186bb754f2981917fa744f" integrity sha512-8cEsSMwXfx7lWSUMA2s08z9dIgsnR5NAqjXP23stdsU3AUWkCr/rr4s4OFtHXn5XXr6+7kam3QFVoYyXNPdJPA== +caniuse-lite@^1.0.30001181: + version "1.0.30001185" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001185.tgz#3482a407d261da04393e2f0d61eefbc53be43b95" + integrity sha512-Fpi4kVNtNvJ15H0F6vwmXtb3tukv3Zg3qhKkOGUq7KJ1J6b9kf4dnNgtEAFXhRsJo0gNj9W60+wBvn0JcTvdTg== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -2012,7 +2089,7 @@ caseless@~0.12.0: resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= -chalk@^2.0.0, chalk@^2.4.2: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2186,6 +2263,11 @@ commander@^4.1.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== +commander@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.0.0.tgz#3e2bbfd8bb6724760980988fb5b22b7ee6b71ab2" + integrity sha512-ovx/7NkTrnPuIV8sqk/GjUIIM1+iUQeqA3ye2VNpq9sVoiZsooObWlQy+OPWGI17GDaEoybuAGJm6U8yC077BA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" @@ -2261,11 +2343,11 @@ copy-descriptor@^0.1.0: integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= core-js-compat@^3.8.0: - version "3.8.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.1.tgz#8d1ddd341d660ba6194cbe0ce60f4c794c87a36e" - integrity sha512-a16TLmy9NVD1rkjUGbwuyWkiDoN0FDpAwrfLONvHFQx0D9k7J9y0srwMT8QP/Z6HE3MIFaVynEeYwZwPX1o5RQ== + version "3.8.3" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.8.3.tgz#9123fb6b9cad30f0651332dc77deba48ef9b0b3f" + integrity sha512-1sCb0wBXnBIL16pfFG1Gkvei6UzvKyTNYpiC41yrdjEv0UoJoq9E/abTMzyYJ6JpTkAj15dLjbqifIzEBDVvog== dependencies: - browserslist "^4.15.0" + browserslist "^4.16.1" semver "7.0.0" core-util-is@1.0.2, core-util-is@~1.0.0: @@ -2273,7 +2355,7 @@ core-util-is@1.0.2, core-util-is@~1.0.0: resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= -cross-spawn@^6.0.0, cross-spawn@^6.0.5: +cross-spawn@^6.0.0: version "6.0.5" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== @@ -2284,7 +2366,7 @@ cross-spawn@^6.0.0, cross-spawn@^6.0.5: shebang-command "^1.2.0" which "^1.2.9" -cross-spawn@^7.0.0, cross-spawn@^7.0.2: +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== @@ -2407,7 +2489,7 @@ default-gateway@^4.2.0: execa "^1.0.0" ip-regex "^2.1.0" -define-properties@^1.1.2, define-properties@^1.1.3: +define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ== @@ -2464,11 +2546,6 @@ destroy@~1.0.4: resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= - detect-newline@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" @@ -2584,6 +2661,11 @@ electron-to-chromium@^1.3.621: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.622.tgz#9726bd2e67a5462154750ce9701ca6af07d07877" integrity sha512-AJT0Fm1W0uZlMVVkkJrcCVvczDuF8tPm3bwzQf5WO8AaASB2hwTRP7B8pU5rqjireH+ib6am8+hH5/QkXzzYKw== +electron-to-chromium@^1.3.649: + version "1.3.657" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.657.tgz#a9c307f2612681245738bb8d36d997cbb568d481" + integrity sha512-/9ROOyvEflEbaZFUeGofD+Tqs/WynbSTbNgNF+/TJJxH1ePD/e6VjZlDJpW3FFFd3nj5l3Hd8ki2vRwy+gyRFw== + emittery@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.7.2.tgz#25595908e13af0f5674ab419396e2fb394cdfa82" @@ -2616,7 +2698,7 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^4.0.0, enhanced-resolve@^4.1.1: +enhanced-resolve@^4.0.0: version "4.3.0" resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.3.0.tgz#3b806f3bfafc1ec7de69551ef93cca46c1704126" integrity sha512-3e87LvavsdxyoCfGusJnrZ5G8SLPOFeHSNpZI/ATL9a5leXo2k0w6MKnbqhdBad9qTobSfB20Ld7UmgoNbAZkQ== @@ -2633,7 +2715,7 @@ enhanced-resolve@^5.7.0: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.5: +enquirer@^2.3.5, enquirer@^2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.3.6.tgz#2a7fe5dd634a1e4125a975ec994ff5456dc3734d" integrity sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== @@ -2646,9 +2728,14 @@ entities@^1.1.1: integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" - integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +envinfo@^7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.7.4.tgz#c6311cdd38a0e86808c1c9343f667e4267c4a320" + integrity sha512-TQXTYFVVwwluWSFis6K2XKxgrD22jEv0FTuLCQI+OjH7rn93+iY0fSSFM5lrSxFY+H1+B0/cvvlamr3UsBivdQ== errno@^0.1.3: version "0.1.7" @@ -2664,38 +2751,11 @@ error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.18.0-next.1: - version "1.18.0-next.1" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.18.0-next.1.tgz#6e3a0a4bda717e5023ab3b8e90bec36108d22c68" - integrity sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA== - dependencies: - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - is-callable "^1.2.2" - is-negative-zero "^2.0.0" - is-regex "^1.1.1" - object-inspect "^1.8.0" - object-keys "^1.1.1" - object.assign "^4.1.1" - string.prototype.trimend "^1.0.1" - string.prototype.trimstart "^1.0.1" - es-module-lexer@^0.3.26: version "0.3.26" resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.3.26.tgz#7b507044e97d5b03b01d4392c74ffeb9c177a83b" integrity sha512-Va0Q/xqtrss45hWzP8CZJwzGSZJjDM5/MJRE3IXXnUCcVLElR9BRaE9F62BopysASyc4nM3uwhSW7FFB9nlWAA== -es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - escalade@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" @@ -2758,10 +2818,10 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz#21fdc8fbcd9c795cc0321f0563702095751511a8" integrity sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ== -eslint@^7.18.0: - version "7.18.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.18.0.tgz#7fdcd2f3715a41fe6295a16234bd69aed2c75e67" - integrity sha512-fbgTiE8BfUJZuBeq2Yi7J3RB3WGUQ9PNuNbmgi6jt9Iv8qrkxfy19Ds3OpL1Pm7zg3BtTVhvcUZbIRQ0wmSjAQ== +eslint@^7.19.0: + version "7.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.19.0.tgz#6719621b196b5fad72e43387981314e5d0dc3f41" + integrity sha512-CGlMgJY56JZ9ZSYhJuhow61lMPPjUzWmChFya71Z/jilVos7mR/jPgaEfVGgMBY5DshbKdG8Ezb8FDCHcoMEMg== dependencies: "@babel/code-frame" "^7.0.0" "@eslint/eslintrc" "^0.3.0" @@ -2816,9 +2876,9 @@ esprima@^4.0.0, esprima@^4.0.1: integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== esquery@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz#b78b5828aa8e214e29fb74c4d5b752e1c033da57" - integrity sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ== + version "1.4.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" @@ -2899,6 +2959,21 @@ execa@^4.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-5.0.0.tgz#4029b0007998a841fbd1032e5f4de86a3c1e3376" + integrity sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -2917,13 +2992,6 @@ expand-brackets@^2.1.4: snapdragon "^0.8.1" to-regex "^3.0.1" -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - expect@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/expect/-/expect-26.6.2.tgz#c6b996bf26bf3fe18b67b2d0f51fc981ba934417" @@ -3026,6 +3094,11 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastest-levenshtein@^1.0.12: + version "1.0.12" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2" + integrity sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow== + faye-websocket@^0.11.3: version "0.11.3" resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz#5c0e9a8968e8912c286639fde977a8b209f2508e" @@ -3106,24 +3179,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -find-up@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" - integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== - dependencies: - locate-path "^6.0.0" - path-exists "^4.0.0" - -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -3133,9 +3188,9 @@ flat-cache@^3.0.4: rimraf "^3.0.2" flatted@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.0.tgz#a5d06b4a8b01e3a63771daa5cb7a1903e2e57067" - integrity sha512-tW+UkmtNg/jv9CSofAKvgVcO7c2URjhTdW1ZTkcAritblu8tajiYy7YisnIflEwtKssCtOxpnBRoCB7iap0/TA== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.1.1.tgz#c4b489e80096d9df1dfc97c79871aea7c617c469" + integrity sha512-zAoAQiudy+r5SvnSw3KJy5os/oRJYHzrzja/tBDqrZtNhUw8bt6y8OBzMWcjWr+8liV8Eb6yOhw8WZ7VFZ5ZzA== follow-redirects@^1.0.0: version "1.13.1" @@ -3253,6 +3308,11 @@ get-stream@^5.0.0: dependencies: pump "^3.0.0" +get-stream@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.0.tgz#3e0012cb6827319da2706e601a1583e8629a6718" + integrity sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== + get-value@^2.0.3, get-value@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" @@ -3297,42 +3357,6 @@ glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: once "^1.3.0" path-is-absolute "^1.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-modules@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" - integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== - dependencies: - global-prefix "^3.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - -global-prefix@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-3.0.0.tgz#fc85f73064df69f50421f47f883fe5b913ba9b97" - integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== - dependencies: - ini "^1.3.5" - kind-of "^6.0.2" - which "^1.3.1" - globals@^11.1.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -3442,13 +3466,6 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -homedir-polyfill@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz#743298cef4e5af3e194161fbadcc2151d3a058e8" - integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== - dependencies: - parse-passwd "^1.0.0" - hosted-git-info@^2.1.4: version "2.8.8" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" @@ -3494,20 +3511,17 @@ html-minifier-terser@^5.0.1: relateurl "^0.2.7" terser "^4.6.3" -html-webpack-plugin@^4.5.1: - version "4.5.1" - resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-4.5.1.tgz#40aaf1b5cb78f2f23a83333999625c20929cda65" - integrity sha512-yzK7RQZwv9xB+pcdHNTjcqbaaDZ+5L0zJHXfi89iWIZmb/FtzxhLk0635rmJihcQbs3ZUF27Xp4oWGx6EK56zg== +html-webpack-plugin@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-5.0.0.tgz#457a9defb33ce368135078b4e0387a27f3fe244d" + integrity sha512-kxTyb8cyZwEyUqXTgdHRUOF4C7uCrquzw2T+YTudehm/yspodgCkREjdmc4dXI8k2P4NEjqOVbnOOlPZg4TKJA== dependencies: "@types/html-minifier-terser" "^5.0.0" - "@types/tapable" "^1.0.5" - "@types/webpack" "^4.41.8" html-minifier-terser "^5.0.1" - loader-utils "^1.2.3" + loader-utils "^2.0.0" lodash "^4.17.20" pretty-error "^2.1.1" - tapable "^1.1.3" - util.promisify "1.0.0" + tapable "^2.0.0" htmlparser2@^3.10.1: version "3.10.1" @@ -3585,6 +3599,11 @@ human-signals@^1.1.1: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -3644,11 +3663,6 @@ inherits@2.0.3: resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@^1.3.4, ini@^1.3.5: - version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== - internal-ip@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz#845452baad9d2ca3b69c635a137acb9a0dad0907" @@ -3657,10 +3671,10 @@ internal-ip@^4.3.0: default-gateway "^4.2.0" ipaddr.js "^1.9.0" -interpret@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA== +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== ip-regex@^2.1.0: version "2.1.0" @@ -3720,11 +3734,6 @@ is-buffer@^1.1.5: resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== -is-callable@^1.1.4, is-callable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.2.tgz#c7c6715cd22d4ddb48d3e19970223aceabb080d9" - integrity sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA== - is-ci@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-2.0.0.tgz#6bc6334181810e04b5c22b3d589fdca55026404c" @@ -3827,11 +3836,6 @@ is-glob@^4.0.0, is-glob@^4.0.1: dependencies: is-extglob "^2.1.1" -is-negative-zero@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w== - is-number@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" @@ -3875,7 +3879,7 @@ is-potential-custom-element-name@^1.0.0: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" integrity sha1-DFLlS8yjkbssSUsh6GJtczbG45c= -is-regex@^1.0.4, is-regex@^1.1.1: +is-regex@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.1.tgz#c6f98aacc546f6cec5468a07b7b153ab564a57b9" integrity sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg== @@ -3892,19 +3896,12 @@ is-stream@^2.0.0: resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== -is-symbol@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ== - dependencies: - has-symbols "^1.0.1" - is-typedarray@^1.0.0, is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-windows@^1.0.1, is-windows@^1.0.2: +is-windows@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -4470,9 +4467,9 @@ json5@^1.0.1: minimist "^1.2.0" json5@^2.1.2: - version "2.1.3" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz#c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43" - integrity sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA== + version "2.2.0" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.0.tgz#2dfefe720c6ba525d9ebd909950f0515316c89a3" + integrity sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA== dependencies: minimist "^1.2.5" @@ -4551,7 +4548,7 @@ loader-runner@^4.2.0: resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.2.0.tgz#d7022380d66d14c5fb1d496b89864ebcfd478384" integrity sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw== -loader-utils@^1.2.3, loader-utils@^1.4.0: +loader-utils@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz#c579b5e34cb34b1a74edc6c1fb36bfa371d5a613" integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA== @@ -4584,13 +4581,6 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" -locate-path@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" - integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== - dependencies: - p-locate "^5.0.0" - lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -4682,7 +4672,7 @@ methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.0.4, micromatch@^3.1.10, micromatch@^3.1.4: +micromatch@^3.1.10, micromatch@^3.1.4: version "3.1.10" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== @@ -4878,6 +4868,11 @@ node-releases@^1.1.67: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.67.tgz#28ebfcccd0baa6aad8e8d4d8fe4cbc49ae239c12" integrity sha512-V5QF9noGFl3EymEwUYzO+3NTDpGfQB4ve6Qfnzf3UNydMhjQRVPR1DZTuvWiLzaFJYw2fmDwAfnRNEVb64hSIg== +node-releases@^1.1.70: + version "1.1.70" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.70.tgz#66e0ed0273aa65666d7fe78febe7634875426a08" + integrity sha512-Slf2s69+2/uAD79pVVQo8uSiC34+g8GWY8UH2Qtqv34ZfhYrxpYpfzs9Js9d6O0mbDmALuxaTlplnBTnSELcrw== + normalize-package-data@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" @@ -4907,7 +4902,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -npm-run-path@^4.0.0: +npm-run-path@^4.0.0, npm-run-path@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== @@ -4945,11 +4940,6 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.8.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.9.0.tgz#c90521d74e1127b67266ded3394ad6116986533a" - integrity sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw== - object-is@^1.0.1: version "1.1.4" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.1.4.tgz#63d6c83c00a43f4cbc9434eb9757c8a5b8565068" @@ -4970,7 +4960,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.0, object.assign@^4.1.1: +object.assign@^4.1.0: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ== @@ -4980,15 +4970,6 @@ object.assign@^4.1.0, object.assign@^4.1.1: has-symbols "^1.0.1" object-keys "^1.1.1" -object.getownpropertydescriptors@^2.0.3: - version "2.1.1" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz#0dfda8d108074d9c563e80490c883b6661091544" - integrity sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - es-abstract "^1.18.0-next.1" - object.pick@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" @@ -5020,7 +5001,7 @@ once@^1.3.0, once@^1.3.1, once@^1.4.0: dependencies: wrappy "1" -onetime@^5.1.0: +onetime@^5.1.0, onetime@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== @@ -5082,7 +5063,7 @@ p-limit@^2.0.0, p-limit@^2.2.0: dependencies: p-try "^2.0.0" -p-limit@^3.0.2, p-limit@^3.1.0: +p-limit@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== @@ -5103,13 +5084,6 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" -p-locate@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" - integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== - dependencies: - p-limit "^3.0.2" - p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -5152,11 +5126,6 @@ parse-json@^5.0.0: json-parse-even-better-errors "^2.3.0" lines-and-columns "^1.1.6" -parse-passwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" - integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY= - parse5@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz#f68e4e5ba1852ac2cadc00f4555fff6c2abb6178" @@ -5278,13 +5247,6 @@ pkg-dir@^4.1.0, pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -pkg-dir@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-5.0.0.tgz#a02d6aebe6ba133a928f74aec20bafdfe6b8e760" - integrity sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA== - dependencies: - find-up "^5.0.0" - portfinder@^1.0.26: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" @@ -5478,6 +5440,13 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +rechoir@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== + dependencies: + resolve "^1.9.0" + regenerate-unicode-properties@^8.2.0: version "8.2.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz#e5de7111d655e7ba60c057dbe9ff37c87e65cdec" @@ -5541,9 +5510,9 @@ regjsgen@^0.5.1: integrity sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A== regjsparser@^0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz#a769f8684308401a66e9b529d2436ff4d0666272" - integrity sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw== + version "0.6.7" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.7.tgz#c00164e1e6713c2e3ee641f1701c4b7aa0a7f86c" + integrity sha512-ib77G0uxsA2ovgiYbCVGx4Pv3PSttAx2vIwidqQzbL2U5S4Q+j00HdSAneSBuyVcMvEnTXMjiGgB+DlXozVhpQ== dependencies: jsesc "~0.5.0" @@ -5654,14 +5623,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -5682,7 +5643,7 @@ resolve-url@^0.2.1: resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= -resolve@^1.10.0, resolve@^1.18.1: +resolve@^1.10.0, resolve@^1.18.1, resolve@^1.9.0: version "1.18.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.18.1.tgz#018fcb2c5b207d2a6424aee361c5a266da8f4130" integrity sha512-lDfCPaMKfOJXjy0dPayzPdF1phampNWr3qFCjAu+rw/qbQmr5jWH5xN2hwh9QKfw9E5v4hwV7A+jrCmL8yjjqA== @@ -5939,7 +5900,7 @@ shellwords@^0.1.1: resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" integrity sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww== -signal-exit@^3.0.0, signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== @@ -6185,22 +6146,6 @@ string-width@^4.1.0, string-width@^4.2.0: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.0" -string.prototype.trimend@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz#a22bd53cca5c7cf44d7c9d5c732118873d6cd18b" - integrity sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - -string.prototype.trimstart@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz#9b4cb590e123bb36564401d59824298de50fd5aa" - integrity sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg== - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - string_decoder@^1.1.1: version "1.3.0" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" @@ -6300,12 +6245,12 @@ table@^6.0.4: slice-ansi "^4.0.0" string-width "^4.2.0" -tapable@^1.0.0, tapable@^1.1.3: +tapable@^1.0.0: version "1.1.3" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2" integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== -tapable@^2.1.1, tapable@^2.2.0: +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== @@ -6443,10 +6388,10 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" -ts-loader@^8.0.14: - version "8.0.14" - resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.14.tgz#e46ac1f8dcb88808d0b1335d2eae65b74bd78fe8" - integrity sha512-Jt/hHlUnApOZjnSjTmZ+AbD5BGlQFx3f1D0nYuNKwz0JJnuDGHJas6az+FlWKwwRTu+26GXpv249A8UAnYUpqA== +ts-loader@^8.0.15: + version "8.0.15" + resolved "https://registry.yarnpkg.com/ts-loader/-/ts-loader-8.0.15.tgz#c41bed94220aad78310cbee8be48a76683acec24" + integrity sha512-WYXfCEglgUPU6adGcx6I9DsMwSxYFU99rzteIEoZKDQn4IMbe4KpO934zRkwSOFcwEzh+gx/RaH8hhgoCAfF9w== dependencies: chalk "^4.1.0" enhanced-resolve "^4.0.0" @@ -6619,14 +6564,6 @@ util-deprecate@^1.0.1, util-deprecate@~1.0.1: resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= -util.promisify@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - integrity sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA== - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" @@ -6647,7 +6584,7 @@ uuid@^8.3.0: resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.1.tgz#2ba2e6ca000da60fce5a196954ab241131e05a31" integrity sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.1.1: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.2.0.tgz#9471efa3ef9128d2f7c6a7ca39c4dd6b5055b132" integrity sha512-gTpR5XQNKFwOd4clxfnhaqvfqMpqEwr4tOtCyz4MtYZX2JYhfr1JvBFKdS+7K/9rfpZR3VLX+YWBbKoxCgS43Q== @@ -6705,9 +6642,9 @@ walker@^1.0.7, walker@~1.0.5: makeerror "1.0.x" watchpack@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.0.tgz#e63194736bf3aa22026f7b191cd57907b0f9f696" - integrity sha512-UjgD1mqjkG99+3lgG36at4wPnUXNvis2v1utwTgQ43C22c4LD71LsYMExdWXh4HZ+RmW+B0t1Vrg2GpXAkTOQw== + version "2.1.1" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.1.1.tgz#e99630550fca07df9f90a06056987baa40a689c7" + integrity sha512-Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -6729,22 +6666,25 @@ webidl-conversions@^6.1.0: resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-6.1.0.tgz#9111b4d7ea80acd40f5270d666621afa78b69514" integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== -webpack-cli@^3.3.12: - version "3.3.12" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-3.3.12.tgz#94e9ada081453cd0aa609c99e500012fd3ad2d4a" - integrity sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag== +webpack-cli@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.5.0.tgz#b5213b84adf6e1f5de6391334c9fa53a48850466" + integrity sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q== dependencies: - chalk "^2.4.2" - cross-spawn "^6.0.5" - enhanced-resolve "^4.1.1" - findup-sync "^3.0.0" - global-modules "^2.0.0" - import-local "^2.0.0" - interpret "^1.4.0" - loader-utils "^1.4.0" - supports-color "^6.1.0" - v8-compile-cache "^2.1.1" - yargs "^13.3.2" + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.0.1" + "@webpack-cli/info" "^1.2.2" + "@webpack-cli/serve" "^1.3.0" + colorette "^1.2.1" + commander "^7.0.0" + enquirer "^2.3.6" + execa "^5.0.0" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + v8-compile-cache "^2.2.0" + webpack-merge "^5.7.3" webpack-dev-middleware@^3.7.2: version "3.7.3" @@ -6820,13 +6760,13 @@ webpack-sources@^2.1.1: source-list-map "^2.0.1" source-map "^0.6.1" -webpack@^5.15.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.15.0.tgz#63d7b6228a4e15ee8c89899c2cfdd993e809bdd2" - integrity sha512-y/xG+ONDz78yn3VvP6gAvGr1/gkxOgitvHSXBmquyN8KDtrGEyE3K9WkXOPB7QmfcOBCpO4ELXwNcCYQnEmexA== +webpack@^5.21.2: + version "5.21.2" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.21.2.tgz#647507e50d3637695be28af58a6a8246050394e7" + integrity sha512-xHflCenx+AM4uWKX71SWHhxml5aMXdy2tu/vdi4lClm7PADKxlyDAFFN1rEFzNV0MAoPpHtBeJnl/+K6F4QBPg== dependencies: "@types/eslint-scope" "^3.7.0" - "@types/estree" "^0.0.45" + "@types/estree" "^0.0.46" "@webassemblyjs/ast" "1.11.0" "@webassemblyjs/wasm-edit" "1.11.0" "@webassemblyjs/wasm-parser" "1.11.0" @@ -6843,7 +6783,6 @@ webpack@^5.15.0: loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" - pkg-dir "^5.0.0" schema-utils "^3.0.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.1" @@ -6890,7 +6829,7 @@ which-module@^2.0.0: resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= -which@^1.2.14, which@^1.2.9, which@^1.3.1: +which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== From 79faf96e6be184a584f21e356b199739d7646779 Mon Sep 17 00:00:00 2001 From: Anton Moskovskiy <7397158+Ant1mas@users.noreply.github.com> Date: Mon, 8 Feb 2021 18:16:56 +0500 Subject: [PATCH 12/12] Changed version in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8fca4c0..c50e8e3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "number-to-words-ru", - "version": "2.2.7", + "version": "2.3.0", "description": "Convert a number to words on russian language.", "license": "MIT", "repository": "Ant1mas/number-to-words-ru",