Files
medusa-store/packages/utils/src/totals/big-number.ts
T
Adrien de Peretti 36a61658f9 feat(utils): Fix big number decorator and cleanup (#6473)
**What**
- Fix big number decorator and cleanup
2024-02-22 16:58:41 +00:00

107 lines
2.6 KiB
TypeScript

import { BigNumberInput, BigNumberRawValue } from "@medusajs/types"
import { BigNumber as BigNumberJS } from "bignumber.js"
import { isBigNumber, isString } from "../common"
export class BigNumber {
static DEFAULT_PRECISION = 20
private numeric_: number
private raw_?: BigNumberRawValue
constructor(rawPrice: BigNumberInput, options?: { precision?: number }) {
this.setRawPriceOrThrow(rawPrice, options)
}
setRawPriceOrThrow(
rawPrice: BigNumberInput,
{ precision }: { precision?: number } = {}
) {
precision ??= BigNumber.DEFAULT_PRECISION
if (BigNumberJS.isBigNumber(rawPrice)) {
/**
* Example:
* const bnUnitPrice = new BigNumberJS("10.99")
* const unitPrice = new BigNumber(bnUnitPrice)
*/
this.numeric_ = rawPrice.toNumber()
this.raw_ = {
value: rawPrice.toPrecision(precision),
precision,
}
} else if (isString(rawPrice)) {
/**
* Example: const unitPrice = "1234.1234"
*/
const bigNum = new BigNumberJS(rawPrice)
this.numeric_ = bigNum.toNumber()
this.raw_ = this.raw_ = {
value: bigNum.toPrecision(precision),
precision,
}
} else if (isBigNumber(rawPrice)) {
/**
* Example: const unitPrice = { value: "1234.1234" }
*/
this.numeric_ = BigNumberJS(rawPrice.value).toNumber()
this.raw_ = {
...rawPrice,
precision,
}
} else if (typeof rawPrice === `number` && !Number.isNaN(rawPrice)) {
/**
* Example: const unitPrice = 1234
*/
this.numeric_ = rawPrice as number
this.raw_ = {
value: BigNumberJS(rawPrice as number).toPrecision(precision),
precision,
}
} else {
throw new Error(
"Invalid BigNumber value. Should be one of: string, number, BigNumber (bignumber.js), BigNumberRawValue"
)
}
}
get numeric(): number {
let raw = this.raw_ as BigNumberRawValue
if (raw) {
return new BigNumberJS(raw.value).toNumber()
} else {
return this.numeric_
}
}
set numeric(value: BigNumberInput) {
const newValue = new BigNumber(value)
this.numeric_ = newValue.numeric_
this.raw_ = newValue.raw_
}
get raw(): BigNumberRawValue | undefined {
return this.raw_
}
set raw(rawValue: BigNumberInput) {
const newValue = new BigNumber(rawValue)
this.numeric_ = newValue.numeric_
this.raw_ = newValue.raw_
}
toJSON() {
return this.raw_
? new BigNumberJS(this.raw_.value).toNumber()
: this.numeric_
}
valueOf() {
return this.raw_
? new BigNumberJS(this.raw_.value).toNumber()
: this.numeric_
}
}