diff --git a/.editorconfig b/.editorconfig
deleted file mode 100644
index eb77e81..0000000
--- a/.editorconfig
+++ /dev/null
@@ -1,13 +0,0 @@
-# editorconfig.org
-root = true
-
-[*]
-indent_style = space
-indent_size = 4
-end_of_line = lf
-charset = utf-8
-trim_trailing_whitespace = true
-insert_final_newline = true
-
-[package.json]
-indent_size = 2
diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644
index 0000000..d422e17
--- /dev/null
+++ b/.eslintrc.json
@@ -0,0 +1,11 @@
+{
+ "root": true,
+ "extends": [
+ "eslint:recommended",
+ "plugin:@typescript-eslint/recommended"
+ ],
+ "parser": "@typescript-eslint/parser",
+ "plugins": [
+ "@typescript-eslint"
+ ]
+}
diff --git a/.gitignore b/.gitignore
index 9e03d49..3fa4685 100644
--- a/.gitignore
+++ b/.gitignore
@@ -101,3 +101,4 @@ Network Trash Folder
Temporary Items
.apdisk
+lib
diff --git a/.npmignore b/.npmignore
deleted file mode 100644
index dd5e8f0..0000000
--- a/.npmignore
+++ /dev/null
@@ -1,104 +0,0 @@
-# Created by .ignore support plugin (hsz.mobi)
-### JetBrains template
-# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio
-
-*.iml
-
-## Directory-based project format:
-.idea/
-# if you remove the above rule, at least ignore the following:
-
-# User-specific stuff:
-# .idea/workspace.xml
-# .idea/tasks.xml
-# .idea/dictionaries
-
-# Sensitive or high-churn files:
-# .idea/dataSources.ids
-# .idea/dataSources.xml
-# .idea/sqlDataSources.xml
-# .idea/dynamic.xml
-# .idea/uiDesigner.xml
-
-# Gradle:
-# .idea/gradle.xml
-# .idea/libraries
-
-# Mongo Explorer plugin:
-# .idea/mongoSettings.xml
-
-## File-based project format:
-*.ipr
-*.iws
-
-## Plugin-specific files:
-
-# IntelliJ
-/out/
-
-# mpeltonen/sbt-idea plugin
-.idea_modules/
-
-# JIRA plugin
-atlassian-ide-plugin.xml
-
-# Crashlytics plugin (for Android Studio and IntelliJ)
-com_crashlytics_export_strings.xml
-crashlytics.properties
-crashlytics-build.properties
-### Node template
-# Logs
-logs
-*.log
-npm-debug.log*
-
-# Runtime data
-pids
-*.pid
-*.seed
-
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
-
-# Coverage directory used by tools like istanbul
-coverage
-
-# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
-
-# node-waf configuration
-.lock-wscript
-
-# Compiled binary addons (http://nodejs.org/api/addons.html)
-build/Release
-
-# Dependency directory
-# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git
-node_modules
-### OSX template
-.DS_Store
-.AppleDouble
-.LSOverride
-
-# Icon must end with two \r
-Icon
-
-# Thumbnails
-._*
-
-# Files that might appear in the root of a volume
-.DocumentRevisions-V100
-.fseventsd
-.Spotlight-V100
-.TemporaryItems
-.Trashes
-.VolumeIcon.icns
-
-# Directories potentially created on remote AFP share
-.AppleDB
-.AppleDesktop
-Network Trash Folder
-Temporary Items
-.apdisk
-
-test
diff --git a/README.md b/README.md
index f23cafd..b6de22c 100644
--- a/README.md
+++ b/README.md
@@ -2,107 +2,148 @@
Написание числительных на русском языке с учётом пола и падежа.
-# Установка
+## Использование в NodeJS
```
npm install --save numeralize-ru
```
-# API
-
-### `numeralize(number, [gender, [kase, [animate]]])`
-
-Возвращает числительное, соответствующее числу
-
-+ `number` — число, для которого надо записать числительное;
-+ `gender` — пол:
- + `numeralize.GENDER_MASCULINE` — мужской (по умолчанию);
- + `numeralize.GENDER_FEMININE` — женский;
- + `numeralize.GENDER_NEUTER` — средний;
-+ `kase` — падеж (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
- + `numeralize.CASE_NOMINATIVE` — именительный (по умолчанию);
- + `numeralize.CASE_GENITIVE` — родительный;
- + `numeralize.CASE_DATIVE` — дательный;
- + `numeralize.CASE_ACCUSATIVE` — винительный;
- + `numeralize.CASE_INSTRUMENTAL` — творительный;
- + `numeralize.CASE_PREPOSITIONAL` — предложный;
-+ `animate` — являются ли перечисляемые предметы одушевлёнными (влияет на форму винительного падежа некоторых числительных)
-
```javascript
-const numeralize = require('numeralize-ru');
+import {numeralize, Case, Gender} from "numeralize-ru";
-numeralize(5122981121);
-// мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
-
-numeralize(5122981121, numeralize.GENDER_FEMININE);
-// женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
-
-numeralize(5122981121, numeralize.GENDER_NEUTER);
-// средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
-
-numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_NOMINATIVE);
-// мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
-
-numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_GENITIVE);
-// мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
-
-numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_DATIVE);
-// мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
-
-numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_ACCUSATIVE);
-// мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
-
-numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_ACCUSATIVE, true);
-// мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
-
-numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_INSTRUMENTAL);
-// мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
-
-numeralize(5122981121, numeralize.GENDER_MASCULINE, numeralize.CASE_PREPOSITIONAL);
-// мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
+console.log(numeralize(5122981121, Gender.Masculine, Case.Nominative));
```
-### `numeralize.pluralize(count, one, two, five)`
+## Использование в [дореволюционных](https://caniuse.com/?search=ESM) браузерах
-Выбирает нужную форму существительного в зависимости от количества.
-
-+ `count` — количество
-+ `one` — форма существительного для одного предмета, например, _рубль_;
-+ `two` — форма существительного для двух предметов, например, _рубля_;
-+ `five` — форма существительного для пяти предметов, например, _рублей_;
-
-```javascript
-const pluralize = require('numeralize-ru').pluralize;
-
-pluralize(0, 'рубль', 'рубля', 'рублей');
-// 'рублей'
-
-pluralize(1, 'рубль', 'рубля', 'рублей');
-// 'рубль'
-
-pluralize(2, 'рубль', 'рубля', 'рублей');
-// 'рубля'
-
-pluralize(5, 'рубль', 'рубля', 'рублей');
-// 'рублей'
-
-pluralize(11, 'рубль', 'рубля', 'рублей');
-// 'рублей'
-
-pluralize(21, 'рубль', 'рубля', 'рублей');
-// 'рубль'
-
-pluralize(22, 'рубль', 'рубля', 'рублей');
-// 'рубля'
+```html
+
+
```
+## API
-# Roadmap
+```typescript
+/**
+ * Возвращает числительное, соответствующее числу
+ *
+ * @param {number} number Целое число, для которого надо записать числительное
+ *
+ * @param {Gender} [gender=Gender.Masculine] Пол:
+ * - {@link Gender.Masculine} – мужской (по умолчанию);
+ * - {@link Gender.Feminine} – женский;
+ * - {@link Gender.Neuter} – средний.
+ *
+ * @param {Case} [kase=Case.Nominative] Падеж
+ * (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
+ * - {@link Case.Nominative} — именительный (по умолчанию);
+ * - {@link Case.Genitive} — родительный;
+ * - {@link Case.Dative} — дательный;
+ * - {@link Case.Accusative} — винительный;
+ * - {@link Case.Instrumental} — творительный;
+ * - {@link Case.Prepositional} — предложный.
+ *
+ * @param {boolean} [animate=false] Являются ли перечисляемые предметы одушевлёнными
+ * (влияет на форму винительного падежа некоторых числительных)
+ *
+ * @example
+ * // мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
+ * numeralize(5122981121);
+ *
+ * @example
+ * // женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
+ * numeralize(5122981121, Gender.Feminine);
+ *
+ * @example
+ * // средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
+ * numeralize(5122981121, Gender.Neuter);
+ *
+ * @example
+ * // мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
+ * numeralize(5122981121, Gender.Masculine, Case.Nominative);
+ *
+ * @example
+ * // мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
+ * numeralize(5122981121, Gender.Masculine, Case.Genitive);
+ *
+ * @example
+ * // мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
+ * numeralize(5122981121, Gender.Masculine, Case.Dative);
+ *
+ * @example
+ * // мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
+ * numeralize(5122981121, Gender.Masculine, Case.Accusative);
+ *
+ * @example
+ * // мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
+ * numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
+ *
+ * @example
+ * // мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
+ * numeralize(5122981121, Gender.Masculine, Case.Instrumental);
+ *
+ * @example
+ * // мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
+ * numeralize(5122981121, Gender.Masculine, Case.Prepositional);
+ */
+declare function numeralize(
+ number: number,
+ gender: Gender = Gender.Masculine,
+ kase: Case = Case.Nominative,
+ animate: boolean = false
+): string;
-+ Порядковые числительные (ordinal numerals): _первый_, _вторым_, _третьими_ и т.д.
-+ Собирательные числительные (collective numerals): _трое_, _четверых_, _пятерыми_ и т.д.
-+ Особые формы единственного и множественного числа: _одни сутки_, _два дня_, _пять суток_ и т.д.
+/**
+ * Выбирает нужную форму существительного в зависимости от количества.
+ *
+ * @param {number} count Количество
+ * @param {string} one Форма существительного для одного предмета, например, «рубль»;
+ * @param {string} two Форма существительного для двух предметов, например, «рубля»;
+ * @param {string} five Форма существительного для пяти предмета, например, «рублей»;
+ *
+ * @example
+ * // 'рублей'
+ * pluralize(0, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубль'
+ * pluralize(1, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубля'
+ * pluralize(2, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рублей'
+ * pluralize(5, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рублей'
+ * pluralize(11, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубль'
+ * pluralize(21, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубля'
+ * pluralize(22, 'рубль', 'рубля', 'рублей');
+ */
+declare function pluralize(count: number, one: string, two: string, five: string): string
+```
-# См.также
+## Спонсорство
+
+[Стать первым спонсором проекта](https://github.com/sponsors/anotherpit)
+
+## Roadmap
+
+* Порядковые числительные (ordinal numerals): _первый_, _вторым_, _третьими_ и т.д.
+* Собирательные числительные (collective numerals): _трое_, _четверых_, _пятерыми_ и т.д.
+* Особые формы единственного и множественного числа: _одни сутки_, _два дня_, _пять суток_ и т.д.
+
+## См.также
+ Подробно о склонении числительных в русском языке с примерами: http://numeralonline.ru/
diff --git a/index.d.ts b/index.d.ts
deleted file mode 100644
index 73b2fe2..0000000
--- a/index.d.ts
+++ /dev/null
@@ -1,20 +0,0 @@
-export = numeralize;
-
-declare function numeralize(number: number, gender?: numeralize.Gender, kase?: numeralize.Case, animate?: boolean): string;
-
-declare namespace numeralize {
- export type Gender = number;
- export const GENDER_MASCULINE: Gender;
- export const GENDER_FEMININE: Gender;
- export const GENDER_NEUTER: Gender;
-
- export type Case = number;
- export const CASE_NOMINATIVE: Case;
- export const CASE_GENITIVE: Case;
- export const CASE_DATIVE: Case;
- export const CASE_ACCUSATIVE: Case;
- export const CASE_INSTRUMENTAL: Case;
- export const CASE_PREPOSITIONAL: Case;
-
- export function pluralize(count: number, one: string, two: string, five: string): string;
-}
diff --git a/index.js b/index.js
deleted file mode 100644
index 7263b12..0000000
--- a/index.js
+++ /dev/null
@@ -1,240 +0,0 @@
-;(function(root, factory) {
- if (typeof define === 'function' && define.amd) {
- define([], factory);
- } else if (typeof exports === 'object') {
- module.exports = factory();
- } else {
- root.numeralize = factory();
- }
-}(this, function() {
- 'use strict';
-
- /**
- * Numeralize number
- * @param {number} number Integer
- * @param {number} [gender=numeralize.GENDER_MASCULINE]
- * @param {number} [kase=numeralize.CASE_NOMINATIVE]
- * @param {boolean} [animate=false]
- * @returns {string}
- */
- function numeralize(number, gender, kase, animate) {
- // Normalize params
- number = Math.abs(parseInt(number, 10));
- gender = gender || numeralize.GENDER_MASCULINE;
- kase = kase || numeralize.CASE_NOMINATIVE;
- animate = !!animate;
-
- // Collect chunks
- var result = [];
-
- // Descend known powers of thousand
- for (var l = LARGES.length, i = l; i >= 0; i--) {
- var base = Math.pow(10, i * 3);
- var current = Math.floor(number / base);
- number = number % base;
-
- if (current) {
- var words = i ? LARGES[i] : null;
- var numeral = small(current, words ? words[0] : gender, kase, words ? false : animate);
- if (numeral) {
- result.push(numeral);
- if (words) {
- var plural = pluralize.apply(null, [current].concat(words[kase + 1]));
- result.push(plural);
- }
- }
- }
- }
-
- // Zero
- if (!result.length) {
- return MINORS[0][kase];
- }
-
- // Return
- return result.join(" ");
- }
-
- /**
- * Numeralize small number (< 1000)
- * @private
- * @param {number} number Non-negative integer < 1000
- * @param {number} gender
- * @param {number} kase
- * @param {boolean} animate
- * @returns {string}
- */
- function small(number, gender, kase, animate) {
- // Zero
- if (0 === number) { return ""; }
-
- // Collect chunks
- var result = [];
-
- // Hundreds
- var hundreds = Math.floor(number / 100);
- if (HUNDREDS[hundreds]) {
- result.push(HUNDREDS[hundreds][kase]);
- }
-
- // Tens
- var tens = Math.floor(number % 100 / 10);
- if (TENS[tens]) {
- result.push(TENS[tens][kase]);
- }
-
- // Minors
- var minors = number % 100;
- if (minors >= MINORS.length) {
- minors = number % 10;
- }
- if (minors) {
- minors = MINORS[minors][kase];
- if ("string" !== typeof minors) {
- minors = minors[gender];
- if ("string" !== typeof minors) {
- minors = minors[animate ? 0 : 1];
- }
- }
- result.push(minors);
- }
-
- // Return
- return result.join(" ");
- }
-
- /**
- * Pluralize noun according to count
- * @param {number} count Number of items
- * @param {string} one E.g. «рубль»
- * @param {string} two E.g. «рубля»
- * @param {string} five E.g. «рублей»
- * @returns {string}
- */
- function pluralize(count, one, two, five) {
- count = Math.floor(Math.abs(count)) % 100;
- if (count > 10 && count < 20) {
- return five;
- }
- count = count % 10;
- if (1 === count) { return one; }
- if (count >= 2 && count <= 4) { return two; }
- return five;
- }
-
- numeralize.GENDER_MASCULINE = 0;
- numeralize.GENDER_FEMININE = 1;
- numeralize.GENDER_NEUTER = 2;
-
- numeralize.CASE_NOMINATIVE = 0;
- numeralize.CASE_GENITIVE = 1;
- numeralize.CASE_DATIVE = 2;
- numeralize.CASE_ACCUSATIVE = 3;
- numeralize.CASE_INSTRUMENTAL = 4;
- numeralize.CASE_PREPOSITIONAL = 5;
-
- numeralize.pluralize = pluralize;
-
- var MINORS = [
- ['ноль', 'нуля', 'нулю', 'ноль', 'нулём', 'нуле'],
- [
- ['один', 'одна', 'одно'],
- ['одного', 'одной', 'одного'],
- ['одному', 'одной', 'одному'],
- [['одного', 'один'], 'одну', 'одно'],
- ['одним', 'одной', 'одним'],
- ['одном', 'одной', 'одном']
- ],
- [
- ['два', 'две', 'два'],
- 'двух',
- 'двум',
- [['двух', 'два'], ['двух', 'две'], 'два'],
- 'двумя',
- 'двух'
- ],
- [
- 'три',
- 'трёх',
- 'трём',
- [['трёх', 'три'], ['трёх', 'три'], 'три'],
- 'тремя',
- 'трёх'
- ],
- [
- 'четыре',
- 'четырёх',
- 'четырём',
- [['четырёх', 'четыре'], ['четырёх', 'четыре'], 'четыре'],
- 'четырьмя',
- 'четырёх'
- ],
- ['пять', 'пяти', 'пяти', 'пять', 'пятью', 'пяти'],
- ['шесть', 'шести', 'шести', 'шесть', 'шестью', 'шести'],
- ['семь', 'семи', 'семи', 'семь', 'семью', 'семи'],
- ['восемь', 'восьми', 'восьми', 'восемь', 'восемью', 'восьми'],
- ['девять', 'девяти', 'девяти', 'девять', 'девятью', 'девяти'],
- ['десять', 'десяти', 'десяти', 'десять', 'десятью', 'десяти']
- ].concat(
- ['один', 'две', 'три', 'четыр', 'пят', 'шест', 'сем', 'восем', 'девят'].map(function(prefix) {
- return ['надцать', 'надцати', 'надцати', 'надцать', 'надцатью', 'надцати'].map(function(suffix) {
- return prefix + suffix;
- });
- })
- );
-
- var TENS = [
- false,
- false,
- ['двадцать', 'двадцати', 'двадцати', 'двадцать', 'двадцатью', 'двадцати'],
- ['тридцать', 'тридцати', 'тридцати', 'тридцать', 'тридцатью', 'тридцати'],
- ['сорок', 'сорока', 'сорока', 'сорок', 'сорока', 'сорока'],
- ['пятьдесят', 'пятидесяти', 'пятидесяти', 'пятьдесят', 'пятьюдесятью', 'пятидесяти'],
- ['шестьдесят', 'шестидесяти', 'шестидесяти', 'шестьдесят', 'шестьюдесятью', 'шестидесяти'],
- ['семьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти'],
- ['восемьдесят', 'восьмидесяти', 'восьмидесяти', 'восемьдесят', 'восемьюдесятью', 'восьмидесяти'],
- ['девяносто', 'девяноста', 'девяноста', 'девяносто', 'девяноста', 'девяноста']
- ];
-
- var HUNDREDS = [
- false,
- ['сто', 'ста', 'ста', 'сто', 'ста', 'ста'],
- ['двести', 'двухсот', 'двумстам', 'двести', 'двумястами', 'двухстах'],
- ['триста', 'трёхсот', 'трёмстам', 'триста', 'тремястами', 'трёхстах'],
- ['четыреста', 'четырёхсот', 'четырёмстам', 'четыреста', 'четырьмястами', 'четырёхстах'],
- ['пятьсот', 'пятисот', 'пятистам', 'пятьсот', 'пятьюстами', 'пятистах'],
- ['шестьсот', 'шестисот', 'шестистам', 'шестьсот', 'шестьюстами', 'шестистах'],
- ['семьсот', 'семисот', 'семистам', 'семьсот', 'семьюстами', 'семистах'],
- ['восемьсот', 'восьмисот', 'восьмистам', 'восемьсот', 'восемьюстами', 'восьмистах'],
- ['девятьсот', 'девятисот', 'девятистам', 'девятьсот', 'девятьюстами', 'девятистах']
- ];
-
- var LARGES = [
- false,
- [
- numeralize.GENDER_FEMININE,
- ['тысяча', 'тысячи', 'тысяч'],
- ['тысячи', 'тысяч', 'тысяч'],
- ['тысяче', 'тысячам', 'тысячам'],
- ['тысячу', 'тысячи', 'тысяч'],
- ['тысячей', 'тысячами', 'тысячами'],
- ['тысяче', 'тысячах', 'тысячах']
- ]
- ].concat(['миллион', 'миллиард', 'триллион'].map(function(base) {
- return [numeralize.GENDER_MASCULINE]
- .concat([
- ['', 'а', 'ов'],
- ['а', 'ов', 'ов'],
- ['у', 'ам', 'ам'],
- ['', 'а', 'ов'],
- ['ом', 'ами', 'ами'],
- ['е', 'ах', 'ах']
- ].map(function(kase) {
- return kase.map(function(suffix) {
- return base + suffix;
- });
- }));
- }));
-
- return numeralize;
-}));
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..092ef43
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2839 @@
+{
+ "name": "numeralize-ru",
+ "version": "2.0.0-alpha.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "numeralize-ru",
+ "version": "2.0.0-alpha.1",
+ "license": "MIT",
+ "devDependencies": {
+ "@types/mocha": "^10.0.2",
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
+ "@typescript-eslint/parser": "^6.8.0",
+ "esbuild": "^0.19.5",
+ "eslint": "^8.51.0",
+ "mocha": "^10.2.0",
+ "ts-mocha": "^10.0.0",
+ "ts-node": "^10.9.1",
+ "typescript": "^4.9.5"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@cspotcode/source-map-support": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
+ "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "0.3.9"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz",
+ "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz",
+ "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz",
+ "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz",
+ "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz",
+ "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz",
+ "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz",
+ "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz",
+ "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz",
+ "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz",
+ "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz",
+ "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz",
+ "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz",
+ "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz",
+ "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz",
+ "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz",
+ "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz",
+ "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz",
+ "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz",
+ "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz",
+ "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz",
+ "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz",
+ "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz",
+ "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
+ "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.51.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz",
+ "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.11",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz",
+ "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+ "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.4.15",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+ "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
+ "dev": true
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
+ "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.0.3",
+ "@jridgewell/sourcemap-codec": "^1.4.10"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@tsconfig/node10": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz",
+ "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node12": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
+ "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node14": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
+ "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
+ "dev": true
+ },
+ "node_modules/@tsconfig/node16": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
+ "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
+ "dev": true
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.13",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz",
+ "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==",
+ "dev": true
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/@types/mocha": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.2.tgz",
+ "integrity": "sha512-NaHL0+0lLNhX6d9rs+NSt97WH/gIlRHmszXbQ/8/MV/eVcFNdeJ/GYhrFuUc8K7WuPhRhTSdMkCp8VMzhUq85w==",
+ "dev": true
+ },
+ "node_modules/@types/node": {
+ "version": "20.8.6",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz",
+ "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "undici-types": "~5.25.1"
+ }
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.3",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz",
+ "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==",
+ "dev": true
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.8.0.tgz",
+ "integrity": "sha512-GosF4238Tkes2SHPQ1i8f6rMtG6zlKwMEB0abqSJ3Npvos+doIlc/ATG+vX1G9coDF3Ex78zM3heXHLyWEwLUw==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/type-utils": "6.8.0",
+ "@typescript-eslint/utils": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.8.0.tgz",
+ "integrity": "sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.8.0.tgz",
+ "integrity": "sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.8.0.tgz",
+ "integrity": "sha512-RYOJdlkTJIXW7GSldUIHqc/Hkto8E+fZN96dMIFhuTJcQwdRoGN2rEWA8U6oXbLo0qufH7NPElUb+MceHtz54g==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "@typescript-eslint/utils": "6.8.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.8.0.tgz",
+ "integrity": "sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.8.0.tgz",
+ "integrity": "sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/visitor-keys": "6.8.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.8.0.tgz",
+ "integrity": "sha512-dKs1itdE2qFG4jr0dlYLQVppqTE+Itt7GmIf/vX6CSvsW+3ov8PbWauVKyyfNngokhIO9sKZeRGCUo1+N7U98Q==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.8.0",
+ "@typescript-eslint/types": "6.8.0",
+ "@typescript-eslint/typescript-estree": "6.8.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.8.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.8.0.tgz",
+ "integrity": "sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.8.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+ "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+ "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/arg": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
+ "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
+ "dev": true
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browser-stdout": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
+ "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
+ "dev": true
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/chalk/node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+ "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ ],
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
+ "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^7.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/create-require": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
+ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
+ "dev": true
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/debug/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
+ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.19.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz",
+ "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/android-arm": "0.19.5",
+ "@esbuild/android-arm64": "0.19.5",
+ "@esbuild/android-x64": "0.19.5",
+ "@esbuild/darwin-arm64": "0.19.5",
+ "@esbuild/darwin-x64": "0.19.5",
+ "@esbuild/freebsd-arm64": "0.19.5",
+ "@esbuild/freebsd-x64": "0.19.5",
+ "@esbuild/linux-arm": "0.19.5",
+ "@esbuild/linux-arm64": "0.19.5",
+ "@esbuild/linux-ia32": "0.19.5",
+ "@esbuild/linux-loong64": "0.19.5",
+ "@esbuild/linux-mips64el": "0.19.5",
+ "@esbuild/linux-ppc64": "0.19.5",
+ "@esbuild/linux-riscv64": "0.19.5",
+ "@esbuild/linux-s390x": "0.19.5",
+ "@esbuild/linux-x64": "0.19.5",
+ "@esbuild/netbsd-x64": "0.19.5",
+ "@esbuild/openbsd-x64": "0.19.5",
+ "@esbuild/sunos-x64": "0.19.5",
+ "@esbuild/win32-arm64": "0.19.5",
+ "@esbuild/win32-ia32": "0.19.5",
+ "@esbuild/win32-x64": "0.19.5"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.51.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz",
+ "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.2",
+ "@eslint/js": "8.51.0",
+ "@humanwhocodes/config-array": "^0.11.11",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz",
+ "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz",
+ "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.9",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz",
+ "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+ "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/globals": {
+ "version": "13.23.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz",
+ "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/he": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
+ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
+ "dev": true,
+ "bin": {
+ "he": "bin/he"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+ "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-error": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
+ "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
+ "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.2",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz",
+ "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mocha": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz",
+ "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "4.1.1",
+ "browser-stdout": "1.3.1",
+ "chokidar": "3.5.3",
+ "debug": "4.3.4",
+ "diff": "5.0.0",
+ "escape-string-regexp": "4.0.0",
+ "find-up": "5.0.0",
+ "glob": "7.2.0",
+ "he": "1.2.0",
+ "js-yaml": "4.1.0",
+ "log-symbols": "4.1.0",
+ "minimatch": "5.0.1",
+ "ms": "2.1.3",
+ "nanoid": "3.3.3",
+ "serialize-javascript": "6.0.0",
+ "strip-json-comments": "3.1.1",
+ "supports-color": "8.1.1",
+ "workerpool": "6.2.1",
+ "yargs": "16.2.0",
+ "yargs-parser": "20.2.4",
+ "yargs-unparser": "2.0.0"
+ },
+ "bin": {
+ "_mocha": "bin/_mocha",
+ "mocha": "bin/mocha.js"
+ },
+ "engines": {
+ "node": ">= 14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mochajs"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
+ "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
+ "dev": true,
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/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,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/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,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+ "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/rimraf/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/semver": {
+ "version": "7.5.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+ "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+ "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
+ "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==",
+ "dev": true,
+ "engines": {
+ "node": ">=16.13.0"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/ts-mocha": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/ts-mocha/-/ts-mocha-10.0.0.tgz",
+ "integrity": "sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==",
+ "dev": true,
+ "dependencies": {
+ "ts-node": "7.0.1"
+ },
+ "bin": {
+ "ts-mocha": "bin/ts-mocha"
+ },
+ "engines": {
+ "node": ">= 6.X.X"
+ },
+ "optionalDependencies": {
+ "tsconfig-paths": "^3.5.0"
+ },
+ "peerDependencies": {
+ "mocha": "^3.X.X || ^4.X.X || ^5.X.X || ^6.X.X || ^7.X.X || ^8.X.X || ^9.X.X || ^10.X.X"
+ }
+ },
+ "node_modules/ts-mocha/node_modules/diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/ts-mocha/node_modules/ts-node": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-7.0.1.tgz",
+ "integrity": "sha512-BVwVbPJRspzNh2yfslyT1PSbl5uIk03EZlb493RKHN4qej/D06n1cEhjlOJG69oFsE7OT8XjpTUcYf6pKTLMhw==",
+ "dev": true,
+ "dependencies": {
+ "arrify": "^1.0.0",
+ "buffer-from": "^1.1.0",
+ "diff": "^3.1.0",
+ "make-error": "^1.1.1",
+ "minimist": "^1.2.0",
+ "mkdirp": "^0.5.1",
+ "source-map-support": "^0.5.6",
+ "yn": "^2.0.0"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/ts-mocha/node_modules/yn": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz",
+ "integrity": "sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ts-node": {
+ "version": "10.9.1",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz",
+ "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==",
+ "dev": true,
+ "dependencies": {
+ "@cspotcode/source-map-support": "^0.8.0",
+ "@tsconfig/node10": "^1.0.7",
+ "@tsconfig/node12": "^1.0.7",
+ "@tsconfig/node14": "^1.0.0",
+ "@tsconfig/node16": "^1.0.2",
+ "acorn": "^8.4.1",
+ "acorn-walk": "^8.1.1",
+ "arg": "^4.1.0",
+ "create-require": "^1.1.0",
+ "diff": "^4.0.1",
+ "make-error": "^1.1.1",
+ "v8-compile-cache-lib": "^3.0.1",
+ "yn": "3.1.1"
+ },
+ "bin": {
+ "ts-node": "dist/bin.js",
+ "ts-node-cwd": "dist/bin-cwd.js",
+ "ts-node-esm": "dist/bin-esm.js",
+ "ts-node-script": "dist/bin-script.js",
+ "ts-node-transpile-only": "dist/bin-transpile.js",
+ "ts-script": "dist/bin-script-deprecated.js"
+ },
+ "peerDependencies": {
+ "@swc/core": ">=1.2.50",
+ "@swc/wasm": ">=1.2.50",
+ "@types/node": "*",
+ "typescript": ">=2.7"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "@swc/wasm": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ts-node/node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz",
+ "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
+ "dev": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=4.2.0"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.25.3",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz",
+ "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA==",
+ "dev": true,
+ "peer": true
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/v8-compile-cache-lib": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
+ "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
+ "dev": true
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/workerpool": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz",
+ "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==",
+ "dev": true
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/yargs": {
+ "version": "16.2.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
+ "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^7.0.2",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.0",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^20.2.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "20.2.4",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz",
+ "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yargs-unparser": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
+ "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^6.0.0",
+ "decamelize": "^4.0.0",
+ "flat": "^5.0.2",
+ "is-plain-obj": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yn": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
+ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 6b46ce6..945d27f 100644
--- a/package.json
+++ b/package.json
@@ -1,13 +1,30 @@
{
"name": "numeralize-ru",
- "version": "1.0.1",
+ "version": "2.0.0",
"description": "Russian numerals",
- "main": "index.js",
+ "type": "module",
+ "exports": {
+ ".": {
+ "types": "./lib/index.d.ts",
+ "require": "./lib/index.js",
+ "import": "./lib/index.js",
+ "default": "./lib/index.js",
+ "browser": "./lib/index.browser.js"
+ }
+ },
+ "main": "lib/index.js",
+ "files": [
+ "lib/",
+ "LICENSE.md",
+ "README.md",
+ "package.json"
+ ],
"scripts": {
- "test": "npm run test:js; npm run test:ts",
- "test:js": "./node_modules/.bin/mocha",
- "test:ts": "./node_modules/.bin/tsc ./test/*.d.spec.ts --noEmit --noImplicitAny --strictNullChecks --target ES6",
- "dev": "./node_modules/.bin/mocha --watch"
+ "dev": "ts-mocha src/**.spec.ts -w --watch-files 'src/**.ts'",
+ "test": "ts-mocha src/**.spec.ts",
+ "lint": "eslint src/*",
+ "build": "rm -rf ./lib && tsc --build && esbuild ./lib/index.js --outfile=lib/index.browser.js --format=iife --global-name=numeralize",
+ "prepublish": "npm run lint && npm run test && npm run build"
},
"keywords": [
"russian",
@@ -23,11 +40,18 @@
"author": "anotherpit ",
"license": "MIT",
"devDependencies": {
- "mocha": "^2.4.5",
- "typescript": "^2.0.10"
+ "@types/mocha": "^10.0.2",
+ "@typescript-eslint/eslint-plugin": "^6.8.0",
+ "@typescript-eslint/parser": "^6.8.0",
+ "esbuild": "^0.19.5",
+ "eslint": "^8.51.0",
+ "mocha": "^10.2.0",
+ "ts-mocha": "^10.0.0",
+ "ts-node": "^10.9.1",
+ "typescript": "^4.9.5"
},
"repository": {
"type": "git",
- "url": "https://github.com/anotherpit/numeralize-ru.git"
+ "url": "git+https://github.com/anotherpit/numeralize-ru.git"
}
}
diff --git a/src/index.spec.ts b/src/index.spec.ts
new file mode 100644
index 0000000..1f7010c
--- /dev/null
+++ b/src/index.spec.ts
@@ -0,0 +1,1029 @@
+import {numeralize, Gender, Case} from "./index";
+import * as assert from "assert";
+
+describe(numeralize.name, () => {
+ type SimpleTestCase = Array;
+ type ComplexTestCase = Array<[Gender, ...Array<[Case, [true, string], [false, string]]>]>;
+
+ function isComplex(testCase: SimpleTestCase | ComplexTestCase): testCase is ComplexTestCase {
+ return Array.isArray(testCase[0])
+ }
+
+ const testCases: Array<
+ [string, ...Array<
+ [number, ...(SimpleTestCase | ComplexTestCase)]
+ >]
+ > = [
+ ['0 to 19 (minors)',
+ [1,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'один'], [false, 'один']],
+ [Case.Genitive, [true, 'одного'], [false, 'одного']],
+ [Case.Dative, [true, 'одному'], [false, 'одному']],
+ [Case.Accusative, [true, 'одного'], [false, 'один']],
+ [Case.Instrumental, [true, 'одним'], [false, 'одним']],
+ [Case.Prepositional, [true, 'одном'], [false, 'одном']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'одна'], [false, 'одна']],
+ [Case.Genitive, [true, 'одной'], [false, 'одной']],
+ [Case.Dative, [true, 'одной'], [false, 'одной']],
+ [Case.Accusative, [true, 'одну'], [false, 'одну']],
+ [Case.Instrumental, [true, 'одной'], [false, 'одной']],
+ [Case.Prepositional, [true, 'одной'], [false, 'одной']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'одно'], [false, 'одно']],
+ [Case.Genitive, [true, 'одного'], [false, 'одного']],
+ [Case.Dative, [true, 'одному'], [false, 'одному']],
+ [Case.Accusative, [true, 'одно'], [false, 'одно']],
+ [Case.Instrumental, [true, 'одним'], [false, 'одним']],
+ [Case.Prepositional, [true, 'одном'], [false, 'одном']]]],
+ [2,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'два'], [false, 'два']],
+ [Case.Genitive, [true, 'двух'], [false, 'двух']],
+ [Case.Dative, [true, 'двум'], [false, 'двум']],
+ [Case.Accusative, [true, 'двух'], [false, 'два']],
+ [Case.Instrumental, [true, 'двумя'], [false, 'двумя']],
+ [Case.Prepositional, [true, 'двух'], [false, 'двух']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'две'], [false, 'две']],
+ [Case.Genitive, [true, 'двух'], [false, 'двух']],
+ [Case.Dative, [true, 'двум'], [false, 'двум']],
+ [Case.Accusative, [true, 'двух'], [false, 'две']],
+ [Case.Instrumental, [true, 'двумя'], [false, 'двумя']],
+ [Case.Prepositional, [true, 'двух'], [false, 'двух']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'два'], [false, 'два']],
+ [Case.Genitive, [true, 'двух'], [false, 'двух']],
+ [Case.Dative, [true, 'двум'], [false, 'двум']],
+ [Case.Accusative, [true, 'два'], [false, 'два']],
+ [Case.Instrumental, [true, 'двумя'], [false, 'двумя']],
+ [Case.Prepositional, [true, 'двух'], [false, 'двух']]]],
+ [3,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'три'], [false, 'три']],
+ [Case.Genitive, [true, 'трёх'], [false, 'трёх']],
+ [Case.Dative, [true, 'трём'], [false, 'трём']],
+ [Case.Accusative, [true, 'трёх'], [false, 'три']],
+ [Case.Instrumental, [true, 'тремя'], [false, 'тремя']],
+ [Case.Prepositional, [true, 'трёх'], [false, 'трёх']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'три'], [false, 'три']],
+ [Case.Genitive, [true, 'трёх'], [false, 'трёх']],
+ [Case.Dative, [true, 'трём'], [false, 'трём']],
+ [Case.Accusative, [true, 'трёх'], [false, 'три']],
+ [Case.Instrumental, [true, 'тремя'], [false, 'тремя']],
+ [Case.Prepositional, [true, 'трёх'], [false, 'трёх']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'три'], [false, 'три']],
+ [Case.Genitive, [true, 'трёх'], [false, 'трёх']],
+ [Case.Dative, [true, 'трём'], [false, 'трём']],
+ [Case.Accusative, [true, 'три'], [false, 'три']],
+ [Case.Instrumental, [true, 'тремя'], [false, 'тремя']],
+ [Case.Prepositional, [true, 'трёх'], [false, 'трёх']]]],
+ [4,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'четыре'], [false, 'четыре']],
+ [Case.Genitive, [true, 'четырёх'], [false, 'четырёх']],
+ [Case.Dative, [true, 'четырём'], [false, 'четырём']],
+ [Case.Accusative, [true, 'четырёх'], [false, 'четыре']],
+ [Case.Instrumental,
+ [true, 'четырьмя'],
+ [false, 'четырьмя']],
+ [Case.Prepositional,
+ [true, 'четырёх'],
+ [false, 'четырёх']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'четыре'], [false, 'четыре']],
+ [Case.Genitive, [true, 'четырёх'], [false, 'четырёх']],
+ [Case.Dative, [true, 'четырём'], [false, 'четырём']],
+ [Case.Accusative, [true, 'четырёх'], [false, 'четыре']],
+ [Case.Instrumental,
+ [true, 'четырьмя'],
+ [false, 'четырьмя']],
+ [Case.Prepositional,
+ [true, 'четырёх'],
+ [false, 'четырёх']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'четыре'], [false, 'четыре']],
+ [Case.Genitive, [true, 'четырёх'], [false, 'четырёх']],
+ [Case.Dative, [true, 'четырём'], [false, 'четырём']],
+ [Case.Accusative, [true, 'четыре'], [false, 'четыре']],
+ [Case.Instrumental,
+ [true, 'четырьмя'],
+ [false, 'четырьмя']],
+ [Case.Prepositional,
+ [true, 'четырёх'],
+ [false, 'четырёх']]]],
+ [5,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'пять'], [false, 'пять']],
+ [Case.Genitive, [true, 'пяти'], [false, 'пяти']],
+ [Case.Dative, [true, 'пяти'], [false, 'пяти']],
+ [Case.Accusative, [true, 'пять'], [false, 'пять']],
+ [Case.Instrumental, [true, 'пятью'], [false, 'пятью']],
+ [Case.Prepositional, [true, 'пяти'], [false, 'пяти']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'пять'], [false, 'пять']],
+ [Case.Genitive, [true, 'пяти'], [false, 'пяти']],
+ [Case.Dative, [true, 'пяти'], [false, 'пяти']],
+ [Case.Accusative, [true, 'пять'], [false, 'пять']],
+ [Case.Instrumental, [true, 'пятью'], [false, 'пятью']],
+ [Case.Prepositional, [true, 'пяти'], [false, 'пяти']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'пять'], [false, 'пять']],
+ [Case.Genitive, [true, 'пяти'], [false, 'пяти']],
+ [Case.Dative, [true, 'пяти'], [false, 'пяти']],
+ [Case.Accusative, [true, 'пять'], [false, 'пять']],
+ [Case.Instrumental, [true, 'пятью'], [false, 'пятью']],
+ [Case.Prepositional, [true, 'пяти'], [false, 'пяти']]]],
+ [6,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'шесть'], [false, 'шесть']],
+ [Case.Genitive, [true, 'шести'], [false, 'шести']],
+ [Case.Dative, [true, 'шести'], [false, 'шести']],
+ [Case.Accusative, [true, 'шесть'], [false, 'шесть']],
+ [Case.Instrumental, [true, 'шестью'], [false, 'шестью']],
+ [Case.Prepositional, [true, 'шести'], [false, 'шести']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'шесть'], [false, 'шесть']],
+ [Case.Genitive, [true, 'шести'], [false, 'шести']],
+ [Case.Dative, [true, 'шести'], [false, 'шести']],
+ [Case.Accusative, [true, 'шесть'], [false, 'шесть']],
+ [Case.Instrumental, [true, 'шестью'], [false, 'шестью']],
+ [Case.Prepositional, [true, 'шести'], [false, 'шести']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'шесть'], [false, 'шесть']],
+ [Case.Genitive, [true, 'шести'], [false, 'шести']],
+ [Case.Dative, [true, 'шести'], [false, 'шести']],
+ [Case.Accusative, [true, 'шесть'], [false, 'шесть']],
+ [Case.Instrumental, [true, 'шестью'], [false, 'шестью']],
+ [Case.Prepositional, [true, 'шести'], [false, 'шести']]]],
+ [7,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'семь'], [false, 'семь']],
+ [Case.Genitive, [true, 'семи'], [false, 'семи']],
+ [Case.Dative, [true, 'семи'], [false, 'семи']],
+ [Case.Accusative, [true, 'семь'], [false, 'семь']],
+ [Case.Instrumental, [true, 'семью'], [false, 'семью']],
+ [Case.Prepositional, [true, 'семи'], [false, 'семи']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'семь'], [false, 'семь']],
+ [Case.Genitive, [true, 'семи'], [false, 'семи']],
+ [Case.Dative, [true, 'семи'], [false, 'семи']],
+ [Case.Accusative, [true, 'семь'], [false, 'семь']],
+ [Case.Instrumental, [true, 'семью'], [false, 'семью']],
+ [Case.Prepositional, [true, 'семи'], [false, 'семи']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'семь'], [false, 'семь']],
+ [Case.Genitive, [true, 'семи'], [false, 'семи']],
+ [Case.Dative, [true, 'семи'], [false, 'семи']],
+ [Case.Accusative, [true, 'семь'], [false, 'семь']],
+ [Case.Instrumental, [true, 'семью'], [false, 'семью']],
+ [Case.Prepositional, [true, 'семи'], [false, 'семи']]]],
+ [8,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'восемь'], [false, 'восемь']],
+ [Case.Genitive, [true, 'восьми'], [false, 'восьми']],
+ [Case.Dative, [true, 'восьми'], [false, 'восьми']],
+ [Case.Accusative, [true, 'восемь'], [false, 'восемь']],
+ [Case.Instrumental,
+ [true, 'восемью'],
+ [false, 'восемью']],
+ [Case.Prepositional, [true, 'восьми'], [false, 'восьми']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'восемь'], [false, 'восемь']],
+ [Case.Genitive, [true, 'восьми'], [false, 'восьми']],
+ [Case.Dative, [true, 'восьми'], [false, 'восьми']],
+ [Case.Accusative, [true, 'восемь'], [false, 'восемь']],
+ [Case.Instrumental,
+ [true, 'восемью'],
+ [false, 'восемью']],
+ [Case.Prepositional, [true, 'восьми'], [false, 'восьми']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'восемь'], [false, 'восемь']],
+ [Case.Genitive, [true, 'восьми'], [false, 'восьми']],
+ [Case.Dative, [true, 'восьми'], [false, 'восьми']],
+ [Case.Accusative, [true, 'восемь'], [false, 'восемь']],
+ [Case.Instrumental,
+ [true, 'восемью'],
+ [false, 'восемью']],
+ [Case.Prepositional, [true, 'восьми'], [false, 'восьми']]]],
+ [9,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'девять'], [false, 'девять']],
+ [Case.Genitive, [true, 'девяти'], [false, 'девяти']],
+ [Case.Dative, [true, 'девяти'], [false, 'девяти']],
+ [Case.Accusative, [true, 'девять'], [false, 'девять']],
+ [Case.Instrumental,
+ [true, 'девятью'],
+ [false, 'девятью']],
+ [Case.Prepositional, [true, 'девяти'], [false, 'девяти']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'девять'], [false, 'девять']],
+ [Case.Genitive, [true, 'девяти'], [false, 'девяти']],
+ [Case.Dative, [true, 'девяти'], [false, 'девяти']],
+ [Case.Accusative, [true, 'девять'], [false, 'девять']],
+ [Case.Instrumental,
+ [true, 'девятью'],
+ [false, 'девятью']],
+ [Case.Prepositional, [true, 'девяти'], [false, 'девяти']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'девять'], [false, 'девять']],
+ [Case.Genitive, [true, 'девяти'], [false, 'девяти']],
+ [Case.Dative, [true, 'девяти'], [false, 'девяти']],
+ [Case.Accusative, [true, 'девять'], [false, 'девять']],
+ [Case.Instrumental,
+ [true, 'девятью'],
+ [false, 'девятью']],
+ [Case.Prepositional, [true, 'девяти'], [false, 'девяти']]]],
+ [10,
+ [Gender.Masculine,
+ [Case.Nominative, [true, 'десять'], [false, 'десять']],
+ [Case.Genitive, [true, 'десяти'], [false, 'десяти']],
+ [Case.Dative, [true, 'десяти'], [false, 'десяти']],
+ [Case.Accusative, [true, 'десять'], [false, 'десять']],
+ [Case.Instrumental,
+ [true, 'десятью'],
+ [false, 'десятью']],
+ [Case.Prepositional, [true, 'десяти'], [false, 'десяти']]],
+ [Gender.Feminine,
+ [Case.Nominative, [true, 'десять'], [false, 'десять']],
+ [Case.Genitive, [true, 'десяти'], [false, 'десяти']],
+ [Case.Dative, [true, 'десяти'], [false, 'десяти']],
+ [Case.Accusative, [true, 'десять'], [false, 'десять']],
+ [Case.Instrumental,
+ [true, 'десятью'],
+ [false, 'десятью']],
+ [Case.Prepositional, [true, 'десяти'], [false, 'десяти']]],
+ [Gender.Neuter,
+ [Case.Nominative, [true, 'десять'], [false, 'десять']],
+ [Case.Genitive, [true, 'десяти'], [false, 'десяти']],
+ [Case.Dative, [true, 'десяти'], [false, 'десяти']],
+ [Case.Accusative, [true, 'десять'], [false, 'десять']],
+ [Case.Instrumental,
+ [true, 'десятью'],
+ [false, 'десятью']],
+ [Case.Prepositional, [true, 'десяти'], [false, 'десяти']]]],
+ [11,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'одиннадцать'],
+ [false, 'одиннадцать']],
+ [Case.Genitive,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']],
+ [Case.Dative,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']],
+ [Case.Accusative,
+ [true, 'одиннадцать'],
+ [false, 'одиннадцать']],
+ [Case.Instrumental,
+ [true, 'одиннадцатью'],
+ [false, 'одиннадцатью']],
+ [Case.Prepositional,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'одиннадцать'],
+ [false, 'одиннадцать']],
+ [Case.Genitive,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']],
+ [Case.Dative,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']],
+ [Case.Accusative,
+ [true, 'одиннадцать'],
+ [false, 'одиннадцать']],
+ [Case.Instrumental,
+ [true, 'одиннадцатью'],
+ [false, 'одиннадцатью']],
+ [Case.Prepositional,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'одиннадцать'],
+ [false, 'одиннадцать']],
+ [Case.Genitive,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']],
+ [Case.Dative,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']],
+ [Case.Accusative,
+ [true, 'одиннадцать'],
+ [false, 'одиннадцать']],
+ [Case.Instrumental,
+ [true, 'одиннадцатью'],
+ [false, 'одиннадцатью']],
+ [Case.Prepositional,
+ [true, 'одиннадцати'],
+ [false, 'одиннадцати']]]],
+ [12,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'двенадцать'],
+ [false, 'двенадцать']],
+ [Case.Genitive,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']],
+ [Case.Dative,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']],
+ [Case.Accusative,
+ [true, 'двенадцать'],
+ [false, 'двенадцать']],
+ [Case.Instrumental,
+ [true, 'двенадцатью'],
+ [false, 'двенадцатью']],
+ [Case.Prepositional,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'двенадцать'],
+ [false, 'двенадцать']],
+ [Case.Genitive,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']],
+ [Case.Dative,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']],
+ [Case.Accusative,
+ [true, 'двенадцать'],
+ [false, 'двенадцать']],
+ [Case.Instrumental,
+ [true, 'двенадцатью'],
+ [false, 'двенадцатью']],
+ [Case.Prepositional,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'двенадцать'],
+ [false, 'двенадцать']],
+ [Case.Genitive,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']],
+ [Case.Dative,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']],
+ [Case.Accusative,
+ [true, 'двенадцать'],
+ [false, 'двенадцать']],
+ [Case.Instrumental,
+ [true, 'двенадцатью'],
+ [false, 'двенадцатью']],
+ [Case.Prepositional,
+ [true, 'двенадцати'],
+ [false, 'двенадцати']]]],
+ [13,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'тринадцать'],
+ [false, 'тринадцать']],
+ [Case.Genitive,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']],
+ [Case.Dative,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']],
+ [Case.Accusative,
+ [true, 'тринадцать'],
+ [false, 'тринадцать']],
+ [Case.Instrumental,
+ [true, 'тринадцатью'],
+ [false, 'тринадцатью']],
+ [Case.Prepositional,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'тринадцать'],
+ [false, 'тринадцать']],
+ [Case.Genitive,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']],
+ [Case.Dative,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']],
+ [Case.Accusative,
+ [true, 'тринадцать'],
+ [false, 'тринадцать']],
+ [Case.Instrumental,
+ [true, 'тринадцатью'],
+ [false, 'тринадцатью']],
+ [Case.Prepositional,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'тринадцать'],
+ [false, 'тринадцать']],
+ [Case.Genitive,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']],
+ [Case.Dative,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']],
+ [Case.Accusative,
+ [true, 'тринадцать'],
+ [false, 'тринадцать']],
+ [Case.Instrumental,
+ [true, 'тринадцатью'],
+ [false, 'тринадцатью']],
+ [Case.Prepositional,
+ [true, 'тринадцати'],
+ [false, 'тринадцати']]]],
+ [14,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'четырнадцать'],
+ [false, 'четырнадцать']],
+ [Case.Genitive,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']],
+ [Case.Dative,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']],
+ [Case.Accusative,
+ [true, 'четырнадцать'],
+ [false, 'четырнадцать']],
+ [Case.Instrumental,
+ [true, 'четырнадцатью'],
+ [false, 'четырнадцатью']],
+ [Case.Prepositional,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'четырнадцать'],
+ [false, 'четырнадцать']],
+ [Case.Genitive,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']],
+ [Case.Dative,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']],
+ [Case.Accusative,
+ [true, 'четырнадцать'],
+ [false, 'четырнадцать']],
+ [Case.Instrumental,
+ [true, 'четырнадцатью'],
+ [false, 'четырнадцатью']],
+ [Case.Prepositional,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'четырнадцать'],
+ [false, 'четырнадцать']],
+ [Case.Genitive,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']],
+ [Case.Dative,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']],
+ [Case.Accusative,
+ [true, 'четырнадцать'],
+ [false, 'четырнадцать']],
+ [Case.Instrumental,
+ [true, 'четырнадцатью'],
+ [false, 'четырнадцатью']],
+ [Case.Prepositional,
+ [true, 'четырнадцати'],
+ [false, 'четырнадцати']]]],
+ [15,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'пятнадцать'],
+ [false, 'пятнадцать']],
+ [Case.Genitive,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']],
+ [Case.Dative,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']],
+ [Case.Accusative,
+ [true, 'пятнадцать'],
+ [false, 'пятнадцать']],
+ [Case.Instrumental,
+ [true, 'пятнадцатью'],
+ [false, 'пятнадцатью']],
+ [Case.Prepositional,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'пятнадцать'],
+ [false, 'пятнадцать']],
+ [Case.Genitive,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']],
+ [Case.Dative,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']],
+ [Case.Accusative,
+ [true, 'пятнадцать'],
+ [false, 'пятнадцать']],
+ [Case.Instrumental,
+ [true, 'пятнадцатью'],
+ [false, 'пятнадцатью']],
+ [Case.Prepositional,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'пятнадцать'],
+ [false, 'пятнадцать']],
+ [Case.Genitive,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']],
+ [Case.Dative,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']],
+ [Case.Accusative,
+ [true, 'пятнадцать'],
+ [false, 'пятнадцать']],
+ [Case.Instrumental,
+ [true, 'пятнадцатью'],
+ [false, 'пятнадцатью']],
+ [Case.Prepositional,
+ [true, 'пятнадцати'],
+ [false, 'пятнадцати']]]],
+ [16,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'шестнадцать'],
+ [false, 'шестнадцать']],
+ [Case.Genitive,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']],
+ [Case.Dative,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']],
+ [Case.Accusative,
+ [true, 'шестнадцать'],
+ [false, 'шестнадцать']],
+ [Case.Instrumental,
+ [true, 'шестнадцатью'],
+ [false, 'шестнадцатью']],
+ [Case.Prepositional,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'шестнадцать'],
+ [false, 'шестнадцать']],
+ [Case.Genitive,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']],
+ [Case.Dative,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']],
+ [Case.Accusative,
+ [true, 'шестнадцать'],
+ [false, 'шестнадцать']],
+ [Case.Instrumental,
+ [true, 'шестнадцатью'],
+ [false, 'шестнадцатью']],
+ [Case.Prepositional,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'шестнадцать'],
+ [false, 'шестнадцать']],
+ [Case.Genitive,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']],
+ [Case.Dative,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']],
+ [Case.Accusative,
+ [true, 'шестнадцать'],
+ [false, 'шестнадцать']],
+ [Case.Instrumental,
+ [true, 'шестнадцатью'],
+ [false, 'шестнадцатью']],
+ [Case.Prepositional,
+ [true, 'шестнадцати'],
+ [false, 'шестнадцати']]]],
+ [17,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'семнадцать'],
+ [false, 'семнадцать']],
+ [Case.Genitive,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']],
+ [Case.Dative,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']],
+ [Case.Accusative,
+ [true, 'семнадцать'],
+ [false, 'семнадцать']],
+ [Case.Instrumental,
+ [true, 'семнадцатью'],
+ [false, 'семнадцатью']],
+ [Case.Prepositional,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'семнадцать'],
+ [false, 'семнадцать']],
+ [Case.Genitive,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']],
+ [Case.Dative,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']],
+ [Case.Accusative,
+ [true, 'семнадцать'],
+ [false, 'семнадцать']],
+ [Case.Instrumental,
+ [true, 'семнадцатью'],
+ [false, 'семнадцатью']],
+ [Case.Prepositional,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'семнадцать'],
+ [false, 'семнадцать']],
+ [Case.Genitive,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']],
+ [Case.Dative,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']],
+ [Case.Accusative,
+ [true, 'семнадцать'],
+ [false, 'семнадцать']],
+ [Case.Instrumental,
+ [true, 'семнадцатью'],
+ [false, 'семнадцатью']],
+ [Case.Prepositional,
+ [true, 'семнадцати'],
+ [false, 'семнадцати']]]],
+ [18,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'восемнадцать'],
+ [false, 'восемнадцать']],
+ [Case.Genitive,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']],
+ [Case.Dative,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']],
+ [Case.Accusative,
+ [true, 'восемнадцать'],
+ [false, 'восемнадцать']],
+ [Case.Instrumental,
+ [true, 'восемнадцатью'],
+ [false, 'восемнадцатью']],
+ [Case.Prepositional,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'восемнадцать'],
+ [false, 'восемнадцать']],
+ [Case.Genitive,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']],
+ [Case.Dative,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']],
+ [Case.Accusative,
+ [true, 'восемнадцать'],
+ [false, 'восемнадцать']],
+ [Case.Instrumental,
+ [true, 'восемнадцатью'],
+ [false, 'восемнадцатью']],
+ [Case.Prepositional,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'восемнадцать'],
+ [false, 'восемнадцать']],
+ [Case.Genitive,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']],
+ [Case.Dative,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']],
+ [Case.Accusative,
+ [true, 'восемнадцать'],
+ [false, 'восемнадцать']],
+ [Case.Instrumental,
+ [true, 'восемнадцатью'],
+ [false, 'восемнадцатью']],
+ [Case.Prepositional,
+ [true, 'восемнадцати'],
+ [false, 'восемнадцати']]]],
+ [19,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'девятнадцать'],
+ [false, 'девятнадцать']],
+ [Case.Genitive,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']],
+ [Case.Dative,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']],
+ [Case.Accusative,
+ [true, 'девятнадцать'],
+ [false, 'девятнадцать']],
+ [Case.Instrumental,
+ [true, 'девятнадцатью'],
+ [false, 'девятнадцатью']],
+ [Case.Prepositional,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']]],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'девятнадцать'],
+ [false, 'девятнадцать']],
+ [Case.Genitive,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']],
+ [Case.Dative,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']],
+ [Case.Accusative,
+ [true, 'девятнадцать'],
+ [false, 'девятнадцать']],
+ [Case.Instrumental,
+ [true, 'девятнадцатью'],
+ [false, 'девятнадцатью']],
+ [Case.Prepositional,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']]],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'девятнадцать'],
+ [false, 'девятнадцать']],
+ [Case.Genitive,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']],
+ [Case.Dative,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']],
+ [Case.Accusative,
+ [true, 'девятнадцать'],
+ [false, 'девятнадцать']],
+ [Case.Instrumental,
+ [true, 'девятнадцатью'],
+ [false, 'девятнадцатью']],
+ [Case.Prepositional,
+ [true, 'девятнадцати'],
+ [false, 'девятнадцати']]
+ ]
+ ]
+ ],
+ ['10, 20,.. 90 (tens)',
+ [20, 'двадцать', 'двадцати', 'двадцати', 'двадцать', 'двадцатью', 'двадцати'],
+ [30, 'тридцать', 'тридцати', 'тридцати', 'тридцать', 'тридцатью', 'тридцати'],
+ [40, 'сорок', 'сорока', 'сорока', 'сорок', 'сорока', 'сорока'],
+ [50, 'пятьдесят', 'пятидесяти', 'пятидесяти', 'пятьдесят', 'пятьюдесятью', 'пятидесяти'],
+ [60, 'шестьдесят', 'шестидесяти', 'шестидесяти', 'шестьдесят', 'шестьюдесятью', 'шестидесяти'],
+ [70, 'семьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти'],
+ [80, 'восемьдесят', 'восьмидесяти', 'восьмидесяти', 'восемьдесят', 'восемьюдесятью', 'восьмидесяти'],
+ [90, 'девяносто', 'девяноста', 'девяноста', 'девяносто', 'девяноста', 'девяноста']
+ ],
+ ['100, 200,.. 900 (hundreds)',
+ [100, 'сто', 'ста', 'ста', 'сто', 'ста', 'ста'],
+ [200, 'двести', 'двухсот', 'двумстам', 'двести', 'двумястами', 'двухстах'],
+ [300, 'триста', 'трёхсот', 'трёмстам', 'триста', 'тремястами', 'трёхстах'],
+ [400, 'четыреста', 'четырёхсот', 'четырёмстам', 'четыреста', 'четырьмястами', 'четырёхстах'],
+ [500, 'пятьсот', 'пятисот', 'пятистам', 'пятьсот', 'пятьюстами', 'пятистах'],
+ [600, 'шестьсот', 'шестисот', 'шестистам', 'шестьсот', 'шестьюстами', 'шестистах'],
+ [700, 'семьсот', 'семисот', 'семистам', 'семьсот', 'семьюстами', 'семистах'],
+ [800, 'восемьсот', 'восьмисот', 'восьмистам', 'восемьсот', 'восемьюстами', 'восьмистах'],
+ [900, 'девятьсот', 'девятисот', 'девятистам', 'девятьсот', 'девятьюстами', 'девятистах']
+ ],
+ ['1000',
+ [1000, 'одна тысяча', 'одной тысячи', 'одной тысяче', 'одну тысячу', 'одной тысячей', 'одной тысяче'],
+ [2000, 'две тысячи', 'двух тысяч', 'двум тысячам', 'две тысячи', 'двумя тысячами', 'двух тысячах'],
+ [5000, 'пять тысяч', 'пяти тысяч', 'пяти тысячам', 'пять тысяч', 'пятью тысячами', 'пяти тысячах']
+ ],
+ ['1000²',
+ [1000000,
+ 'один миллион',
+ 'одного миллиона',
+ 'одному миллиону',
+ 'один миллион',
+ 'одним миллионом',
+ 'одном миллионе'
+ ],
+ [2000000,
+ 'два миллиона',
+ 'двух миллионов',
+ 'двум миллионам',
+ 'два миллиона',
+ 'двумя миллионами',
+ 'двух миллионах'
+ ],
+ [5000000,
+ 'пять миллионов',
+ 'пяти миллионов',
+ 'пяти миллионам',
+ 'пять миллионов',
+ 'пятью миллионами',
+ 'пяти миллионах'
+ ]
+ ],
+ ['1000³',
+ [1000000000,
+ 'один миллиард',
+ 'одного миллиарда',
+ 'одному миллиарду',
+ 'один миллиард',
+ 'одним миллиардом',
+ 'одном миллиарде'
+ ],
+ [2000000000,
+ 'два миллиарда',
+ 'двух миллиардов',
+ 'двум миллиардам',
+ 'два миллиарда',
+ 'двумя миллиардами',
+ 'двух миллиардах'
+ ],
+ [5000000000,
+ 'пять миллиардов',
+ 'пяти миллиардов',
+ 'пяти миллиардам',
+ 'пять миллиардов',
+ 'пятью миллиардами',
+ 'пяти миллиардах'
+ ]
+ ],
+ ['1000⁴',
+ [1000000000000,
+ 'один триллион',
+ 'одного триллиона',
+ 'одному триллиону',
+ 'один триллион',
+ 'одним триллионом',
+ 'одном триллионе'
+ ],
+ [2000000000000,
+ 'два триллиона',
+ 'двух триллионов',
+ 'двум триллионам',
+ 'два триллиона',
+ 'двумя триллионами',
+ 'двух триллионах'
+ ],
+ [5000000000000,
+ 'пять триллионов',
+ 'пяти триллионов',
+ 'пяти триллионам',
+ 'пять триллионов',
+ 'пятью триллионами',
+ 'пяти триллионах'
+ ]
+ ],
+ ['misc',
+ [5122981121,
+ [Gender.Masculine,
+ [Case.Nominative,
+ [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'],
+ [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один']
+ ],
+ [Case.Genitive,
+ [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'],
+ [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного']
+ ],
+ [Case.Dative,
+ [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'],
+ [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному']
+ ],
+ [Case.Accusative,
+ [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'],
+ [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один']
+ ],
+ [Case.Instrumental,
+ [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'],
+ [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним']
+ ],
+ [Case.Prepositional,
+ [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'],
+ [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном']
+ ]
+ ],
+ [Gender.Feminine,
+ [Case.Nominative,
+ [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'],
+ [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна']
+ ],
+ [Case.Genitive,
+ [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одной'],
+ [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одной']
+ ],
+ [Case.Dative,
+ [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одной'],
+ [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одной']
+ ],
+ [Case.Accusative,
+ [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одну'],
+ [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одну']
+ ],
+ [Case.Instrumental,
+ [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одной'],
+ [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одной']
+ ],
+ [Case.Prepositional,
+ [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одной'],
+ [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одной']
+ ]
+ ],
+ [Gender.Neuter,
+ [Case.Nominative,
+ [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'],
+ [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно']
+ ],
+ [Case.Genitive,
+ [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'],
+ [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного']
+ ],
+ [Case.Dative,
+ [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'],
+ [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному']
+ ],
+ [Case.Accusative,
+ [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одно'],
+ [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одно']
+ ],
+ [Case.Instrumental,
+ [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'],
+ [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним']
+ ],
+ [Case.Prepositional,
+ [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'],
+ [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном']
+ ]
+ ]
+ ]
+ ]
+ ]
+ ;
+
+ const genders = Object.values(Gender).filter((gender): gender is Gender => typeof gender === 'number');
+ const cases = Object.values(Case).filter((kase): kase is Case => typeof kase === 'number');
+
+ testCases.forEach(([title, ...rest]) => {
+ describe(title, () => {
+ rest.forEach(([argNumber, ...rest]) => {
+ if (isComplex(rest)) {
+ rest.forEach(([argGender, ...rest]) => {
+ rest.forEach(([argCase, ...rest]) => {
+ rest.forEach(([argAnimate, expected]) => {
+ it(`numeralize(${argNumber}, Gender.${Gender[argGender]}, Case.${Case[argCase]}, ${argAnimate}) → ${expected}`, () => {
+ assert.strictEqual(
+ numeralize(
+ argNumber,
+ argGender,
+ argCase,
+ argAnimate
+ ),
+ expected
+ );
+ });
+ });
+ });
+ });
+ } else {
+ genders.forEach((argGender) => {
+ cases.forEach((argCase, i) => {
+ [true, false].forEach((argAnimate) => {
+ const expected = rest[i];
+ it(`numeralize(${argNumber}, Gender.${Gender[argGender]}, Case.${Case[argCase]}, ${argAnimate}) → ${expected}`, () => {
+ assert.strictEqual(
+ numeralize(
+ argNumber,
+ argGender,
+ argCase,
+ argAnimate
+ ),
+ expected
+ );
+ });
+ })
+ })
+ })
+ }
+ });
+ });
+ });
+});
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..a1512b4
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,309 @@
+export enum Gender {
+ Masculine = 0,
+ Feminine = 1,
+ Neuter = 2
+}
+
+export enum Case {
+ Nominative = 0,
+ Genitive = 1,
+ Dative = 2,
+ Accusative = 3,
+ Instrumental = 4,
+ Prepositional = 5
+}
+
+const MINORS = [
+ ['ноль', 'нуля', 'нулю', 'ноль', 'нулём', 'нуле'],
+ [
+ ['один', 'одна', 'одно'],
+ ['одного', 'одной', 'одного'],
+ ['одному', 'одной', 'одному'],
+ [['одного', 'один'], 'одну', 'одно'],
+ ['одним', 'одной', 'одним'],
+ ['одном', 'одной', 'одном']
+ ],
+ [
+ ['два', 'две', 'два'],
+ 'двух',
+ 'двум',
+ [['двух', 'два'], ['двух', 'две'], 'два'],
+ 'двумя',
+ 'двух'
+ ],
+ [
+ 'три',
+ 'трёх',
+ 'трём',
+ [['трёх', 'три'], ['трёх', 'три'], 'три'],
+ 'тремя',
+ 'трёх'
+ ],
+ [
+ 'четыре',
+ 'четырёх',
+ 'четырём',
+ [['четырёх', 'четыре'], ['четырёх', 'четыре'], 'четыре'],
+ 'четырьмя',
+ 'четырёх'
+ ],
+ ['пять', 'пяти', 'пяти', 'пять', 'пятью', 'пяти'],
+ ['шесть', 'шести', 'шести', 'шесть', 'шестью', 'шести'],
+ ['семь', 'семи', 'семи', 'семь', 'семью', 'семи'],
+ ['восемь', 'восьми', 'восьми', 'восемь', 'восемью', 'восьми'],
+ ['девять', 'девяти', 'девяти', 'девять', 'девятью', 'девяти'],
+ ['десять', 'десяти', 'десяти', 'десять', 'десятью', 'десяти'],
+ ...['один', 'две', 'три', 'четыр', 'пят', 'шест', 'сем', 'восем', 'девят'].map((prefix) =>
+ ['надцать', 'надцати', 'надцати', 'надцать', 'надцатью', 'надцати'].map((suffix) =>
+ `${prefix}${suffix}`
+ )
+ )
+] as const;
+
+const TENS = [
+ false,
+ false,
+ ['двадцать', 'двадцати', 'двадцати', 'двадцать', 'двадцатью', 'двадцати'],
+ ['тридцать', 'тридцати', 'тридцати', 'тридцать', 'тридцатью', 'тридцати'],
+ ['сорок', 'сорока', 'сорока', 'сорок', 'сорока', 'сорока'],
+ ['пятьдесят', 'пятидесяти', 'пятидесяти', 'пятьдесят', 'пятьюдесятью', 'пятидесяти'],
+ ['шестьдесят', 'шестидесяти', 'шестидесяти', 'шестьдесят', 'шестьюдесятью', 'шестидесяти'],
+ ['семьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти'],
+ ['восемьдесят', 'восьмидесяти', 'восьмидесяти', 'восемьдесят', 'восемьюдесятью', 'восьмидесяти'],
+ ['девяносто', 'девяноста', 'девяноста', 'девяносто', 'девяноста', 'девяноста']
+] as const;
+
+const HUNDREDS = [
+ false,
+ ['сто', 'ста', 'ста', 'сто', 'ста', 'ста'],
+ ['двести', 'двухсот', 'двумстам', 'двести', 'двумястами', 'двухстах'],
+ ['триста', 'трёхсот', 'трёмстам', 'триста', 'тремястами', 'трёхстах'],
+ ['четыреста', 'четырёхсот', 'четырёмстам', 'четыреста', 'четырьмястами', 'четырёхстах'],
+ ['пятьсот', 'пятисот', 'пятистам', 'пятьсот', 'пятьюстами', 'пятистах'],
+ ['шестьсот', 'шестисот', 'шестистам', 'шестьсот', 'шестьюстами', 'шестистах'],
+ ['семьсот', 'семисот', 'семистам', 'семьсот', 'семьюстами', 'семистах'],
+ ['восемьсот', 'восьмисот', 'восьмистам', 'восемьсот', 'восемьюстами', 'восьмистах'],
+ ['девятьсот', 'девятисот', 'девятистам', 'девятьсот', 'девятьюстами', 'девятистах']
+] as const;
+
+const LARGES = [
+ false,
+ [
+ Gender.Feminine,
+ ['тысяча', 'тысячи', 'тысяч'],
+ ['тысячи', 'тысяч', 'тысяч'],
+ ['тысяче', 'тысячам', 'тысячам'],
+ ['тысячу', 'тысячи', 'тысяч'],
+ ['тысячей', 'тысячами', 'тысячами'],
+ ['тысяче', 'тысячах', 'тысячах']
+ ],
+ ...['миллион', 'миллиард', 'триллион'].map<[Gender, ...string[][]]>((base) =>
+ [
+ Gender.Masculine,
+ ...[
+ ['', 'а', 'ов'],
+ ['а', 'ов', 'ов'],
+ ['у', 'ам', 'ам'],
+ ['', 'а', 'ов'],
+ ['ом', 'ами', 'ами'],
+ ['е', 'ах', 'ах']
+ ].map((kase) => kase.map((suffix) => `${base}${suffix}`))
+ ]
+ )
+] as const;
+
+function small(number: number, gender: Gender, kase: Case, animate: boolean): string {
+ // Zero
+ if (0 === number) {
+ return '';
+ }
+
+ // Collect chunks
+ const result: string[] = [];
+
+ // Hundreds
+ const hundreds = HUNDREDS[Math.floor(number / 100)];
+ if (hundreds) {
+ result.push(hundreds[kase]);
+ }
+
+ // Tens
+ const tens = TENS[Math.floor(number % 100 / 10)];
+ if (tens) {
+ result.push(tens[kase]);
+ }
+
+ // Minors
+ let minors = number % 100;
+ if (minors >= MINORS.length) {
+ minors = number % 10;
+ }
+ if (minors) {
+ let part;
+ if (
+ ((part = MINORS[minors][kase]) && typeof part === 'string')
+ || ((part = MINORS[minors][kase][gender]) && typeof part === 'string')
+ || (part = MINORS[minors][kase][gender][animate ? 0 : 1])
+ ) {
+ result.push(part)
+ }
+ }
+
+ // Return
+ return result.join(" ");
+}
+
+/**
+ * Выбирает нужную форму существительного в зависимости от количества.
+ *
+ * @param {number} count Количество
+ * @param {string} one Форма существительного для одного предмета, например, «рубль»;
+ * @param {string} two Форма существительного для двух предметов, например, «рубля»;
+ * @param {string} five Форма существительного для пяти предмета, например, «рублей»;
+ *
+ * @example
+ * // 'рублей'
+ * pluralize(0, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубль'
+ * pluralize(1, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубля'
+ * pluralize(2, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рублей'
+ * pluralize(5, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рублей'
+ * pluralize(11, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубль'
+ * pluralize(21, 'рубль', 'рубля', 'рублей');
+ *
+ * @example
+ * // 'рубля'
+ * pluralize(22, 'рубль', 'рубля', 'рублей');
+ */
+export function pluralize(count: number, one: string, two: string, five: string): string {
+ count = Math.floor(Math.abs(count)) % 100;
+ if (count > 10 && count < 20) {
+ return five;
+ }
+ count = count % 10;
+ if (1 === count) {
+ return one;
+ }
+ if (count >= 2 && count <= 4) {
+ return two;
+ }
+ return five;
+}
+
+/**
+ * Возвращает числительное, соответствующее числу
+ *
+ * @param {number} number Целое число, для которого надо записать числительное
+ *
+ * @param {Gender} [gender=Gender.Masculine] Пол:
+ * - {@link Gender.Masculine} – мужской (по умолчанию);
+ * - {@link Gender.Feminine} – женский;
+ * - {@link Gender.Neuter} – средний.
+ *
+ * @param {Case} [kase=Case.Nominative] Падеж
+ * (`case` является ключевым словом, поэтому не может быть использован в качестве имени переменной):
+ * - {@link Case.Nominative} — именительный (по умолчанию);
+ * - {@link Case.Genitive} — родительный;
+ * - {@link Case.Dative} — дательный;
+ * - {@link Case.Accusative} — винительный;
+ * - {@link Case.Instrumental} — творительный;
+ * - {@link Case.Prepositional} — предложный.
+ *
+ * @param {boolean} [animate=false] Являются ли перечисляемые предметы одушевлёнными
+ * (влияет на форму винительного падежа некоторых числительных)
+ *
+ * @example
+ * // мужской род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
+ * numeralize(5122981121);
+ *
+ * @example
+ * // женский род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'
+ * numeralize(5122981121, Gender.Feminine);
+ *
+ * @example
+ * // средний род, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'
+ * numeralize(5122981121, Gender.Neuter);
+ *
+ * @example
+ * // мужской род, именительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'
+ * numeralize(5122981121, Gender.Masculine, Case.Nominative);
+ *
+ * @example
+ * // мужской род, родительный падеж, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'
+ * numeralize(5122981121, Gender.Masculine, Case.Genitive);
+ *
+ * @example
+ * // мужской род, дательный падеж, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'
+ * numeralize(5122981121, Gender.Masculine, Case.Dative);
+ *
+ * @example
+ * // мужской род, винительный падеж, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один'
+ * numeralize(5122981121, Gender.Masculine, Case.Accusative);
+ *
+ * @example
+ * // мужской род, винительный падеж, одушевлённые предметы, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'
+ * numeralize(5122981121, Gender.Masculine, Case.Accusative, true);
+ *
+ * @example
+ * // мужской род, творительный падеж, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'
+ * numeralize(5122981121, Gender.Masculine, Case.Instrumental);
+ *
+ * @example
+ * // мужской род, творительный падеж, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'
+ * numeralize(5122981121, Gender.Masculine, Case.Prepositional);
+ */
+export function numeralize(
+ number: number,
+ gender: Gender = Gender.Masculine,
+ kase: Case = Case.Nominative,
+ animate: boolean = false
+): string {
+ // Normalize params
+ number = Math.abs(parseInt(String(number), 10));
+
+ // Collect chunks
+ const result: string[] = [];
+
+ // Descend known powers of thousand
+ for (let l = LARGES.length, i = l; i >= 0; i--) {
+ const base = Math.pow(10, i * 3);
+ const current = Math.floor(number / base);
+ number = number % base;
+
+ if (current) {
+ const large = i ? LARGES[i] : null;
+ const numeral = small(current, large ? large[0] : gender, kase, large ? false : animate);
+ if (numeral) {
+ result.push(numeral);
+ if (large) {
+ const [, ...forms] = large
+ const plural = pluralize(current, forms[kase][0], forms[kase][1], forms[kase][2]);
+ result.push(plural);
+ }
+ }
+ }
+ }
+
+ // Zero
+ if (!result.length) {
+ result.push(MINORS[0][kase]);
+ }
+
+ // Return
+ return result.join(' ');
+}
+
diff --git a/test/index.d.spec.ts b/test/index.d.spec.ts
deleted file mode 100644
index 52d9f7b..0000000
--- a/test/index.d.spec.ts
+++ /dev/null
@@ -1,19 +0,0 @@
-import * as numeralize from '../index';
-
-let g: numeralize.Gender;
-g = numeralize.GENDER_MASCULINE;
-g = numeralize.GENDER_FEMININE;
-g = numeralize.GENDER_NEUTER;
-
-let c: numeralize.Case;
-c = numeralize.CASE_NOMINATIVE;
-c = numeralize.CASE_GENITIVE;
-c = numeralize.CASE_DATIVE;
-c = numeralize.CASE_ACCUSATIVE;
-c = numeralize.CASE_INSTRUMENTAL;
-c = numeralize.CASE_PREPOSITIONAL;
-
-let s: string;
-s = numeralize(123, g, c, true);
-s = numeralize.pluralize(123, 'рубль', 'рубля', 'рублей');
-
diff --git a/test/index.spec.js b/test/index.spec.js
deleted file mode 100644
index 7b5358f..0000000
--- a/test/index.spec.js
+++ /dev/null
@@ -1,1078 +0,0 @@
-const assert = require('assert');
-const numeralize = require('../index');
-
-describe('numeralize', () => {
- 'use strict';
-
- const tests = [
- ['0 to 19 (minors)',
- [1,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'один'], [false, 'один']],
- ['CASE_GENITIVE', [true, 'одного'], [false, 'одного']],
- ['CASE_DATIVE', [true, 'одному'], [false, 'одному']],
- ['CASE_ACCUSATIVE', [true, 'одного'], [false, 'один']],
- ['CASE_INSTRUMENTAL', [true, 'одним'], [false, 'одним']],
- ['CASE_PREPOSITIONAL', [true, 'одном'], [false, 'одном']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'одна'], [false, 'одна']],
- ['CASE_GENITIVE', [true, 'одной'], [false, 'одной']],
- ['CASE_DATIVE', [true, 'одной'], [false, 'одной']],
- ['CASE_ACCUSATIVE', [true, 'одну'], [false, 'одну']],
- ['CASE_INSTRUMENTAL', [true, 'одной'], [false, 'одной']],
- ['CASE_PREPOSITIONAL', [true, 'одной'], [false, 'одной']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'одно'], [false, 'одно']],
- ['CASE_GENITIVE', [true, 'одного'], [false, 'одного']],
- ['CASE_DATIVE', [true, 'одному'], [false, 'одному']],
- ['CASE_ACCUSATIVE', [true, 'одно'], [false, 'одно']],
- ['CASE_INSTRUMENTAL', [true, 'одним'], [false, 'одним']],
- ['CASE_PREPOSITIONAL', [true, 'одном'], [false, 'одном']]]],
- [2,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'два'], [false, 'два']],
- ['CASE_GENITIVE', [true, 'двух'], [false, 'двух']],
- ['CASE_DATIVE', [true, 'двум'], [false, 'двум']],
- ['CASE_ACCUSATIVE', [true, 'двух'], [false, 'два']],
- ['CASE_INSTRUMENTAL', [true, 'двумя'], [false, 'двумя']],
- ['CASE_PREPOSITIONAL', [true, 'двух'], [false, 'двух']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'две'], [false, 'две']],
- ['CASE_GENITIVE', [true, 'двух'], [false, 'двух']],
- ['CASE_DATIVE', [true, 'двум'], [false, 'двум']],
- ['CASE_ACCUSATIVE', [true, 'двух'], [false, 'две']],
- ['CASE_INSTRUMENTAL', [true, 'двумя'], [false, 'двумя']],
- ['CASE_PREPOSITIONAL', [true, 'двух'], [false, 'двух']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'два'], [false, 'два']],
- ['CASE_GENITIVE', [true, 'двух'], [false, 'двух']],
- ['CASE_DATIVE', [true, 'двум'], [false, 'двум']],
- ['CASE_ACCUSATIVE', [true, 'два'], [false, 'два']],
- ['CASE_INSTRUMENTAL', [true, 'двумя'], [false, 'двумя']],
- ['CASE_PREPOSITIONAL', [true, 'двух'], [false, 'двух']]]],
- [3,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'три'], [false, 'три']],
- ['CASE_GENITIVE', [true, 'трёх'], [false, 'трёх']],
- ['CASE_DATIVE', [true, 'трём'], [false, 'трём']],
- ['CASE_ACCUSATIVE', [true, 'трёх'], [false, 'три']],
- ['CASE_INSTRUMENTAL', [true, 'тремя'], [false, 'тремя']],
- ['CASE_PREPOSITIONAL', [true, 'трёх'], [false, 'трёх']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'три'], [false, 'три']],
- ['CASE_GENITIVE', [true, 'трёх'], [false, 'трёх']],
- ['CASE_DATIVE', [true, 'трём'], [false, 'трём']],
- ['CASE_ACCUSATIVE', [true, 'трёх'], [false, 'три']],
- ['CASE_INSTRUMENTAL', [true, 'тремя'], [false, 'тремя']],
- ['CASE_PREPOSITIONAL', [true, 'трёх'], [false, 'трёх']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'три'], [false, 'три']],
- ['CASE_GENITIVE', [true, 'трёх'], [false, 'трёх']],
- ['CASE_DATIVE', [true, 'трём'], [false, 'трём']],
- ['CASE_ACCUSATIVE', [true, 'три'], [false, 'три']],
- ['CASE_INSTRUMENTAL', [true, 'тремя'], [false, 'тремя']],
- ['CASE_PREPOSITIONAL', [true, 'трёх'], [false, 'трёх']]]],
- [4,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'четыре'], [false, 'четыре']],
- ['CASE_GENITIVE', [true, 'четырёх'], [false, 'четырёх']],
- ['CASE_DATIVE', [true, 'четырём'], [false, 'четырём']],
- ['CASE_ACCUSATIVE', [true, 'четырёх'], [false, 'четыре']],
- ['CASE_INSTRUMENTAL',
- [true, 'четырьмя'],
- [false, 'четырьмя']],
- ['CASE_PREPOSITIONAL',
- [true, 'четырёх'],
- [false, 'четырёх']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'четыре'], [false, 'четыре']],
- ['CASE_GENITIVE', [true, 'четырёх'], [false, 'четырёх']],
- ['CASE_DATIVE', [true, 'четырём'], [false, 'четырём']],
- ['CASE_ACCUSATIVE', [true, 'четырёх'], [false, 'четыре']],
- ['CASE_INSTRUMENTAL',
- [true, 'четырьмя'],
- [false, 'четырьмя']],
- ['CASE_PREPOSITIONAL',
- [true, 'четырёх'],
- [false, 'четырёх']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'четыре'], [false, 'четыре']],
- ['CASE_GENITIVE', [true, 'четырёх'], [false, 'четырёх']],
- ['CASE_DATIVE', [true, 'четырём'], [false, 'четырём']],
- ['CASE_ACCUSATIVE', [true, 'четыре'], [false, 'четыре']],
- ['CASE_INSTRUMENTAL',
- [true, 'четырьмя'],
- [false, 'четырьмя']],
- ['CASE_PREPOSITIONAL',
- [true, 'четырёх'],
- [false, 'четырёх']]]],
- [5,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'пять'], [false, 'пять']],
- ['CASE_GENITIVE', [true, 'пяти'], [false, 'пяти']],
- ['CASE_DATIVE', [true, 'пяти'], [false, 'пяти']],
- ['CASE_ACCUSATIVE', [true, 'пять'], [false, 'пять']],
- ['CASE_INSTRUMENTAL', [true, 'пятью'], [false, 'пятью']],
- ['CASE_PREPOSITIONAL', [true, 'пяти'], [false, 'пяти']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'пять'], [false, 'пять']],
- ['CASE_GENITIVE', [true, 'пяти'], [false, 'пяти']],
- ['CASE_DATIVE', [true, 'пяти'], [false, 'пяти']],
- ['CASE_ACCUSATIVE', [true, 'пять'], [false, 'пять']],
- ['CASE_INSTRUMENTAL', [true, 'пятью'], [false, 'пятью']],
- ['CASE_PREPOSITIONAL', [true, 'пяти'], [false, 'пяти']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'пять'], [false, 'пять']],
- ['CASE_GENITIVE', [true, 'пяти'], [false, 'пяти']],
- ['CASE_DATIVE', [true, 'пяти'], [false, 'пяти']],
- ['CASE_ACCUSATIVE', [true, 'пять'], [false, 'пять']],
- ['CASE_INSTRUMENTAL', [true, 'пятью'], [false, 'пятью']],
- ['CASE_PREPOSITIONAL', [true, 'пяти'], [false, 'пяти']]]],
- [6,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'шесть'], [false, 'шесть']],
- ['CASE_GENITIVE', [true, 'шести'], [false, 'шести']],
- ['CASE_DATIVE', [true, 'шести'], [false, 'шести']],
- ['CASE_ACCUSATIVE', [true, 'шесть'], [false, 'шесть']],
- ['CASE_INSTRUMENTAL', [true, 'шестью'], [false, 'шестью']],
- ['CASE_PREPOSITIONAL', [true, 'шести'], [false, 'шести']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'шесть'], [false, 'шесть']],
- ['CASE_GENITIVE', [true, 'шести'], [false, 'шести']],
- ['CASE_DATIVE', [true, 'шести'], [false, 'шести']],
- ['CASE_ACCUSATIVE', [true, 'шесть'], [false, 'шесть']],
- ['CASE_INSTRUMENTAL', [true, 'шестью'], [false, 'шестью']],
- ['CASE_PREPOSITIONAL', [true, 'шести'], [false, 'шести']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'шесть'], [false, 'шесть']],
- ['CASE_GENITIVE', [true, 'шести'], [false, 'шести']],
- ['CASE_DATIVE', [true, 'шести'], [false, 'шести']],
- ['CASE_ACCUSATIVE', [true, 'шесть'], [false, 'шесть']],
- ['CASE_INSTRUMENTAL', [true, 'шестью'], [false, 'шестью']],
- ['CASE_PREPOSITIONAL', [true, 'шести'], [false, 'шести']]]],
- [7,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'семь'], [false, 'семь']],
- ['CASE_GENITIVE', [true, 'семи'], [false, 'семи']],
- ['CASE_DATIVE', [true, 'семи'], [false, 'семи']],
- ['CASE_ACCUSATIVE', [true, 'семь'], [false, 'семь']],
- ['CASE_INSTRUMENTAL', [true, 'семью'], [false, 'семью']],
- ['CASE_PREPOSITIONAL', [true, 'семи'], [false, 'семи']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'семь'], [false, 'семь']],
- ['CASE_GENITIVE', [true, 'семи'], [false, 'семи']],
- ['CASE_DATIVE', [true, 'семи'], [false, 'семи']],
- ['CASE_ACCUSATIVE', [true, 'семь'], [false, 'семь']],
- ['CASE_INSTRUMENTAL', [true, 'семью'], [false, 'семью']],
- ['CASE_PREPOSITIONAL', [true, 'семи'], [false, 'семи']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'семь'], [false, 'семь']],
- ['CASE_GENITIVE', [true, 'семи'], [false, 'семи']],
- ['CASE_DATIVE', [true, 'семи'], [false, 'семи']],
- ['CASE_ACCUSATIVE', [true, 'семь'], [false, 'семь']],
- ['CASE_INSTRUMENTAL', [true, 'семью'], [false, 'семью']],
- ['CASE_PREPOSITIONAL', [true, 'семи'], [false, 'семи']]]],
- [8,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'восемь'], [false, 'восемь']],
- ['CASE_GENITIVE', [true, 'восьми'], [false, 'восьми']],
- ['CASE_DATIVE', [true, 'восьми'], [false, 'восьми']],
- ['CASE_ACCUSATIVE', [true, 'восемь'], [false, 'восемь']],
- ['CASE_INSTRUMENTAL',
- [true, 'восемью'],
- [false, 'восемью']],
- ['CASE_PREPOSITIONAL', [true, 'восьми'], [false, 'восьми']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'восемь'], [false, 'восемь']],
- ['CASE_GENITIVE', [true, 'восьми'], [false, 'восьми']],
- ['CASE_DATIVE', [true, 'восьми'], [false, 'восьми']],
- ['CASE_ACCUSATIVE', [true, 'восемь'], [false, 'восемь']],
- ['CASE_INSTRUMENTAL',
- [true, 'восемью'],
- [false, 'восемью']],
- ['CASE_PREPOSITIONAL', [true, 'восьми'], [false, 'восьми']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'восемь'], [false, 'восемь']],
- ['CASE_GENITIVE', [true, 'восьми'], [false, 'восьми']],
- ['CASE_DATIVE', [true, 'восьми'], [false, 'восьми']],
- ['CASE_ACCUSATIVE', [true, 'восемь'], [false, 'восемь']],
- ['CASE_INSTRUMENTAL',
- [true, 'восемью'],
- [false, 'восемью']],
- ['CASE_PREPOSITIONAL', [true, 'восьми'], [false, 'восьми']]]],
- [9,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'девять'], [false, 'девять']],
- ['CASE_GENITIVE', [true, 'девяти'], [false, 'девяти']],
- ['CASE_DATIVE', [true, 'девяти'], [false, 'девяти']],
- ['CASE_ACCUSATIVE', [true, 'девять'], [false, 'девять']],
- ['CASE_INSTRUMENTAL',
- [true, 'девятью'],
- [false, 'девятью']],
- ['CASE_PREPOSITIONAL', [true, 'девяти'], [false, 'девяти']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'девять'], [false, 'девять']],
- ['CASE_GENITIVE', [true, 'девяти'], [false, 'девяти']],
- ['CASE_DATIVE', [true, 'девяти'], [false, 'девяти']],
- ['CASE_ACCUSATIVE', [true, 'девять'], [false, 'девять']],
- ['CASE_INSTRUMENTAL',
- [true, 'девятью'],
- [false, 'девятью']],
- ['CASE_PREPOSITIONAL', [true, 'девяти'], [false, 'девяти']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'девять'], [false, 'девять']],
- ['CASE_GENITIVE', [true, 'девяти'], [false, 'девяти']],
- ['CASE_DATIVE', [true, 'девяти'], [false, 'девяти']],
- ['CASE_ACCUSATIVE', [true, 'девять'], [false, 'девять']],
- ['CASE_INSTRUMENTAL',
- [true, 'девятью'],
- [false, 'девятью']],
- ['CASE_PREPOSITIONAL', [true, 'девяти'], [false, 'девяти']]]],
- [10,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE', [true, 'десять'], [false, 'десять']],
- ['CASE_GENITIVE', [true, 'десяти'], [false, 'десяти']],
- ['CASE_DATIVE', [true, 'десяти'], [false, 'десяти']],
- ['CASE_ACCUSATIVE', [true, 'десять'], [false, 'десять']],
- ['CASE_INSTRUMENTAL',
- [true, 'десятью'],
- [false, 'десятью']],
- ['CASE_PREPOSITIONAL', [true, 'десяти'], [false, 'десяти']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE', [true, 'десять'], [false, 'десять']],
- ['CASE_GENITIVE', [true, 'десяти'], [false, 'десяти']],
- ['CASE_DATIVE', [true, 'десяти'], [false, 'десяти']],
- ['CASE_ACCUSATIVE', [true, 'десять'], [false, 'десять']],
- ['CASE_INSTRUMENTAL',
- [true, 'десятью'],
- [false, 'десятью']],
- ['CASE_PREPOSITIONAL', [true, 'десяти'], [false, 'десяти']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE', [true, 'десять'], [false, 'десять']],
- ['CASE_GENITIVE', [true, 'десяти'], [false, 'десяти']],
- ['CASE_DATIVE', [true, 'десяти'], [false, 'десяти']],
- ['CASE_ACCUSATIVE', [true, 'десять'], [false, 'десять']],
- ['CASE_INSTRUMENTAL',
- [true, 'десятью'],
- [false, 'десятью']],
- ['CASE_PREPOSITIONAL', [true, 'десяти'], [false, 'десяти']]]],
- [11,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'одиннадцать'],
- [false, 'одиннадцать']],
- ['CASE_GENITIVE',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']],
- ['CASE_DATIVE',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'одиннадцать'],
- [false, 'одиннадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'одиннадцатью'],
- [false, 'одиннадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'одиннадцать'],
- [false, 'одиннадцать']],
- ['CASE_GENITIVE',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']],
- ['CASE_DATIVE',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'одиннадцать'],
- [false, 'одиннадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'одиннадцатью'],
- [false, 'одиннадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'одиннадцать'],
- [false, 'одиннадцать']],
- ['CASE_GENITIVE',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']],
- ['CASE_DATIVE',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'одиннадцать'],
- [false, 'одиннадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'одиннадцатью'],
- [false, 'одиннадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'одиннадцати'],
- [false, 'одиннадцати']]]],
- [12,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'двенадцать'],
- [false, 'двенадцать']],
- ['CASE_GENITIVE',
- [true, 'двенадцати'],
- [false, 'двенадцати']],
- ['CASE_DATIVE',
- [true, 'двенадцати'],
- [false, 'двенадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'двенадцать'],
- [false, 'двенадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'двенадцатью'],
- [false, 'двенадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'двенадцати'],
- [false, 'двенадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'двенадцать'],
- [false, 'двенадцать']],
- ['CASE_GENITIVE',
- [true, 'двенадцати'],
- [false, 'двенадцати']],
- ['CASE_DATIVE',
- [true, 'двенадцати'],
- [false, 'двенадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'двенадцать'],
- [false, 'двенадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'двенадцатью'],
- [false, 'двенадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'двенадцати'],
- [false, 'двенадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'двенадцать'],
- [false, 'двенадцать']],
- ['CASE_GENITIVE',
- [true, 'двенадцати'],
- [false, 'двенадцати']],
- ['CASE_DATIVE',
- [true, 'двенадцати'],
- [false, 'двенадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'двенадцать'],
- [false, 'двенадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'двенадцатью'],
- [false, 'двенадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'двенадцати'],
- [false, 'двенадцати']]]],
- [13,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'тринадцать'],
- [false, 'тринадцать']],
- ['CASE_GENITIVE',
- [true, 'тринадцати'],
- [false, 'тринадцати']],
- ['CASE_DATIVE',
- [true, 'тринадцати'],
- [false, 'тринадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'тринадцать'],
- [false, 'тринадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'тринадцатью'],
- [false, 'тринадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'тринадцати'],
- [false, 'тринадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'тринадцать'],
- [false, 'тринадцать']],
- ['CASE_GENITIVE',
- [true, 'тринадцати'],
- [false, 'тринадцати']],
- ['CASE_DATIVE',
- [true, 'тринадцати'],
- [false, 'тринадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'тринадцать'],
- [false, 'тринадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'тринадцатью'],
- [false, 'тринадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'тринадцати'],
- [false, 'тринадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'тринадцать'],
- [false, 'тринадцать']],
- ['CASE_GENITIVE',
- [true, 'тринадцати'],
- [false, 'тринадцати']],
- ['CASE_DATIVE',
- [true, 'тринадцати'],
- [false, 'тринадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'тринадцать'],
- [false, 'тринадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'тринадцатью'],
- [false, 'тринадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'тринадцати'],
- [false, 'тринадцати']]]],
- [14,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'четырнадцать'],
- [false, 'четырнадцать']],
- ['CASE_GENITIVE',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']],
- ['CASE_DATIVE',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'четырнадцать'],
- [false, 'четырнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'четырнадцатью'],
- [false, 'четырнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'четырнадцать'],
- [false, 'четырнадцать']],
- ['CASE_GENITIVE',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']],
- ['CASE_DATIVE',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'четырнадцать'],
- [false, 'четырнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'четырнадцатью'],
- [false, 'четырнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'четырнадцать'],
- [false, 'четырнадцать']],
- ['CASE_GENITIVE',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']],
- ['CASE_DATIVE',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'четырнадцать'],
- [false, 'четырнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'четырнадцатью'],
- [false, 'четырнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'четырнадцати'],
- [false, 'четырнадцати']]]],
- [15,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'пятнадцать'],
- [false, 'пятнадцать']],
- ['CASE_GENITIVE',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']],
- ['CASE_DATIVE',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'пятнадцать'],
- [false, 'пятнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'пятнадцатью'],
- [false, 'пятнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'пятнадцать'],
- [false, 'пятнадцать']],
- ['CASE_GENITIVE',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']],
- ['CASE_DATIVE',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'пятнадцать'],
- [false, 'пятнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'пятнадцатью'],
- [false, 'пятнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'пятнадцать'],
- [false, 'пятнадцать']],
- ['CASE_GENITIVE',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']],
- ['CASE_DATIVE',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'пятнадцать'],
- [false, 'пятнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'пятнадцатью'],
- [false, 'пятнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'пятнадцати'],
- [false, 'пятнадцати']]]],
- [16,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'шестнадцать'],
- [false, 'шестнадцать']],
- ['CASE_GENITIVE',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']],
- ['CASE_DATIVE',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'шестнадцать'],
- [false, 'шестнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'шестнадцатью'],
- [false, 'шестнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'шестнадцать'],
- [false, 'шестнадцать']],
- ['CASE_GENITIVE',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']],
- ['CASE_DATIVE',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'шестнадцать'],
- [false, 'шестнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'шестнадцатью'],
- [false, 'шестнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'шестнадцать'],
- [false, 'шестнадцать']],
- ['CASE_GENITIVE',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']],
- ['CASE_DATIVE',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'шестнадцать'],
- [false, 'шестнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'шестнадцатью'],
- [false, 'шестнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'шестнадцати'],
- [false, 'шестнадцати']]]],
- [17,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'семнадцать'],
- [false, 'семнадцать']],
- ['CASE_GENITIVE',
- [true, 'семнадцати'],
- [false, 'семнадцати']],
- ['CASE_DATIVE',
- [true, 'семнадцати'],
- [false, 'семнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'семнадцать'],
- [false, 'семнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'семнадцатью'],
- [false, 'семнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'семнадцати'],
- [false, 'семнадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'семнадцать'],
- [false, 'семнадцать']],
- ['CASE_GENITIVE',
- [true, 'семнадцати'],
- [false, 'семнадцати']],
- ['CASE_DATIVE',
- [true, 'семнадцати'],
- [false, 'семнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'семнадцать'],
- [false, 'семнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'семнадцатью'],
- [false, 'семнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'семнадцати'],
- [false, 'семнадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'семнадцать'],
- [false, 'семнадцать']],
- ['CASE_GENITIVE',
- [true, 'семнадцати'],
- [false, 'семнадцати']],
- ['CASE_DATIVE',
- [true, 'семнадцати'],
- [false, 'семнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'семнадцать'],
- [false, 'семнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'семнадцатью'],
- [false, 'семнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'семнадцати'],
- [false, 'семнадцати']]]],
- [18,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'восемнадцать'],
- [false, 'восемнадцать']],
- ['CASE_GENITIVE',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']],
- ['CASE_DATIVE',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'восемнадцать'],
- [false, 'восемнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'восемнадцатью'],
- [false, 'восемнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'восемнадцать'],
- [false, 'восемнадцать']],
- ['CASE_GENITIVE',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']],
- ['CASE_DATIVE',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'восемнадцать'],
- [false, 'восемнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'восемнадцатью'],
- [false, 'восемнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'восемнадцать'],
- [false, 'восемнадцать']],
- ['CASE_GENITIVE',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']],
- ['CASE_DATIVE',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'восемнадцать'],
- [false, 'восемнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'восемнадцатью'],
- [false, 'восемнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'восемнадцати'],
- [false, 'восемнадцати']]]],
- [19,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'девятнадцать'],
- [false, 'девятнадцать']],
- ['CASE_GENITIVE',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']],
- ['CASE_DATIVE',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'девятнадцать'],
- [false, 'девятнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'девятнадцатью'],
- [false, 'девятнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']]],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'девятнадцать'],
- [false, 'девятнадцать']],
- ['CASE_GENITIVE',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']],
- ['CASE_DATIVE',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'девятнадцать'],
- [false, 'девятнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'девятнадцатью'],
- [false, 'девятнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']]],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'девятнадцать'],
- [false, 'девятнадцать']],
- ['CASE_GENITIVE',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']],
- ['CASE_DATIVE',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']],
- ['CASE_ACCUSATIVE',
- [true, 'девятнадцать'],
- [false, 'девятнадцать']],
- ['CASE_INSTRUMENTAL',
- [true, 'девятнадцатью'],
- [false, 'девятнадцатью']],
- ['CASE_PREPOSITIONAL',
- [true, 'девятнадцати'],
- [false, 'девятнадцати']]]]
- ],
- ['10, 20,.. 90 (tens)'].concat(
- [
- [20, 'двадцать', 'двадцати', 'двадцати', 'двадцать', 'двадцатью', 'двадцати'],
- [30, 'тридцать', 'тридцати', 'тридцати', 'тридцать', 'тридцатью', 'тридцати'],
- [40, 'сорок', 'сорока', 'сорока', 'сорок', 'сорока', 'сорока'],
- [50, 'пятьдесят', 'пятидесяти', 'пятидесяти', 'пятьдесят', 'пятьюдесятью', 'пятидесяти'],
- [60, 'шестьдесят', 'шестидесяти', 'шестидесяти', 'шестьдесят', 'шестьюдесятью', 'шестидесяти'],
- [70, 'семьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти'],
- [80, 'восемьдесят', 'восьмидесяти', 'восьмидесяти', 'восемьдесят', 'восемьюдесятью', 'восьмидесяти'],
- [90, 'девяносто', 'девяноста', 'девяноста', 'девяносто', 'девяноста', 'девяноста']
- ].map(ten => [ten.shift()].concat(
- ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat(
- [
- 'CASE_NOMINATIVE',
- 'CASE_GENITIVE',
- 'CASE_DATIVE',
- 'CASE_ACCUSATIVE',
- 'CASE_INSTRUMENTAL',
- 'CASE_PREPOSITIONAL'
- ].map((kase, i) => [kase, [true, ten[i]], [false, ten[i]]])
- ))
- ))
- ),
- ['100, 200,.. 900 (hundreds)'].concat(
- [
- [100, 'сто', 'ста', 'ста', 'сто', 'ста', 'ста'],
- [200, 'двести', 'двухсот', 'двумстам', 'двести', 'двумястами', 'двухстах'],
- [300, 'триста', 'трёхсот', 'трёмстам', 'триста', 'тремястами', 'трёхстах'],
- [400, 'четыреста', 'четырёхсот', 'четырёмстам', 'четыреста', 'четырьмястами', 'четырёхстах'],
- [500, 'пятьсот', 'пятисот', 'пятистам', 'пятьсот', 'пятьюстами', 'пятистах'],
- [600, 'шестьсот', 'шестисот', 'шестистам', 'шестьсот', 'шестьюстами', 'шестистах'],
- [700, 'семьсот', 'семисот', 'семистам', 'семьсот', 'семьюстами', 'семистах'],
- [800, 'восемьсот', 'восьмисот', 'восьмистам', 'восемьсот', 'восемьюстами', 'восьмистах'],
- [900, 'девятьсот', 'девятисот', 'девятистам', 'девятьсот', 'девятьюстами', 'девятистах']
- ].map(ten => [ten.shift()].concat(
- ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat(
- [
- 'CASE_NOMINATIVE',
- 'CASE_GENITIVE',
- 'CASE_DATIVE',
- 'CASE_ACCUSATIVE',
- 'CASE_INSTRUMENTAL',
- 'CASE_PREPOSITIONAL'
- ].map((kase, i) => [kase, [true, ten[i]], [false, ten[i]]])
- ))
- ))
- ),
- ['1000'].concat(
- [
- [1000, 'одна тысяча', 'одной тысячи', 'одной тысяче', 'одну тысячу', 'одной тысячей', 'одной тысяче'],
- [2000, 'две тысячи', 'двух тысяч', 'двум тысячам', 'две тысячи', 'двумя тысячами', 'двух тысячах'],
- [5000, 'пять тысяч', 'пяти тысяч', 'пяти тысячам', 'пять тысяч', 'пятью тысячами', 'пяти тысячах']
- ].map(item => [item.shift()].concat(
- ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat(
- [
- 'CASE_NOMINATIVE',
- 'CASE_GENITIVE',
- 'CASE_DATIVE',
- 'CASE_ACCUSATIVE',
- 'CASE_INSTRUMENTAL',
- 'CASE_PREPOSITIONAL'
- ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]])
- ))
- ))
- ),
- ['1000^2'].concat(
- [
- [1000000,
- 'один миллион',
- 'одного миллиона',
- 'одному миллиону',
- 'один миллион',
- 'одним миллионом',
- 'одном миллионе'
- ],
- [2000000,
- 'два миллиона',
- 'двух миллионов',
- 'двум миллионам',
- 'два миллиона',
- 'двумя миллионами',
- 'двух миллионах'
- ],
- [5000000,
- 'пять миллионов',
- 'пяти миллионов',
- 'пяти миллионам',
- 'пять миллионов',
- 'пятью миллионами',
- 'пяти миллионах'
- ]
- ].map(item => [item.shift()].concat(
- ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat(
- [
- 'CASE_NOMINATIVE',
- 'CASE_GENITIVE',
- 'CASE_DATIVE',
- 'CASE_ACCUSATIVE',
- 'CASE_INSTRUMENTAL',
- 'CASE_PREPOSITIONAL'
- ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]])
- ))
- ))
- ),
- ['1000^3'].concat(
- [
- [1000000000,
- 'один миллиард',
- 'одного миллиарда',
- 'одному миллиарду',
- 'один миллиард',
- 'одним миллиардом',
- 'одном миллиарде'
- ],
- [2000000000,
- 'два миллиарда',
- 'двух миллиардов',
- 'двум миллиардам',
- 'два миллиарда',
- 'двумя миллиардами',
- 'двух миллиардах'
- ],
- [5000000000,
- 'пять миллиардов',
- 'пяти миллиардов',
- 'пяти миллиардам',
- 'пять миллиардов',
- 'пятью миллиардами',
- 'пяти миллиардах'
- ]
- ].map(item => [item.shift()].concat(
- ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat(
- [
- 'CASE_NOMINATIVE',
- 'CASE_GENITIVE',
- 'CASE_DATIVE',
- 'CASE_ACCUSATIVE',
- 'CASE_INSTRUMENTAL',
- 'CASE_PREPOSITIONAL'
- ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]])
- ))
- ))
- ),
- ['1000^4'].concat(
- [
- [1000000000000,
- 'один триллион',
- 'одного триллиона',
- 'одному триллиону',
- 'один триллион',
- 'одним триллионом',
- 'одном триллионе'
- ],
- [2000000000000,
- 'два триллиона',
- 'двух триллионов',
- 'двум триллионам',
- 'два триллиона',
- 'двумя триллионами',
- 'двух триллионах'
- ],
- [5000000000000,
- 'пять триллионов',
- 'пяти триллионов',
- 'пяти триллионам',
- 'пять триллионов',
- 'пятью триллионами',
- 'пяти триллионах'
- ]
- ].map(item => [item.shift()].concat(
- ['GENDER_MASCULINE', 'GENDER_FEMiNINE', 'GENDER_NEUTER'].map(gender => [gender].concat(
- [
- 'CASE_NOMINATIVE',
- 'CASE_GENITIVE',
- 'CASE_DATIVE',
- 'CASE_ACCUSATIVE',
- 'CASE_INSTRUMENTAL',
- 'CASE_PREPOSITIONAL'
- ].map((kase, i) => [kase, [true, item[i]], [false, item[i]]])
- ))
- ))
- ),
- ['misc',
- [5122981121,
- ['GENDER_MASCULINE',
- ['CASE_NOMINATIVE',
- [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один'],
- [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать один']
- ],
- ['CASE_GENITIVE',
- [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'],
- [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного']
- ],
- ['CASE_DATIVE',
- [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'],
- [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному']
- ],
- ['CASE_ACCUSATIVE',
- [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одного'],
- [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать один']
- ],
- ['CASE_INSTRUMENTAL',
- [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'],
- [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним']
- ],
- ['CASE_PREPOSITIONAL',
- [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'],
- [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном']
- ]
- ],
- ['GENDER_FEMININE',
- ['CASE_NOMINATIVE',
- [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна'],
- [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одна']
- ],
- ['CASE_GENITIVE',
- [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одной'],
- [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одной']
- ],
- ['CASE_DATIVE',
- [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одной'],
- [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одной']
- ],
- ['CASE_ACCUSATIVE',
- [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одну'],
- [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одну']
- ],
- ['CASE_INSTRUMENTAL',
- [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одной'],
- [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одной']
- ],
- ['CASE_PREPOSITIONAL',
- [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одной'],
- [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одной']
- ]
- ],
- ['GENDER_NEUTER',
- ['CASE_NOMINATIVE',
- [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно'],
- [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одна тысяча сто двадцать одно']
- ],
- ['CASE_GENITIVE',
- [true, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного'],
- [false, 'пяти миллиардов ста двадцати двух миллионов девятисот восьмидесяти одной тысячи ста двадцати одного']
- ],
- ['CASE_DATIVE',
- [true, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному'],
- [false, 'пяти миллиардам ста двадцати двум миллионам девятистам восьмидесяти одной тысяче ста двадцати одному']
- ],
- ['CASE_ACCUSATIVE',
- [true, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одно'],
- [false, 'пять миллиардов сто двадцать два миллиона девятьсот восемьдесят одну тысячу сто двадцать одно']
- ],
- ['CASE_INSTRUMENTAL',
- [true, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним'],
- [false, 'пятью миллиардами ста двадцатью двумя миллионами девятьюстами восемьюдесятью одной тысячей ста двадцатью одним']
- ],
- ['CASE_PREPOSITIONAL',
- [true, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном'],
- [false, 'пяти миллиардах ста двадцати двух миллионах девятистах восьмидесяти одной тысяче ста двадцати одном']
- ]
- ]
- ]
- ]
- ];
-
- tests.map(test => {
- let title = test.shift();
- describe(title, () => {
- test.map(test => {
- let arg0 = test.shift();
- test.map(test => {
- let arg1 = test.shift();
- test.map(test => {
- let arg2 = test.shift();
- test.map(test => {
- let arg3 = test.shift();
- const expected = test.shift();
- it(`(${arg0}, ${arg1}, ${arg2}, ${arg3}) → ${expected}`, () => {
- assert.strictEqual(
- numeralize(
- arg0,
- numeralize[arg1],
- numeralize[arg2],
- arg3
- ),
- expected
- );
- });
- });
- });
- });
- });
- });
- });
-
-});
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..4e7a1e2
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,111 @@
+{
+ "compilerOptions": {
+ /* Visit https://aka.ms/tsconfig to read more about this file */
+
+ /* Projects */
+ // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */
+ // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */
+ // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */
+ // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */
+ // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */
+ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */
+
+ /* Language and Environment */
+ "target": "es3",
+ /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */
+ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
+ // "jsx": "preserve", /* Specify what JSX code is generated. */
+ // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */
+ // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
+ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
+ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
+ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */
+ // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */
+ // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */
+ // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */
+ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */
+
+ /* Modules */
+ "module": "NodeNext",
+ /* Specify what module code is generated. */
+ // "rootDir": "./", /* Specify the root folder within your source files. */
+ // "moduleResolution": "node", /* Specify how TypeScript looks up a file from a given module specifier. */
+ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */
+ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */
+ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */
+ // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */
+ "types": ["node", "mocha"], /* Specify type package names to be included without being referenced in a source file. */
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
+ // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */
+ // "resolveJsonModule": true, /* Enable importing .json files. */
+ // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */
+
+ /* JavaScript Support */
+ // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */
+ // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */
+ // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */
+
+ /* Emit */
+ "declaration": true,
+ /* Generate .d.ts files from TypeScript and JavaScript files in your project. */
+ // "declarationMap": true, /* Create sourcemaps for d.ts files. */
+ // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */
+ // "sourceMap": true, /* Create source map files for emitted JavaScript files. */
+ // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */
+ "outDir": "./lib", /* Specify an output folder for all emitted files. */
+ // "removeComments": true, /* Disable emitting comments. */
+ // "noEmit": true, /* Disable emitting files from a compilation. */
+ // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */
+ // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */
+ // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */
+ // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */
+ // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */
+ // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */
+ // "newLine": "crlf", /* Set the newline character for emitting files. */
+ // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */
+ // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */
+ // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */
+ // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */
+ // "declarationDir": "./", /* Specify the output directory for generated declaration files. */
+ // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */
+
+ /* Interop Constraints */
+ // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */
+ // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */
+ "esModuleInterop": true,
+ /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */
+ // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */
+ "forceConsistentCasingInFileNames": true,
+ /* Ensure that casing is correct in imports. */
+
+ /* Type Checking */
+ "strict": true,
+ /* Enable all strict type-checking options. */
+ // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */
+ // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */
+ // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */
+ // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */
+ // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */
+ // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */
+ // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */
+ // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */
+ // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */
+ // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */
+ // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */
+ // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */
+ // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */
+ // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */
+ // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */
+ // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */
+ // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */
+ // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */
+
+ /* Completeness */
+ // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */
+ "skipLibCheck": true
+ /* Skip type checking all .d.ts files. */
+ },
+ "include": ["./src/index.ts"]
+}