money-lib
Version:
TypeScript library to work with money
147 lines (110 loc) • 3.6 kB
text/typescript
import { config, setConfig } from "./config";
import {
zero,
fromInt,
fromFloat,
fromFloatString,
fromIntString,
toInt,
toFloat,
add,
subtract,
multiply,
divide,
compare,
equals,
greaterThan,
greaterThanOrEqual,
lessThan,
lessThanOrEqual,
isZero,
isPositive,
isNegative,
isValid,
split,
format,
formatParts,
parse,
toString,
toFloatString,
min,
max,
abs,
} from "./core";
import type { ChainedMoney, Cents, Money } from "./types";
// unwrap Money from chain, or init with zero value
const unwrap = (m: Money | ChainedMoney): Money => {
return isValid(m) ? m : m.toJSON();
};
/**
* @hint Use V2
* @example import { money } from "money-lib/dist/v2"
*/
const moneyChain = (money: Money | ChainedMoney = zero()): ChainedMoney => {
const _m = unwrap(money);
_m.currency = _m.currency || config.defaultCurrency;
return {
zero: () => moneyChain(zero()),
fromInt: (amount: Cents, currency?: string) =>
moneyChain(fromInt(amount, currency)),
fromFloat: (amount: number, currency?: string) =>
moneyChain(fromFloat(amount, currency)),
fromIntString: (amount: string, currency?: string) =>
moneyChain(fromIntString(amount, currency)),
fromFloatString: (amount: string, currency?: string) =>
moneyChain(fromFloatString(amount, currency)),
toInt: () => toInt(_m),
toCents: () => toInt(_m),
toFloat: () => toFloat(_m),
toString: () => toString(_m),
toIntString: () => toString(_m),
toCentsString: () => toString(_m),
toFloatString: () => toFloatString(_m),
compare: (m: Money | ChainedMoney) => compare(_m, unwrap(m)),
equals: (m: Money | ChainedMoney) => equals(_m, unwrap(m)),
greaterThan: (m: Money | ChainedMoney) => greaterThan(_m, unwrap(m)),
greaterThanOrEqual: (m: Money | ChainedMoney) =>
greaterThanOrEqual(_m, unwrap(m)),
lessThan: (m: Money | ChainedMoney) => lessThan(_m, unwrap(m)),
lessThanOrEqual: (m: Money | ChainedMoney) =>
lessThanOrEqual(_m, unwrap(m)),
isZero: () => isZero(_m),
isPositive: () => isPositive(_m),
isNegative: () => isNegative(_m),
min: (m1: Money | ChainedMoney, ...m: (Money | ChainedMoney)[]) =>
moneyChain(min(unwrap(m1), ...m.map(unwrap))),
max: (m1: Money | ChainedMoney, ...m: (Money | ChainedMoney)[]) =>
moneyChain(max(unwrap(m1), ...m.map(unwrap))),
isValid: () => isValid(_m),
split: () => split(_m),
add: (m1: Money | ChainedMoney, ...m: (Money | ChainedMoney)[]) =>
moneyChain(add(_m, unwrap(m1), ...m.map(unwrap))),
subtract: (m1: Money | ChainedMoney, ...m: (Money | ChainedMoney)[]) =>
moneyChain(subtract(_m, unwrap(m1), ...m.map(unwrap))),
multiply: (multiplier: number, round = Math.round) =>
moneyChain(multiply(_m, multiplier, round)),
divide: (divider: number, round = Math.round) =>
moneyChain(divide(_m, divider, round)),
abs: () => moneyChain(abs(_m)),
format: (ops?: {
locale?: string;
cents?: boolean | "no" | "ifAny";
withPlusSign?: boolean;
trailingZeros?: boolean;
}) => format(_m, ops),
formatParts: (locale?: string) => formatParts(_m, locale),
parse: (
s: string,
currency: string,
locale?: string,
decimalSeparator?: "." | ","
) => moneyChain(parse(s, currency, locale, decimalSeparator)),
debug: (prefix = "money:") => {
console.log(prefix, _m);
return moneyChain(_m);
},
toJSON: () => _m,
};
};
moneyChain.config = setConfig;
export default moneyChain;