{"version":3,"file":"simple-mask-money.js","sources":["../src/args.js","../src/core.js","../src/implanter.js","../src/index.js"],"sourcesContent":["module.exports = class Args {\r\n constructor(args) {\r\n this.afterFormat = () => {}; \r\n this.allowNegative = false; \r\n this.beforeFormat = () => {}; \r\n this.negativeSignAfter = false;\r\n this.decimalSeparator = ',';\r\n this.fixed = true;\r\n this.fractionDigits = 2;\r\n this.prefix = '';\r\n this.suffix = '';\r\n this.thousandsSeparator = '.';\r\n this.cursor = 'move';\r\n\r\n this.merge(args);\r\n }\r\n\r\n merge(args) {\r\n if (!args || typeof args !== 'object') return;\r\n\r\n this.fractionDigits = typeof args.fractionDigits === 'undefined' || isNaN(args.fractionDigits) ? this.fractionDigits : parseInt(args.fractionDigits);\r\n this.afterFormat = typeof args.afterFormat === 'function' ? args.afterFormat : this.afterFormat;\r\n this.beforeFormat = typeof args.beforeFormat === 'function' ? args.beforeFormat : this.beforeFormat;\r\n\r\n this.fixed = typeof args.fixed === 'boolean' ? args.fixed : this.fixed;\r\n this.allowNegative = typeof args.allowNegative === 'boolean' ? args.allowNegative : this.allowNegative; \r\n this.negativeSignAfter = typeof args.negativeSignAfter === 'boolean' ? args.negativeSignAfter : this.negativeSignAfter;\r\n\r\n this.decimalSeparator = typeof args.decimalSeparator === 'undefined' ? this.decimalSeparator : args.decimalSeparator;\r\n this.prefix = typeof args.prefix === 'undefined' ? this.prefix : args.prefix;\r\n this.suffix = typeof args.suffix === 'undefined' ? this.suffix : args.suffix;\r\n this.thousandsSeparator = typeof args.thousandsSeparator === 'undefined' ? this.thousandsSeparator : args.thousandsSeparator;\r\n this.cursor = typeof args.cursor === 'undefined' ? this.cursor : args.cursor;\r\n }\r\n};\r\n","const Args = require('./args');\r\nmodule.exports = class Core {\r\n constructor(args) {\r\n this.args = new Args(args);\r\n }\r\n\r\n addCompleter(value, completer, length, start = true) {\r\n while (value.length < length) {\r\n value = start ? `${completer}${value}` : `${value}${completer}`;\r\n }\r\n\r\n return value;\r\n }\r\n\r\n addPrefix(value) {\r\n return `${this.args.prefix}${value}`;\r\n }\r\n\r\n addSeparators(value) {\r\n let size = value.length - this.args.fractionDigits;\r\n let character = this.args.fixed ? 'd' : 'w';\r\n let regexp = `\\\\,?||\\\\.?(\\\\${character})`;\r\n let hundreds = Math.ceil(size / 3);\r\n\r\n let replacement = `${this.args.decimalSeparator}$${hundreds + 1}`;\r\n\r\n for (let i = hundreds; i !== 0; i--) {\r\n if (size >= 3) {\r\n regexp = `(\\\\${character}{3})${regexp}`;\r\n size -= 3;\r\n } else {\r\n regexp = `(\\\\${character}{${size}})${regexp}`;\r\n }\r\n\r\n if (i > 1) {\r\n replacement = `${this.args.thousandsSeparator}$${i}${replacement}`;\r\n } else {\r\n replacement = `$${i}${replacement}`;\r\n }\r\n }\r\n\r\n return value.replace(new RegExp(regexp), replacement);\r\n }\r\n\r\n addSuffix(value) {\r\n return `${value}${this.args.suffix}`;\r\n }\r\n\r\n adjustDotPosition(value) {\r\n let fractionDigits;\r\n let result = value.toString();\r\n\r\n result = result.replace('.', '');\r\n fractionDigits = result.length - this.args.fractionDigits;\r\n result = `${result.substring(0, fractionDigits)}.${result.substring(fractionDigits)}`;\r\n\r\n return result;\r\n }\r\n\r\n completer(size = 1) {\r\n return this.args.fixed ? ''.padEnd(size, '0') : ''.padEnd(size, '_');\r\n }\r\n\r\n checkNumberStart(value, separator) {\r\n const result = value.toString();\r\n return result[0] === separator ? `${this.args.fixed ? '0' : '_'}${result}` : result;\r\n }\r\n\r\n checkSuffix(value) {\r\n let result;\r\n const lastIndex = value.length - 1;\r\n const lastButOneIndex = lastIndex - 1;\r\n const currentLastSuffix = value.substring(lastIndex - this.args.suffix.length + 1, lastIndex + this.args.suffix.length);\r\n const currentLastButOneSuffix = value.substring(lastButOneIndex - this.args.suffix.length + 1, lastButOneIndex + this.args.suffix.length);\r\n\r\n switch (this.args.suffix) {\r\n case currentLastSuffix:\r\n result = value;\r\n break;\r\n case currentLastButOneSuffix:\r\n var start = value.substring(0, lastButOneIndex);\r\n result = `${start}${value.substring(value.length + this.args.suffix.length + 1, lastButOneIndex + this.args.suffix.length)}.`;\r\n break;\r\n default:\r\n result = `${value.substring(0, lastIndex)}.`;\r\n break;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n emptyOrInvalid() {\r\n return `${this.completer()}${this.args.decimalSeparator}${this.completer(this.args.fractionDigits)}`;\r\n }\r\n\r\n isFloat(number) {\r\n return number % 1 !== 0;\r\n }\r\n\r\n mask(value) {\r\n const negative = this.args.allowNegative && value.indexOf('-') !== -1;\r\n let result = `${this.writingToNumber(value) || this.emptyOrInvalid()}`;\r\n result = this.replaceSeparator(result, this.args.decimalSeparator, '.');\r\n const completer = this.completer();\r\n\r\n if (!isNaN(this.removeCompleter(result, completer))) {\r\n result = this.replaceSeparator(result, '.');\r\n result = this.addCompleter(result || '', completer, this.args.fractionDigits);\r\n result = this.args.fractionDigits >= result.length ? `${completer}${result}` : result;\r\n result = this.addSeparators(result);\r\n }\r\n\r\n if (this.args.prefix) {\r\n result = this.addPrefix(result);\r\n }\r\n if (this.args.suffix) {\r\n result = this.addSuffix(result);\r\n }\r\n\r\n return `${!this.args.negativeSignAfter && negative ? '-' : ''}${result}${this.args.negativeSignAfter && negative ? '-' : ''}`;\r\n }\r\n\r\n numberToText(value) {\r\n const completer = this.completer();\r\n let result = this.emptyOrInvalid();\r\n value = this.replaceSeparator(value.toString(), this.args.decimalSeparator, '.');\r\n\r\n if (!isNaN(value)) {\r\n if (this.isFloat(value)) {\r\n const number = value.split('.');\r\n let hundreds = number[0];\r\n let decimals = number[1];\r\n\r\n decimals = this.addCompleter(decimals || '', completer, this.args.fractionDigits, false);\r\n\r\n result = `${hundreds}${decimals}`;\r\n } else {\r\n result = this.removeCompleter(value, completer);\r\n result = this.addCompleter(typeof result === 'string' ? result : '', completer, this.args.fractionDigits + result.length, false);\r\n }\r\n \r\n result = this.addSeparators(result);\r\n result = this.checkNumberStart(result, this.args.decimalSeparator);\r\n }\r\n \r\n if (this.args.prefix) {\r\n result = this.addPrefix(result);\r\n }\r\n if (this.args.suffix) {\r\n result = this.addSuffix(result);\r\n }\r\n \r\n return result;\r\n }\r\n\r\n onlyNumber(value) {\r\n const hasDecimalSeparator = value.toString().indexOf(this.args.decimalSeparator);\r\n let putDecimalSeparator = false;\r\n let result = '';\r\n\r\n for (let i = value.length - 1; i >= 0; i--) {\r\n if (isFinite(value[i]) || (!this.args.fixed && value[i] === '_')) {\r\n result = value[i] + result;\r\n } else if (hasDecimalSeparator !== -1 && !putDecimalSeparator && value[i] === this.args.decimalSeparator) {\r\n result = value[i].replace(this.args.decimalSeparator, '.') + result;\r\n putDecimalSeparator = true;\r\n }\r\n }\r\n\r\n\r\n return result[0] === '.' ? `0${result}` : result;\r\n }\r\n\r\n removeCompleter(value, completer, start = true) {\r\n const getPosition = () => start ? 0 : value.length - 1;\r\n let position = getPosition();\r\n\r\n while (value[position] === completer) {\r\n value = value.substring(0, position - 1) + value.substring(position + 1, value.length);\r\n position = getPosition();\r\n }\r\n\r\n return value;\r\n }\r\n\r\n removePrefix(value) {\r\n const position = value.indexOf(this.args.prefix, 0);\r\n\r\n if (position !== -1) {\r\n value = value.substring(this.args.prefix.length, value.length);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n removeSuffix(value) {\r\n const position = value.indexOf(this.args.suffix, value.length - this.args.suffix.length);\r\n\r\n if (position !== -1) {\r\n const start = value.substring(0, position);\r\n value = start + value.substring(start.length + this.args.suffix.length - 1, value.length - 1);\r\n }\r\n\r\n return value;\r\n }\r\n\r\n replaceSeparator(value, separator, replacer = '') {\r\n return value.replace(new RegExp(`\\\\${separator}`, 'g'), replacer);\r\n }\r\n\r\n textToNumber(value) {\r\n let result = value.toString();\r\n let completer = this.completer();\r\n\r\n if (this.args.prefix) {\r\n result = this.removePrefix(result);\r\n }\r\n\r\n if (this.args.suffix) {\r\n result = this.removeSuffix(result);\r\n }\r\n\r\n result = this.onlyNumber(result);\r\n\r\n if (result) {\r\n result = this.removeCompleter(result, completer);\r\n result = this.checkNumberStart(result, '.');\r\n }\r\n\r\n return result || (this.args.fixed ? '0' : '');\r\n }\r\n\r\n writingToNumber(value) {\r\n let result = value.toString();\r\n let completer = this.completer();\r\n\r\n if (this.args.prefix) {\r\n result = this.removePrefix(result);\r\n }\r\n\r\n if (this.args.suffix) {\r\n result = this.checkSuffix(result);\r\n result = this.removeSuffix(result);\r\n }\r\n\r\n result = this.onlyNumber(result);\r\n\r\n if (result) {\r\n result = this.adjustDotPosition(result);\r\n\r\n result = this.removeCompleter(result, completer);\r\n\r\n result = this.checkNumberStart(result, '.');\r\n }\r\n\r\n return result || (this.args.fixed ? '0' : '');\r\n }\r\n};\r\n","module.exports = {\r\n getCaretPosition(input) {\r\n let position = -1;\r\n if ('selectionStart' in input) {\r\n position = input.selectionStart;\r\n } else if (document.selection) {\r\n input.focus();\r\n const range = document.selection.createRange();\r\n const length = document.selection.createRange().text.length;\r\n range.moveStart('character', -input.value.length);\r\n position = range.text.length - length;\r\n }\r\n return position;\r\n },\r\n\r\n setCaretPosition(input, index) {\r\n if (input.setSelectionRange) {\r\n input.focus();\r\n input.setSelectionRange(index, index);\r\n } else if (input.createTextRange) {\r\n const range = input.createTextRange();\r\n range.collapse(true);\r\n range.moveEnd('character', index);\r\n range.moveStart('character', index);\r\n range.select();\r\n }\r\n },\r\n\r\n indexMove(newValue, oldValue, index) {\r\n switch (true) {\r\n case oldValue.length < newValue.length:\r\n return index + 1;\r\n case oldValue.length > newValue.length:\r\n return index - 1;\r\n default:\r\n return index;\r\n }\r\n },\r\n\r\n addPropertyMask(input, core) {\r\n input.maskArgs = {};\r\n\r\n for (const k in core.args) {\r\n Object.defineProperty(input.maskArgs, k, {\r\n get: () => core.args[k],\r\n set: (value) => {\r\n core.args[k] = value;\r\n this.refreshMask(input);\r\n }\r\n });\r\n }\r\n },\r\n\r\n addMask(input, core) {\r\n input.addEventListener('input', e => {\r\n const oldValue = input.value;\r\n core.args.beforeFormat(oldValue);\r\n const newValue = core.mask(oldValue);\r\n const oldCaretPosition = this.getCaretPosition(input);\r\n let newCaretPosition = this.indexMove(newValue, oldValue, oldCaretPosition);\r\n\r\n if (input.maskArgs.cursor === 'start') {\r\n newCaretPosition = 0;\r\n } else if (input.maskArgs.cursor === 'end') {\r\n newCaretPosition = newValue.length;\r\n }\r\n\r\n input.value = newValue;\r\n input._value = newValue;\r\n\r\n this.setCaretPosition(input, newCaretPosition);\r\n core.args.afterFormat(newValue);\r\n !(e instanceof Event) && this.refreshMask(input);\r\n });\r\n },\r\n\r\n refreshMask(input) {\r\n input.dispatchEvent(new Event('input'));\r\n }\r\n};\r\n","const Args = require('./args');\r\nconst Core = require('./core');\r\nconst implanter = require('./implanter');\r\n\r\nlet _args = new Args();\r\n\r\nmodule.exports = class SimpleMaskMoney {\r\n static get args() {\r\n return _args;\r\n }\r\n\r\n static set args(value) {\r\n _args = new Args(value);\r\n }\r\n\r\n static formatToCurrency(value, args) {\r\n const core = new Core(typeof args !== 'undefined' && typeof args === 'object' ? args : _args);\r\n core.args.beforeFormat(value);\r\n\r\n const negative = core.args.allowNegative && value.indexOf('-') !== -1; \r\n const formatation = core.numberToText(core.textToNumber(value));\r\n const result = `${!core.args.negativeSignAfter && negative ? '-': ''}${formatation}${core.args.negativeSignAfter && negative ? '-': ''}`;\r\n \r\n core.args.afterFormat(result);\r\n \r\n return result;\r\n }\r\n\r\n static formatToMask(input, args) {\r\n const core = new Core(typeof args !== 'undefined' && typeof args === 'object' ? args : _args);\r\n const value = input.toString(); \r\n core.args.beforeFormat(value);\r\n\r\n const result = core.mask(value);\r\n\r\n core.args.afterFormat(result);\r\n \r\n return result;\r\n }\r\n\r\n static formatToNumber(input, args) {\r\n const core = new Core(typeof args !== 'undefined' && typeof args === 'object' ? args : _args);\r\n let value = input.toString(); \r\n core.args.beforeFormat(value);\r\n let result = '0';\r\n\r\n const negative = core.args.allowNegative && value.indexOf('-') !== -1; \r\n \r\n if (negative) {\r\n value = value.replace('-', '');\r\n }\r\n\r\n value = core.textToNumber(value);\r\n \r\n if (!this.args.fixed) {\r\n value = value.replace(new RegExp('_', 'g'), '');\r\n }\r\n\r\n if (!isNaN(value)) {\r\n result = parseFloat(negative ? value * -1 : value);\r\n }\r\n\r\n core.args.afterFormat(result);\r\n \r\n return result;\r\n }\r\n\r\n static setMask(element, args) {\r\n if (typeof document === 'undefined') throw 'This function only works on client side';\r\n\r\n const input = typeof element == 'string' ? document.querySelector(element) : element; \r\n const core = new Core(typeof args !== 'undefined' && typeof args === 'object' ? args : _args);\r\n \r\n implanter.addPropertyMask(input, core);\r\n implanter.addMask(input, core);\r\n implanter.refreshMask(input);\r\n\r\n input.formatToNumber = () => SimpleMaskMoney.formatToNumber(input.value, input.maskArgs);\r\n\r\n return input;\r\n }\r\n};\r\n"],"names":["module","args","afterFormat","allowNegative","beforeFormat","negativeSignAfter","decimalSeparator","fixed","fractionDigits","prefix","suffix","thousandsSeparator","cursor","merge","isNaN","parseInt","Args","value","completer","length","start","size","character","regexp","hundreds","Math","ceil","replacement","i","replace","RegExp","result","toString","substring","padEnd","separator","lastIndex","lastButOneIndex","currentLastSuffix","currentLastButOneSuffix","number","negative","indexOf","writingToNumber","emptyOrInvalid","replaceSeparator","removeCompleter","addCompleter","addSeparators","addPrefix","addSuffix","isFloat","split","decimals","checkNumberStart","hasDecimalSeparator","putDecimalSeparator","isFinite","getPosition","position","replacer","removePrefix","removeSuffix","onlyNumber","checkSuffix","adjustDotPosition","input","selectionStart","document","selection","focus","range","createRange","text","moveStart","index","setSelectionRange","createTextRange","collapse","moveEnd","select","newValue","oldValue","core","maskArgs","k","defineProperty","refreshMask","addEventListener","mask","oldCaretPosition","getCaretPosition","newCaretPosition","indexMove","_value","setCaretPosition","e","Event","dispatchEvent","_args","Core","formatation","numberToText","textToNumber","parseFloat","element","querySelector","addPropertyMask","addMask","formatToNumber","SimpleMaskMoney"],"mappings":"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"}