extenso
Version:
Uma biblioteca avançada para escrever números por extenso (em português).
8 lines • 70.1 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../src/index.ts", "../src/ts/enum/currencies.enum.ts", "../src/utils/currency-markers.ts", "../src/utils/normalize.ts", "../src/ts/enum/decimal-separators.enum.ts", "../src/utils/parse.ts", "../src/ts/enum/locales.enum.ts", "../src/utils/translate.ts", "../src/ts/enum/modes.enum.ts", "../src/ts/enum/genders.enum.ts", "../src/ts/enum/scales.enum.ts", "../src/utils/validate-options.ts", "../src/utils/remove-accents.ts", "../src/mode/write-abbreviated.ts", "../src/lists/list-currencies.ts", "../src/utils/split.ts", "../src/lists/list-from-1000.ts", "../src/lists/list-from-0-to-9.ts", "../src/lists/list-from-10-to-19.ts", "../src/lists/list-from-20-to-90.ts", "../src/lists/list-from-100-to-900.ts", "../src/core/integer/write-lower-than-1000.ts", "../src/core/integer/write-greater-than-1000.ts", "../src/core/write-integer.ts", "../src/mode/write-currency.ts", "../src/mode/write-digit.ts", "../src/utils/pluralize.ts", "../src/lists/list-decimals.ts", "../src/core/write-decimal.ts", "../src/lists/list-ordinals.ts", "../src/core/write-ordinal.ts", "../src/mode/write-number.ts", "../src/core/convert.ts", "../src/utils/detect-currency.ts", "../src/core/resolve-conversion.ts"],
"sourcesContent": ["import type { ExtensoOptions } from './types'\nimport normalize from './utils/normalize'\nimport parse from './utils/parse'\nimport translate from './utils/translate'\nimport DecimalSeparators from './ts/enum/decimal-separators.enum'\nimport Modes from './ts/enum/modes.enum'\nimport validateOptions from './utils/validate-options'\nimport removeAccents from './utils/remove-accents'\nimport convert from './core/convert'\nimport resolveConversion from './core/resolve-conversion'\n\nexport type {\n BuiltInCurrencyOptions,\n CurrencyCode,\n CurrencyDefinition,\n CurrencyOptions,\n DecimalSeparator,\n ExtensoGender,\n ExtensoLocale,\n ExtensoMode,\n ExtensoOptions,\n ExtensoScale,\n NumberOptions,\n} from './types'\n\nconst NEGATIVE_SIGN = '-'\n\n/**\n * Converts a number to its written form in Portuguese\n * @param input - The number to convert (can be string, number, or bigint)\n * @param options - Configuration options for the conversion\n * @param options.mode - The conversion mode (ABBREVIATED, CURRENCY, DIGIT, or NUMBER)\n * @param options.decimalSeparator - The decimal separator to use (POINT or COMMA)\n * @param options.locale - The locale to use for the output (BR or PT)\n * @param options.scale - The number scale to use (SHORT or LONG)\n * @param options.removeAccents - Whether to remove accents from the output\n * @param options.currency - Currency configuration when mode is CURRENCY\n * @param options.number - Number configuration when mode is NUMBER\n * @param options.number.ordinal - Whether to write an integer as an ordinal\n * @returns The written form of the number in Portuguese\n * @throws {TypeError} If input is not a string, number, or bigint\n * @throws {Error} If the number format is invalid\n * @throws {Error} If the number exceeds scale limits\n * @throws {Error} If an invalid currency code is provided\n * @example\n * extenso(1234.56) // \"mil duzentos e trinta e quatro v\u00EDrgula cinquenta e seis\"\n * extenso(1234.56, { mode: Modes.CURRENCY, currency: { code: Currencies.BRL } }) // \"mil duzentos e trinta e quatro reais e cinquenta e seis centavos\"\n * extenso(\"R$ 1234.56\", { mode: Modes.CURRENCY }) // \"mil duzentos e trinta e quatro reais e cinquenta e seis centavos\"\n */\nconst extenso = (input: number | string | bigint, options: ExtensoOptions = {}): string => {\n validateOptions(options)\n\n const inputIsNumber = typeof input === 'number'\n\n const { currency, mode } = resolveConversion(input, options)\n\n input = normalize(input)\n const parseSeparator = inputIsNumber ? DecimalSeparators.POINT : options?.decimalSeparator\n const decimalSeparator = parseSeparator === DecimalSeparators.COMMA ? ',' : '.'\n const hasDecimal = input.includes(decimalSeparator)\n const { integer, decimal } = parse(input, parseSeparator, mode === Modes.DIGIT)\n const isNonZero = /[1-9]/.test(integer) || /[1-9]/.test(decimal)\n let text = convert({\n integer,\n decimal,\n decimalSeparator,\n hasDecimalSeparator: hasDecimal,\n }, mode, currency, options)\n\n text = translate(text, options.locale)\n\n if (input.startsWith(NEGATIVE_SIGN) && isNonZero) {\n text = `menos ${text}`\n }\n\n if (options.removeAccents) {\n text = removeAccents(text)\n }\n\n return text\n}\n\nexport default extenso\n", "enum Currencies {\n AOA = 'AOA',\n CVE = 'CVE',\n BRL = 'BRL',\n XOF = 'XOF',\n MZN = 'MZN',\n EUR = 'EUR',\n STN = 'STN',\n USD = 'USD',\n MOP = 'MOP',\n}\n\nexport default Currencies\n", "import Currencies from '../ts/enum/currencies.enum'\nimport type { CurrencyCode } from '../types'\n\nexport const currencySymbols: Readonly<Record<string, CurrencyCode>> = {\n 'MOP$': Currencies.MOP,\n 'R$': Currencies.BRL,\n '\u20AC': Currencies.EUR,\n '$': Currencies.USD,\n 'Kz': Currencies.AOA,\n 'Esc': Currencies.CVE,\n 'CFA': Currencies.XOF,\n 'MT': Currencies.MZN,\n 'Db': Currencies.STN,\n}\n\nconst escapeRegularExpression = (text: string): string => {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n}\n\nconst symbolPattern = Object.keys(currencySymbols)\n .sort((first, second) => second.length - first.length)\n .map(escapeRegularExpression)\n .join('|')\nconst codePattern = Object.values(Currencies).join('|')\nconst markerPattern = new RegExp(\n `${symbolPattern}|(?<![A-Za-z])(?:${codePattern})(?![A-Za-z])`,\n 'g',\n)\n\n/**\n * Finds all supported currency markers without matching codes inside words.\n * Longer symbols are matched first so that MOP$ is never interpreted as USD.\n * @param input - Text that may contain currency codes or symbols\n * @returns Every detected currency in source order\n */\nexport const findCurrencies = (input: string): CurrencyCode[] => {\n return Array.from(input.matchAll(markerPattern), (match): CurrencyCode => {\n return currencySymbols[match[0]] ?? match[0] as CurrencyCode\n })\n}\n\n/**\n * Removes every supported currency marker from an input.\n * @param input - Text from which markers should be removed\n * @returns Text without supported currency markers\n */\nexport const removeCurrencyMarkers = (input: string): string => {\n return input.replace(markerPattern, ' ')\n}\n", "import { removeCurrencyMarkers } from './currency-markers'\n\nconst MAX_INPUT_LENGTH = 1000 // Maximum length for input strings to prevent memory issues\n\n/**\n * Expands JavaScript scientific notation without performing floating-point\n * arithmetic or adding digits that were not present in the representation.\n * @param input - A finite number represented by JavaScript\n * @returns A plain decimal representation\n */\nconst expandExponential = (input: string): string => {\n const match = /^(-?)(\\d+)(?:\\.(\\d+))?[eE]([+-]?\\d+)$/.exec(input)\n\n if (!match) {\n return input\n }\n\n const [, sign, integer, fraction = '', exponentText] = match\n const exponent = Number(exponentText)\n const digits = `${integer}${fraction}`\n\n if (exponent < 0) {\n return `${sign}0.${'0'.repeat(Math.abs(exponent) - 1)}${digits}`\n }\n return `${sign}${digits}${'0'.repeat(exponent - fraction.length)}`\n}\n\n/**\n * Normalizes the input by converting it to a string and removing currency symbols/codes\n * @param input - The input to normalize\n * @returns The normalized string\n * @throws {TypeError} If input is not a string, number, or bigint\n * @throws {Error} If the normalized string exceeds maximum length\n */\nconst normalize = (input: string | number | bigint): string => {\n if (typeof input === 'bigint') {\n input = input.toString()\n }\n if (typeof input !== 'string' && typeof input !== 'number') {\n throw new TypeError('Input must be a string, number or bigint')\n }\n if (typeof input === 'number' && !Number.isFinite(input)) {\n throw new RangeError('Input number must be finite')\n }\n\n const text = typeof input === 'number'\n ? expandExponential(input.toString())\n : input.toString()\n\n if (text.length > MAX_INPUT_LENGTH) {\n throw new Error(`Input exceeds maximum length of ${MAX_INPUT_LENGTH} characters`)\n }\n if (/^[+-]?(?:NaN|Infinity)$/.test(text.trim())) {\n throw new RangeError('Input number must be finite')\n }\n\n const normalized = removeCurrencyMarkers(text)\n .trim()\n .replace(/^-\\s+/, '-')\n\n if (/\\s/.test(normalized)) {\n throw new Error('Invalid number format: whitespace is not allowed within the number')\n }\n\n return normalized\n}\n\nexport default normalize\n", "enum DecimalSeparators {\n COMMA = 'comma',\n POINT = 'point',\n}\n\nexport default DecimalSeparators\n", "import DecimalSeparators from '../ts/enum/decimal-separators.enum'\nimport type { DecimalSeparator } from '../types'\n\nexport enum ParseErrorCode {\n INVALID_NUMBER = 'INVALID_NUMBER',\n INVALID_INTEGER = 'INVALID_INTEGER',\n INVALID_DECIMAL = 'INVALID_DECIMAL',\n MULTIPLE_DECIMALS = 'MULTIPLE_DECIMALS',\n INVALID_GROUPING = 'INVALID_GROUPING',\n INCOMPLETE_DECIMAL = 'INCOMPLETE_DECIMAL',\n EMPTY_INPUT = 'EMPTY_INPUT',\n}\n\nexport class ParseError extends Error {\n constructor(message: string, public code: ParseErrorCode) {\n super(message)\n this.name = 'ParseError'\n }\n}\n\n/**\n * Parses a string input into integer and decimal parts\n * @param input - The string to parse\n * @param decimalSeparator - The decimal separator to use (POINT or COMMA)\n * @param preserveLeadingZeros - Whether to preserve leading zeros in the integer part\n * @returns Object containing integer and decimal parts as strings\n * @throws {ParseError} If input is empty\n * @throws {ParseError} If multiple decimal separators are found\n * @throws {ParseError} If integer part contains non-digit characters\n * @throws {ParseError} If decimal part contains non-digit characters\n */\nconst parse = (\n input: string,\n decimalSeparator: DecimalSeparator = DecimalSeparators.POINT,\n preserveLeadingZeros = false,\n): {\n integer: string\n decimal: string\n} => {\n input = input.trim()\n\n const separatorFor = {\n decimal: decimalSeparator === DecimalSeparators.POINT ? '.' : ',',\n thousands: decimalSeparator === DecimalSeparators.POINT ? ',' : '.',\n }\n\n if (input === '') {\n throw new ParseError('Input cannot be empty', ParseErrorCode.EMPTY_INPUT)\n }\n if (input === '-') {\n throw new ParseError('A negative sign must be followed by a number', ParseErrorCode.INVALID_NUMBER)\n }\n if (!/^-?[^-]+$/.test(input)) {\n throw new ParseError(\n 'Invalid number format: the negative sign is only allowed at the beginning.',\n ParseErrorCode.INVALID_NUMBER,\n )\n }\n\n const unsignedInput = input.startsWith('-') ? input.slice(1) : input\n const decimalParts = unsignedInput.split(separatorFor.decimal)\n\n if (decimalParts.length > 2) {\n throw new ParseError(\n `Invalid number format: multiple decimal separators found. Use only one '${separatorFor.decimal}' as decimal separator.`,\n ParseErrorCode.MULTIPLE_DECIMALS,\n )\n }\n if (decimalParts.length === 2 && decimalParts[1] === '') {\n throw new ParseError(\n 'Invalid number format: decimal separator must be followed by digits.',\n ParseErrorCode.INCOMPLETE_DECIMAL,\n )\n }\n\n const [groupedInteger, decimal] = decimalParts\n let integer = groupedInteger\n\n if (integer.includes(separatorFor.thousands)) {\n const groups = integer.split(separatorFor.thousands)\n const validGrouping = /^\\d{1,3}$/.test(groups[0]) &&\n groups.slice(1).every((group) => /^\\d{3}$/.test(group))\n\n if (!validGrouping) {\n throw new ParseError(\n `Invalid thousands grouping for separator '${separatorFor.thousands}'.`,\n ParseErrorCode.INVALID_GROUPING,\n )\n }\n integer = groups.join('')\n }\n\n if (!integer) {\n integer = '0'\n }\n if (!/^\\d+$/.test(integer)) {\n throw new ParseError(\n `Invalid integer part: \"${integer}\". Only digits are allowed.`,\n ParseErrorCode.INVALID_INTEGER,\n )\n }\n if (decimal && !/^\\d+$/.test(decimal)) {\n throw new ParseError(\n `Invalid decimal part: \"${decimal}\". Only digits are allowed.`,\n ParseErrorCode.INVALID_DECIMAL,\n )\n }\n\n return {\n integer: preserveLeadingZeros ? integer : integer.replace(/^0+(?=\\d)/, ''),\n decimal: decimal || '0',\n }\n}\n\nexport default parse\n", "enum Locales {\n BR = 'br',\n PT = 'pt',\n}\n\nexport default Locales\n", "import Locales from '../ts/enum/locales.enum'\nimport type { ExtensoLocale } from '../types'\n\nconst translate = (text: string, locale: ExtensoLocale = Locales.BR): string => {\n switch (locale) {\n case Locales.PT:\n text = text\n .replace(/\\bquatorze\\b/g, 'catorze')\n .replace(/\\bdezesseis\\b/g, 'dezasseis')\n .replace(/\\bdezessete\\b/g, 'dezassete')\n .replace(/\\bdezenove\\b/g, 'dezanove')\n\n return text\n .replace(/[^m]ilh(\u00E3o|\u00F5es)/g, (suffix: string): string => {\n return suffix.replace(/h/g, 'i')\n })\n case Locales.BR:\n default:\n return text\n }\n}\n\nexport default translate\n", "enum Modes {\n ABBREVIATED = 'abbreviated',\n CURRENCY = 'currency',\n DIGIT = 'digit',\n NUMBER = 'number',\n}\n\nexport default Modes\n", "enum Genders {\n MALE = 'male',\n FEMALE = 'female',\n}\n\nexport default Genders\n", "enum Scales {\n SHORT = 'short',\n LONG = 'long',\n}\n\nexport default Scales\n", "import Currencies from '../ts/enum/currencies.enum'\nimport DecimalSeparators from '../ts/enum/decimal-separators.enum'\nimport Genders from '../ts/enum/genders.enum'\nimport Locales from '../ts/enum/locales.enum'\nimport Modes from '../ts/enum/modes.enum'\nimport Scales from '../ts/enum/scales.enum'\nimport Options from '../ts/interface/options.interface'\n\nconst isRecord = (value: unknown): value is Record<string, unknown> => {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n}\n\nconst assertEnumValue = <Value extends string>(\n name: string,\n value: unknown,\n allowed: Record<string, Value>,\n): void => {\n if (value !== undefined && !Object.values(allowed).includes(value as Value)) {\n throw new TypeError(`Invalid ${name}: ${String(value)}`)\n }\n}\n\nconst assertNonEmptyString = (name: string, value: unknown): void => {\n if (typeof value !== 'string' || value.trim() === '') {\n throw new TypeError(`Invalid ${name}: expected a non-empty string`)\n }\n}\n\nconst validateCustomCurrency = (currency: Record<string, unknown>): void => {\n if (currency.code !== undefined) {\n throw new TypeError('Invalid currency options: code cannot be combined with a custom currency')\n }\n\n assertNonEmptyString('currency.singular', currency.singular)\n assertNonEmptyString('currency.plural', currency.plural)\n assertEnumValue('currency.gender', currency.gender, Genders)\n\n if (!isRecord(currency.subunit)) {\n throw new TypeError('Invalid currency.subunit: expected an object')\n }\n\n const subunit = currency.subunit\n assertNonEmptyString('currency.subunit.singular', subunit.singular)\n assertNonEmptyString('currency.subunit.plural', subunit.plural)\n assertEnumValue('currency.subunit.gender', subunit.gender, Genders)\n}\n\n/**\n * Validates every public option at runtime.\n * @param options - Options supplied to the public API\n * @throws {TypeError} If an option has an unsupported value\n */\nconst validateOptions: (options: unknown) => asserts options is Options = (options) => {\n if (!isRecord(options)) {\n throw new TypeError('Options must be an object')\n }\n\n assertEnumValue('mode', options.mode, Modes)\n assertEnumValue('locale', options.locale, Locales)\n assertEnumValue('scale', options.scale, Scales)\n assertEnumValue('decimalSeparator', options.decimalSeparator, DecimalSeparators)\n\n if (options.removeAccents !== undefined && typeof options.removeAccents !== 'boolean') {\n throw new TypeError(`Invalid removeAccents: ${String(options.removeAccents)}`)\n }\n\n if (options.currency !== undefined && !isRecord(options.currency)) {\n throw new TypeError('Invalid currency options: expected an object')\n }\n if (options.number !== undefined && !isRecord(options.number)) {\n throw new TypeError('Invalid number options: expected an object')\n }\n\n const currency = options.currency\n if (currency && ('singular' in currency || 'plural' in currency ||\n 'gender' in currency || 'subunit' in currency)) {\n validateCustomCurrency(currency)\n } else {\n assertEnumValue('currency.code', currency?.code, Currencies)\n }\n const number = options.number\n assertEnumValue('number.gender', number?.gender, Genders)\n if (number?.ordinal !== undefined && typeof number.ordinal !== 'boolean') {\n throw new TypeError(`Invalid number.ordinal: ${String(number.ordinal)}`)\n }\n}\n\nexport default validateOptions\n", "/**\n * Removes diacritical marks from text while preserving its other characters.\n * @param text - The text to normalize\n * @returns The text without accents\n */\nconst removeAccents = (text: string): string =>\n text.normalize('NFD').replace(/\\p{Diacritic}/gu, '')\n\nexport default removeAccents\n", "import Scales from '../ts/enum/scales.enum'\nimport type { ExtensoScale } from '../types'\n\nconst ABBREVIATIONS: Record<ExtensoScale, string[]> = {\n [Scales.SHORT]: [\n 'mil',\n 'mi',\n 'bi',\n 'tri',\n 'qua',\n 'qui',\n 'sex',\n 'sep',\n 'oct',\n 'non',\n 'dec',\n 'undec',\n 'duodec',\n ],\n [Scales.LONG]: [\n 'mil',\n 'mi',\n 'mil mi',\n 'bi',\n 'mil bi',\n 'tri',\n 'mil tri',\n 'qua',\n 'mil qua',\n 'qui',\n 'mil qui',\n 'sex',\n 'mil sex',\n 'sep',\n 'mil sep',\n 'oct',\n 'mil oct',\n 'non',\n 'mil non',\n 'dec',\n 'mil dec',\n 'undec',\n 'mil undec',\n 'duodec',\n ],\n}\n\nconst formatUnabbreviated = (integer: string, decimal: string): string => {\n const significantDecimal = decimal.replace(/0+$/, '')\n\n return significantDecimal === ''\n ? integer\n : `${integer},${significantDecimal}`\n}\n\nconst roundToTenths = (integer: string, decimal: string, exponent: number): bigint => {\n const decimalDigits = decimal === '0' ? '' : decimal\n const digits = BigInt(`${integer}${decimalDigits}`)\n const decimalDivisor = 10n ** BigInt(decimalDigits.length)\n const magnitude = 10n ** BigInt(exponent)\n const divisor = decimalDivisor * magnitude\n\n return ((digits * 10n) + (divisor / 2n)) / divisor\n}\n\n/**\n * Formats a number using compact Portuguese scale abbreviations.\n * Values below one thousand are returned without a scale suffix.\n * @param integer - Absolute integer part of the number\n * @param decimal - Decimal part of the number\n * @param scale - Scale used to select the abbreviation\n * @returns The number in compact notation\n */\nconst writeAbbreviated = (\n integer: string,\n decimal = '0',\n scale: ExtensoScale = Scales.SHORT,\n): string => {\n if (integer.length < 4) {\n return formatUnabbreviated(integer, decimal)\n }\n\n let magnitudeIndex = Math.floor((integer.length - 1) / 3) - 1\n let roundedTenths = roundToTenths(integer, decimal, (magnitudeIndex + 1) * 3)\n\n if (roundedTenths === 10000n) {\n magnitudeIndex += 1\n roundedTenths = 10n\n }\n\n const abbreviation = ABBREVIATIONS[scale][magnitudeIndex]\n\n if (abbreviation === undefined) {\n throw new Error(`Number exceeds ${scale} scale limit`)\n }\n\n const whole = roundedTenths / 10n\n const tenths = roundedTenths % 10n\n const compactNumber = tenths === 0n\n ? whole.toString()\n : `${whole},${tenths}`\n\n return `${compactNumber} ${abbreviation}`\n}\n\nexport default writeAbbreviated\n", "\uFEFFimport Currencies from '../ts/enum/currencies.enum'\nimport Currency from '../ts/interface/currency.interface'\nimport Genders from '../ts/enum/genders.enum'\nimport type { CurrencyCode } from '../types'\n\nconst currencies: Record<CurrencyCode, Currency> = {\n [Currencies.AOA]: {\n singular: 'kwanza',\n plural: 'kwanzas',\n gender: Genders.MALE,\n subunit: {\n singular: 'c\u00EAntimo',\n plural: 'c\u00EAntimos',\n gender: Genders.MALE,\n },\n },\n [Currencies.CVE]: {\n singular: 'escudo',\n plural: 'escudos',\n gender: Genders.MALE,\n subunit: {\n singular: 'centavo',\n plural: 'centavos',\n gender: Genders.MALE,\n },\n },\n [Currencies.BRL]: {\n singular: 'real',\n plural: 'reais',\n gender: Genders.MALE,\n subunit: {\n singular: 'centavo',\n plural: 'centavos',\n gender: Genders.MALE,\n },\n },\n [Currencies.XOF]: {\n singular: 'franco',\n plural: 'francos',\n gender: Genders.MALE,\n subunit: {\n singular: 'centavo',\n plural: 'centavos',\n gender: Genders.MALE,\n },\n },\n [Currencies.MZN]: {\n singular: 'metical',\n plural: 'meticais',\n gender: Genders.MALE,\n subunit: {\n singular: 'centavo',\n plural: 'centavos',\n gender: Genders.MALE,\n },\n },\n [Currencies.EUR]: {\n singular: 'euro',\n plural: 'euros',\n gender: Genders.MALE,\n subunit: {\n singular: 'c\u00EAntimo',\n plural: 'c\u00EAntimos',\n gender: Genders.MALE,\n },\n },\n [Currencies.STN]: {\n singular: 'dobra',\n plural: 'dobras',\n gender: Genders.FEMALE,\n subunit: {\n singular: 'centavo',\n plural: 'centavos',\n gender: Genders.MALE,\n },\n },\n [Currencies.USD]: {\n singular: 'd\u00F3lar',\n plural: 'd\u00F3lares',\n gender: Genders.MALE,\n subunit: {\n singular: 'centavo',\n plural: 'centavos',\n gender: Genders.MALE,\n },\n },\n [Currencies.MOP]: {\n singular: 'pataca',\n plural: 'patacas',\n gender: Genders.FEMALE,\n subunit: {\n singular: 'avo',\n plural: 'avos',\n gender: Genders.MALE,\n },\n },\n}\n\nexport default currencies\n", "/**\n * Splits a string into groups of 3 digits from right to left\n * @param input - The string to split\n * @returns Array of numbers, each representing a group of 3 digits\n */\nconst split = (input: string): number[] => {\n const result = []\n\n for (let i = input.length; i > 0; i -= 3) {\n const start = Math.max(0, i - 3)\n result.unshift(input.slice(start, i))\n }\n\n return result.map(Number)\n}\n\nexport default split\n", "import Scales from '../ts/enum/scales.enum'\nimport type { ExtensoScale } from '../types'\n\nexport const ONE_THOUSAND = 'mil'\n\nconst listFrom1000: Record<ExtensoScale, string[]> = {\n [Scales.SHORT]: [\n 'mil', // 10^3\n 'milh\u00E3o', // 10^6\n 'bilh\u00E3o', // 10^9\n 'trilh\u00E3o', // 10^12\n 'quatrilh\u00E3o', // 10^15\n 'quintilh\u00E3o', // 10^18\n 'sextilh\u00E3o', // 10^21\n 'septilh\u00E3o', // 10^24\n 'octilh\u00E3o', // 10^27\n 'nonilh\u00E3o', // 10^30\n 'decilh\u00E3o', // 10^33\n 'undecilh\u00E3o', // 10^36\n 'duodecilh\u00E3o', // 10^39\n ],\n [Scales.LONG]: [\n 'mil', // 10^3\n 'milh\u00E3o', // 10^6\n 'mil milh\u00E3o', // 10^9\n 'bilh\u00E3o', // 10^12\n 'mil bilh\u00E3o', // 10^15\n 'trilh\u00E3o', // 10^18\n 'mil trilh\u00E3o', // 10^21\n 'quatrilh\u00E3o', // 10^24\n 'mil quatrilh\u00E3o', // 10^27\n 'quintilh\u00E3o', // 10^30\n 'mil quintilh\u00E3o', // 10^33\n 'sextilh\u00E3o', // 10^36\n 'mil sextilh\u00E3o', // 10^39\n 'septilh\u00E3o', // 10^42\n 'mil septilh\u00E3o', // 10^45\n 'octilh\u00E3o', // 10^48\n 'mil octilh\u00E3o', // 10^51\n 'nonilh\u00E3o', // 10^54\n 'mil nonilh\u00E3o', // 10^57\n 'decilh\u00E3o', // 10^60\n 'mil decilh\u00E3o', // 10^63\n 'undecilh\u00E3o', // 10^66\n 'mil undecilh\u00E3o', // 10^69\n 'duodecilh\u00E3o', // 10^72\n ],\n}\n\nexport default listFrom1000\n", "const listFrom0To9: string[] = [\n 'zero',\n 'um',\n 'dois',\n 'tr\u00EAs',\n 'quatro',\n 'cinco',\n 'seis',\n 'sete',\n 'oito',\n 'nove',\n]\n\nexport const listFrom0To9Female: string[] = [\n 'zero',\n 'uma',\n 'duas',\n 'tr\u00EAs',\n 'quatro',\n 'cinco',\n 'seis',\n 'sete',\n 'oito',\n 'nove',\n]\n\nexport default listFrom0To9\n", "const listFrom10To19: string[] = [\n 'dez',\n 'onze',\n 'doze',\n 'treze',\n 'quatorze',\n 'quinze',\n 'dezesseis',\n 'dezessete',\n 'dezoito',\n 'dezenove',\n]\n\nexport default listFrom10To19\n", "const listFrom20To90: string[] = [\n 'vinte',\n 'trinta',\n 'quarenta',\n 'cinquenta',\n 'sessenta',\n 'setenta',\n 'oitenta',\n 'noventa',\n]\n\nexport default listFrom20To90\n", "export const HUNDRED = 'cem'\n\nconst listFrom100To900: string[] = [\n 'cento',\n 'duzentos',\n 'trezentos',\n 'quatrocentos',\n 'quinhentos',\n 'seiscentos',\n 'setecentos',\n 'oitocentos',\n 'novecentos',\n]\n\nexport const listFrom100To900Female: string[] = [\n 'cento',\n 'duzentas',\n 'trezentas',\n 'quatrocentas',\n 'quinhentas',\n 'seiscentas',\n 'setecentas',\n 'oitocentas',\n 'novecentas',\n]\n\nexport default listFrom100To900\n", "import listFrom0To9, { listFrom0To9Female } from '../../lists/list-from-0-to-9'\nimport listFrom10To19 from '../../lists/list-from-10-to-19'\nimport listFrom20To90 from '../../lists/list-from-20-to-90'\nimport listFrom100To900, {\n HUNDRED,\n listFrom100To900Female,\n} from '../../lists/list-from-100-to-900'\nimport Genders from '../../ts/enum/genders.enum'\nimport type { ExtensoGender } from '../../types'\n\n/**\n * Writes a number from 0 to 9 in words\n * @param input - The number to write\n * @returns The number written in words\n */\nexport const writeLowerThan10 = (input: number, gender: ExtensoGender = Genders.MALE): string => {\n return gender === Genders.FEMALE ? listFrom0To9Female[input] : listFrom0To9[input]\n}\n\n/**\n * Writes a number from 0 to 19 in words\n * @param input - The number to write\n * @returns The number written in words\n */\nexport const writeLowerThan20 = (input: number, gender: ExtensoGender = Genders.MALE): string => {\n if (input < 10) {\n return writeLowerThan10(input, gender)\n }\n return listFrom10To19[input - 10]\n}\n\n/**\n * Writes a number from 0 to 99 in words\n * @param input - The number to write\n * @returns The number written in words\n */\nexport const writeLowerThan100 = (input: number, gender: ExtensoGender = Genders.MALE): string => {\n if (input < 20) {\n return writeLowerThan20(input, gender)\n }\n const name = listFrom20To90[(input - input % 10) / 10 - 2]\n if (input % 10 === 0) {\n return name\n }\n return `${name} e ${writeLowerThan10(input % 10, gender)}`\n}\n\n/**\n * Writes a number from 0 to 999 in words\n * @param input - The number to write\n * @returns The number written in words\n */\nconst writeLowerThan1000 = (input: number, gender: ExtensoGender = Genders.MALE): string => {\n if (input < 100) {\n return writeLowerThan100(input, gender)\n }\n const hundreds = gender === Genders.FEMALE ? listFrom100To900Female : listFrom100To900\n const name = hundreds[(input - input % 100) / 100 - 1]\n if (input % 100 === 0) {\n if (input === 100) {\n return HUNDRED\n }\n return name\n }\n return `${name} e ${writeLowerThan100(input % 100, gender)}`\n}\n\nexport default writeLowerThan1000\n", "import Scales from '../../ts/enum/scales.enum'\nimport split from '../../utils/split'\nimport listFrom1000, { ONE_THOUSAND } from '../../lists/list-from-1000'\nimport writeLowerThan1000 from './write-lower-than-1000'\nimport Genders from '../../ts/enum/genders.enum'\nimport type { ExtensoGender, ExtensoScale } from '../../types'\n\nconst needsConjunction = (part: number): boolean => {\n return part < 100 || part % 100 === 0\n}\n\nconst inflectScale = (name: string, quantity: number): string => {\n if (quantity === 1) {\n return name === ONE_THOUSAND ? '' : name\n }\n return name.replace('\u00E3o', '\u00F5es')\n}\n\nconst formatGroup = (\n part: number,\n index: number,\n groups: number[],\n scale: ExtensoScale,\n gender: ExtensoGender,\n): string => {\n if (part === 0) {\n return ''\n }\n\n const scaleName = listFrom1000[scale][index - 1]\n const acceptsRequestedGender = index === 0 || scaleName === ONE_THOUSAND\n const groupGender = acceptsRequestedGender ? gender : Genders.MALE\n const text = writeLowerThan1000(part, groupGender)\n\n if (index === 0) {\n return needsConjunction(part) ? `e ${text}` : text\n }\n if (scaleName === undefined) {\n throw new Error(`Number exceeds ${scale} scale limit`)\n }\n\n const inflectedScale = inflectScale(scaleName, part)\n const groupText = `${inflectedScale ? `${text} ` : ''}${inflectedScale || ONE_THOUSAND}`\n const hasHigherGroup = groups.slice(index + 1).some((group) => group > 0)\n const hasOnlyZeroLowerGroups = groups.slice(0, index).every((group) => group === 0)\n\n return hasHigherGroup && hasOnlyZeroLowerGroups && needsConjunction(part)\n ? `e ${groupText}`\n : groupText\n}\n\nconst punctuate = (parts: string[]): string[] => {\n return parts.map((part, index) => index < parts.length - 2 ? `${part},` : part)\n}\n\n/**\n * Writes an integer of at least one thousand in words.\n * @throws {Error} If the number exceeds the selected scale limit.\n */\nconst writeAtLeast1000 = (\n input: string,\n scale: ExtensoScale = Scales.SHORT,\n gender: ExtensoGender = Genders.MALE,\n): string => {\n const groups = split(input).reverse()\n const writtenGroups = groups\n .map((part, index) => formatGroup(part, index, groups, scale, gender))\n .reverse()\n .filter(Boolean)\n\n return punctuate(writtenGroups).join(' ')\n}\n\nexport default writeAtLeast1000\n", "import Scales from '../ts/enum/scales.enum'\nimport writeAtLeast1000 from './integer/write-greater-than-1000'\nimport writeLowerThan1000 from './integer/write-lower-than-1000'\nimport Genders from '../ts/enum/genders.enum'\nimport type { ExtensoGender, ExtensoScale } from '../types'\n\n/**\n * Writes an integer number in words\n * @param input - The integer to write\n * @param scale - The scale to use (SHORT or LONG)\n * @returns The integer written in words\n */\nconst writeInteger = (\n input: string,\n scale: ExtensoScale = Scales.SHORT,\n gender: ExtensoGender = Genders.MALE,\n): string => {\n const significantInput = input.replace(/^0+(?=\\d)/, '')\n\n if (significantInput.length < 4) {\n return writeLowerThan1000(Number(significantInput), gender)\n }\n return writeAtLeast1000(significantInput, scale, gender)\n}\n\nexport default writeInteger\n", "import Currency from '../ts/interface/currency.interface'\nimport Currencies from '../ts/enum/currencies.enum'\nimport listCurrencies from '../lists/list-currencies'\nimport Scales from '../ts/enum/scales.enum'\nimport writeInteger from '../core/write-integer'\nimport type { CurrencyCode, ExtensoScale } from '../types'\n\nconst ONE_MILLION = 1000000n\n\n/**\n * Writes the unit part of a currency amount\n * @param unit - The unit part of the amount\n * @param currency - The currency configuration\n * @param scale - The scale to use (SHORT or LONG)\n * @returns The unit part written in words with currency name\n */\nexport const writeUnit = (unit: string, currency: Currency, scale: ExtensoScale = Scales.SHORT) => {\n const text = writeInteger(unit, scale, currency.gender)\n const unitValue = BigInt(unit)\n\n if (unitValue === 1n) {\n return `${text} ${currency.singular}`\n }\n if (unitValue >= ONE_MILLION && unitValue % ONE_MILLION === 0n) {\n return `${text} de ${currency.plural}`\n }\n return `${text} ${currency.plural}`\n}\n\n/**\n * Writes the subunit part of a currency amount\n * @param subunit - The subunit part of the amount\n * @param currency - The currency configuration\n * @returns The subunit part written in words with currency name\n */\nexport const writeSubunit = (subunit: string, currency: Currency) => {\n const text = writeInteger(subunit.slice(0, 2), Scales.SHORT, currency.subunit.gender)\n\n if (BigInt(subunit) === 1n) {\n return `${text} ${currency.subunit.singular}`\n }\n return `${text} ${currency.subunit.plural}`\n}\n\n/**\n * Writes a complete currency amount in words\n * @param unit - The unit part of the amount\n * @param subunit - The subunit part of the amount\n * @param currencyOrCode - A supported currency code or a custom currency definition\n * @param scale - The scale to use (SHORT or LONG)\n * @returns The complete amount written in words with currency name\n * @throws {Error} If an invalid currency code is provided\n */\nconst writeCurrency = (\n unit: string,\n subunit = '0',\n currencyOrCode: CurrencyCode | Currency = Currencies.BRL,\n scale: ExtensoScale = Scales.SHORT,\n): string => {\n if (!/^\\d+$/.test(unit) || !/^\\d{1,2}$/.test(subunit)) {\n throw new Error('Currency values must have zero, one, or two decimal places')\n }\n subunit = subunit.padEnd(2, '0')\n\n let currency: Currency\n if (typeof currencyOrCode === 'string') {\n if (!Object.keys(listCurrencies).includes(currencyOrCode)) {\n throw new Error('Invalid currency')\n }\n currency = listCurrencies[currencyOrCode]\n } else {\n currency = currencyOrCode\n }\n const hasUnit = BigInt(unit) > 0n\n const hasSubunit = BigInt(subunit) > 0n\n\n if (!hasUnit && !hasSubunit) {\n return `zero ${currency.plural}`\n }\n if (!hasUnit) {\n return writeSubunit(subunit, currency)\n }\n if (!hasSubunit) {\n return writeUnit(unit, currency, scale)\n }\n return `${writeUnit(unit, currency, scale)} e ${writeSubunit(subunit, currency)}`\n}\n\nexport default writeCurrency\n", "import { writeLowerThan10 } from '../core/integer/write-lower-than-1000'\n\n/**\n * Writes each digit of a number separately in words\n * @param input - The number to write\n * @returns Each digit written in words, separated by spaces\n */\nconst writeDigit = (input: string): string => {\n const parts = input.split(/[.,]/)\n const integerPart = parts[0]\n .split('')\n .map((digit: string) => writeLowerThan10(Number(digit)))\n .join(' ')\n\n // Return only integer part if there's no decimal or decimal part is empty\n if (parts.length === 1 || !parts[1] || parts[1].trim() === '') {\n return integerPart\n }\n\n const decimalPart = parts[1]\n .split('')\n .map((digit: string) => writeLowerThan10(Number(digit)))\n .join(' ')\n\n return `${integerPart} v\u00EDrgula ${decimalPart}`\n}\n\nexport default writeDigit\n", "/**\n * Pluralizes a word based on count\n * @param text - The word to pluralize\n * @param count - The count to determine if pluralization is needed\n * @returns The pluralized word if count is not 1, otherwise the original word\n */\nconst pluralize = (text: string, count: number) => {\n if (count === 1) {\n return text\n }\n return `${text}s`\n}\n\nexport default pluralize\n", "const listDecimals: string[] = [\n 'mil\u00E9simo',\n 'milion\u00E9simo',\n 'bilion\u00E9simo',\n 'trilion\u00E9simo',\n 'quatrilion\u00E9simo',\n 'quintilion\u00E9simo',\n 'sextilion\u00E9simo',\n 'septilion\u00E9simo',\n 'octilion\u00E9simo',\n 'nonilion\u00E9simo',\n 'decilion\u00E9simo',\n 'undecilion\u00E9simo',\n 'duodecilion\u00E9simo',\n]\n\nexport default listDecimals\n", "import pluralize from '../utils/pluralize'\nimport writeInteger from './write-integer'\nimport listDecimals from '../lists/list-decimals'\n\n/**\n * Writes a decimal number in words\n * @param input - The decimal part to write\n * @returns The decimal part written in words\n * @throws {Error} If the number exceeds the limit\n */\nconst writeDecimal = (input: string): string => {\n const text = writeInteger(input)\n const count = Number(input)\n\n if (input.length === 1) {\n return `${text} ${pluralize('d\u00E9cimo', count)}`\n }\n if (input.length === 2) {\n return `${text} ${pluralize('cent\u00E9simo', count)}`\n }\n\n const name = listDecimals[Math.floor(input.length / 3) - 1]\n\n if (name === undefined) {\n throw new Error(`Number exceeds limit`)\n }\n\n switch (input.length % 3) {\n case 1:\n return `${text} ${pluralize('d\u00E9cimo', count)} de ${name}`\n case 2:\n return `${text} ${pluralize('cent\u00E9simo', count)} de ${name}`\n case 0:\n default:\n return `${text} ${pluralize(name, count)}`\n }\n}\n\nexport default writeDecimal\n", "import Scales from '../ts/enum/scales.enum'\nimport listFrom1000 from './list-from-1000'\nimport type { ExtensoScale } from '../types'\n\nexport const ordinalUnits = [\n '',\n 'primeiro',\n 'segundo',\n 'terceiro',\n 'quarto',\n 'quinto',\n 'sexto',\n 's\u00E9timo',\n 'oitavo',\n 'nono',\n]\n\nexport const ordinalTens = [\n 'd\u00E9cimo',\n 'vig\u00E9simo',\n 'trig\u00E9simo',\n 'quadrag\u00E9simo',\n 'quinquag\u00E9simo',\n 'sexag\u00E9simo',\n 'septuag\u00E9simo',\n 'octog\u00E9simo',\n 'nonag\u00E9simo',\n]\n\nexport const ordinalHundreds = [\n 'cent\u00E9simo',\n 'ducent\u00E9simo',\n 'trecent\u00E9simo',\n 'quadringent\u00E9simo',\n 'quingent\u00E9simo',\n 'sexcent\u00E9simo',\n 'septingent\u00E9simo',\n 'octingent\u00E9simo',\n 'nongent\u00E9simo',\n]\n\nconst shortOrdinalScales = [\n 'mil\u00E9simo',\n 'milion\u00E9simo',\n 'bilion\u00E9simo',\n 'trilion\u00E9simo',\n 'quadrilion\u00E9simo',\n 'quintilion\u00E9simo',\n 'sextilion\u00E9simo',\n 'septilion\u00E9simo',\n 'octilion\u00E9simo',\n 'nonilion\u00E9simo',\n 'decilion\u00E9simo',\n 'undecilion\u00E9simo',\n 'duodecilion\u00E9simo',\n]\n\nconst longOrdinalScales = shortOrdinalScales\n .flatMap((name, index) => {\n if (index === 0) {\n return [name]\n }\n return [name, `mil\u00E9simo ${name}`]\n })\n .slice(0, listFrom1000[Scales.LONG].length)\n\nconst listOrdinalScales: Record<ExtensoScale, string[]> = {\n [Scales.SHORT]: shortOrdinalScales,\n [Scales.LONG]: longOrdinalScales,\n}\n\nexport default listOrdinalScales\n", "import listOrdinalScales, {\n ordinalHundreds,\n ordinalTens,\n ordinalUnits,\n} from '../lists/list-ordinals'\nimport Genders from '../ts/enum/genders.enum'\nimport Scales from '../ts/enum/scales.enum'\nimport split from '../utils/split'\nimport type { ExtensoGender, ExtensoScale } from '../types'\n\nconst inflectGender = (text: string, gender: ExtensoGender): string => {\n if (gender === Genders.MALE) {\n return text\n }\n return text.replace(/o\\b/g, 'a')\n}\n\n/**\n * Writes an integer lower than 1000 as an ordinal.\n */\nexport const writeOrdinalLowerThan1000 = (\n input: number,\n gender: ExtensoGender = Genders.MALE,\n): string => {\n const parts = [\n ordinalHundreds[Math.floor(input / 100) - 1],\n ordinalTens[Math.floor(input % 100 / 10) - 1],\n ordinalUnits[input % 10],\n ].filter((part): part is string => Boolean(part))\n\n return inflectGender(parts.join(' '), gender)\n}\n\n/**\n * Writes a non-negative integer as an ordinal.\n */\nconst writeOrdinal = (\n input: string,\n scale: ExtensoScale = Scales.SHORT,\n gender: ExtensoGender = Genders.MALE,\n): string => {\n if (BigInt(input) === 0n) {\n return gender === Genders.FEMALE ? 'zer\u00E9sima' : 'zer\u00E9simo'\n }\n\n const groups = split(input)\n const ordinalScales = listOrdinalScales[scale]\n\n return groups\n .map((group, index) => {\n if (group === 0) {\n return ''\n }\n\n const scaleIndex = groups.length - index - 2\n if (scaleIndex < 0) {\n return writeOrdinalLowerThan1000(group, gender)\n }\n\n const scaleName = ordinalScales[scaleIndex]\n if (scaleName === undefined) {\n throw new Error(`Number exceeds ${scale} scale limit`)\n }\n\n const qualifier = group === 1\n ? ''\n : `${writeOrdinalLowerThan1000(group, gender)} `\n return inflectGender(`${qualifier}${scaleName}`, gender)\n })\n .filter(Boolean)\n .join(' ')\n}\n\nexport default writeOrdinal\n", "import Genders from '../ts/enum/genders.enum'\nimport Scales from '../ts/enum/scales.enum'\nimport pluralize from '../utils/pluralize'\nimport writeInteger from '../core/write-integer'\nimport writeDecimal from '../core/write-decimal'\nimport writeOrdinal from '../core/write-ordinal'\nimport type { ExtensoGender, ExtensoScale } from '../types'\n\n/**\n * Writes a number in words with optional decimal part and gender\n * @param integer - The integer part of the number\n * @param decimal - The decimal part of the number\n * @param scale - The scale to use (SHORT or LONG)\n * @param gender - The gender to use for the number (MALE or FEMALE)\n * @param ordinal - Whether to write the number as an ordinal\n * @returns The complete number written in words\n */\nconst writeNumber = (\n integer: string,\n decimal = '0',\n scale: ExtensoScale = Scales.SHORT,\n gender: ExtensoGender = Genders.MALE,\n ordinal = false,\n): string => {\n const hasDecimalValue = /[1-9]/.test(decimal)\n\n if (ordinal) {\n if (hasDecimalValue) {\n throw new RangeError('Ordinal numbers must be integers')\n }\n return writeOrdinal(integer, scale, gender)\n }\n\n if (integer === '0' && !hasDecimalValue) {\n return 'zero'\n }\n if (integer === '0') {\n return writeDecimal(decimal)\n }\n\n let text: string\n if (!hasDecimalValue) {\n text = writeInteger(integer, scale, gender)\n } else {\n const whole = gender === Genders.FEMALE ? 'inteira' : 'inteiro'\n text = `${writeInteger(integer, scale, gender)} ${pluralize(whole, Number(integer))} e ${writeDecimal(decimal)}`\n }\n\n return text\n}\n\nexport default writeNumber\n", "import writeAbbreviated from '../mode/write-abbreviated'\nimport writeCurrency from '../mode/write-currency'\nimport writeDigit from '../mode/write-digit'\nimport writeNumber from '../mode/write-number'\nimport type {\n CurrencyCode,\n CurrencyDefinition,\n ExtensoMode,\n ExtensoOptions,\n} from '../types'\n\ninterface ParsedNumber {\n integer: string\n decimal: string\n decimalSeparator: ',' | '.'\n hasDecimalSeparator: boolean\n}\n\n/** Converts a parsed, unsigned number according to the selected output mode. */\nconst convert = (\n parsed: ParsedNumber,\n mode: ExtensoMode,\n currency: CurrencyCode | CurrencyDefinition,\n options: ExtensoOptions,\n): string => {\n const { integer, decimal, decimalSeparator, hasDecimalSeparator } = parsed\n\n switch (mode) {\n case 'abbreviated':\n return writeAbbreviated(integer, decimal, options.scale)\n case 'currency':\n if (decimal.length > 2) {\n throw new RangeError('Currency values must have zero, one, or two decimal places')\n }\n return writeCurrency(integer, decimal, currency, options.scale)\n case 'digit':\n return hasDecimalSeparator\n ? writeDigit(`${integer}${decimalSeparator}${decimal}`)\n : writeDigit(integer)\n case 'number':\n return writeNumber(\n integer,\n decimal,\n options.scale,\n options.number?.gender,\n options.number?.ordinal,\n )\n }\n}\n\nexport default convert\n", "import { findCurrencies } from './currency-markers'\nimport type { CurrencyCode } from '../types'\n\n/**\n * Detects currency code or symbol in the input string\n * @param input - The input string to check for currency\n * @returns The detected currency code or undefined if none found\n * @throws {Error} If markers for more than one currency are present\n */\nconst detectCurrency = (input: string): CurrencyCode | undefined => {\n const currencies = [...new Set(findCurrencies(input))]\n\n if (currencies.length > 1) {\n throw new Error(`Conflicting currency markers: ${currencies.join(', ')}`)\n }\n\n return currencies[0]\n}\n\nexport default detectCurrency\n", "import Currencies from '../ts/enum/currencies.enum'\nimport Modes from '../ts/enum/modes.enum'\nimport detectCurrency from '../utils/detect-currency'\nimport type {\n CurrencyCode,\n CurrencyDefinition,\n CurrencyOptions,\n ExtensoMode,\n ExtensoOptions,\n} from '../types'\n\ninterface ConversionSettings {\n currency: CurrencyCode | CurrencyDefinition\n mode: ExtensoMode\n}\n\nconst isCustomCurrency = (\n currency: CurrencyOptions | undefined,\n): currency is CurrencyDefinition & { code?: never } => {\n return currency !== undefined && currency.singular !== undefined\n}\n\n/** Resolves implicit mode and currency choices before the input is normalized. */\nconst resolveConversion = (input: unknown, options: ExtensoOptions): ConversionSettings => {\n const detectedCurrency = typeof input === 'string' ? detectCurrency(input) : undefined\n const customCurrency = isCustomCurrency(options.currency) ? options.currency : undefined\n const currencyCode = options.currency?.code ?? detectedCurrency ?? Currencies.BRL\n\n return {\n currency: customCurrency ?? currencyCode,\n mode: options.mode ?? (detectedCurrency || options.currency !== undefined\n ? Modes.CURRENCY\n : Modes.NUMBER),\n }\n}\n\nexport default resolveConversion\n"],
"mappings": "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",
"names": ["index_exports", "__export", "index_default", "__toCommonJS", "Currencies", "currencies_enum_default", "currencySymbols", "currencies_enum_default", "escapeRegularExpression", "text", "symbolPattern", "first", "second", "codePattern", "markerPattern", "findCurrencies", "input", "match", "removeCurrencyMarkers", "MAX_INPUT_LENGTH", "expandExponential", "input", "match", "sign", "integer", "fraction", "exponentText", "exponent", "digits", "normalize", "text", "normalized", "removeCurrencyMarkers", "normalize_default", "DecimalSeparators", "decimal_separators_enum_default", "ParseError", "message", "code", "parse", "input", "decimalSeparator", "decimal_separators_enum_default", "preserveLeadingZeros", "separatorFor", "decimalParts", "groupedInteger", "decimal", "integer", "groups", "group", "parse_default", "Locales", "locales_enum_default", "translate", "text", "locale", "locales_enum_default", "suffix", "translate_default", "Modes", "modes_enum_default", "Genders", "genders_enum_default", "Scales", "scales_enum_default", "isRecord", "value", "assertEnumValue", "name", "allowed", "assertNonEmptyString", "validateCustomCurrency", "currency", "genders_enum_default", "subunit", "validateOptions", "options", "modes_enum_default", "locales_enum_default", "scales_enum_default", "decimal_separators_enum_default", "currencies_enum_default", "number", "validate_options_default", "removeAccents", "text", "remove_accents_default", "ABBREVIATIONS", "scales_enum_default", "formatUnabbreviated", "integer", "decimal", "significantDecimal", "roundToTenths", "exponent", "decimalDigits", "digits", "decimalDivisor", "magnitude", "divisor", "writeAbbreviated", "scale", "magnitudeIndex", "roundedTenths", "abbreviation", "whole", "tenths", "write_abbreviated_default", "currencies", "currencies_enum_default", "genders_enum_default", "list_currencies_default", "split", "input", "result", "i", "start", "split_default", "ONE_THOUSAND", "listFrom1000", "scales_enum_default", "list_from_1000_default", "listFrom0To9", "listFrom0To9Female", "list_from_0_to_9_default", "listFrom10To19", "list_from_10_to_19_default", "listFrom20To90", "list_from_20_to_90_default", "listFrom100To900", "listFrom100To900Female", "list_from_100_to_900_default", "writeLowerThan10", "input", "gender", "genders_enum_default", "listFrom0To9Female", "list_from_0_to_9_default", "writeLowerThan20", "list_from_10_to_19_default", "writeLowerThan100", "name", "list_from_20_to_90_default", "writeLowerThan1000", "listFrom100To900Female", "list_from_100_to_900_default", "write_lower_than_1000_default", "needsConjunction", "part", "inflectScale", "name", "quantity", "ONE_THOUSAND", "formatGroup", "index", "groups", "scale", "gender", "scaleName", "list_from_1000_default", "groupGender", "genders_enum_default", "text", "write_lower_than_1000_default", "inflectedScale", "groupText", "hasHigherGroup", "group", "hasOnlyZeroLowerGroups", "punctuate", "parts", "writeAtLeast1000", "input", "scales_enum_default", "split_default", "writtenGroups", "write_greater_than_1000_default", "writeInteger", "input", "scale", "scales_enum_default", "gender", "genders_enum_default", "significantInput", "write_lower_than_1000_default", "write_greater_than_1000_default", "write_integer_default", "ONE_MILLION", "writeUnit", "unit", "currency", "scale", "scales_enum_default", "text", "write_integer_default", "unitValue", "writeSubunit", "subunit", "writeCurrency", "currencyOrCode", "currencies_enum_default", "list_currencies_default", "hasUnit", "hasSubunit", "write_currency_default", "writeDigit", "input", "parts", "integerPart", "digit", "writeLowerThan10", "decimalPart", "write_digit_default", "pluralize", "text", "count", "pluralize_default", "listDecimals", "list_decimals_default", "writeDecimal", "input", "text", "write_integer_default", "count", "pluralize_default", "name", "list_decimals_default", "write_decimal_default", "ordinalUnits", "ordinalTens", "ordinalHundreds", "shortOrdinalScales", "longOrdinalScales", "name", "index", "list_from_1000_default", "scales_enum_default", "listOrdinalScales", "list_ordinals_default", "inflectGender", "text", "gender", "genders_enum_default", "writeOrdinalLowerThan1000", "input", "parts", "ordinalHundreds", "ordinalTens", "ordinalUnits", "part", "writeOrdinal", "scale", "scales_enum_default", "groups", "split_default", "ordinalScales", "list_ordinals_default", "group", "index", "scaleIndex", "scaleName", "qualifier", "write_ordinal_default", "writeNumber", "integer", "decimal", "scale", "scales_enum_default", "gender", "genders_enum_default", "ordinal", "hasDecimalValue", "write_ordinal_default", "write_decimal_default", "text", "write_integer_default", "whole", "pluralize_default", "write_number_default", "convert", "parsed", "mode", "currency", "options", "integer", "decimal", "decimalSeparator", "hasDecimalSeparator", "write_abbreviated_default", "write_currency_default", "write_digit_default", "write_number_default", "convert_default", "detectCurrency", "input", "currencies", "findCurrencies", "detect_currency_default", "isCustomCurrency", "currency", "resolveConversion", "input", "options", "detectedCurrency", "detect_currency_default", "customCurrency", "currencyCode", "currencies_enum_default", "modes_enum_default", "resolve_conversion_default", "NEGATIVE_SIGN", "extenso", "input", "options", "validate_options_default", "inputIsNumber", "currency", "mode", "resolve_conversion_default", "normalize_default", "parseSeparator", "decimal_separators_enum_default", "decimalSeparator", "hasDecimal", "integer", "decimal", "parse_default", "modes_enum_default", "isNonZero", "text", "convert_default", "translate_default", "remove_accents_default", "index_default"]
}