Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

test: Ensure return types of functions. #767

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ module.exports = {
rules: {
'functional/no-conditional-statement': ['off'],
'functional/functional-parameters': ['off'],
'@typescript-eslint/explicit-function-return-type': ['off'],
'@typescript-eslint/explicit-function-return-type': ['warn'],
'valid-jsdoc': [
'error',
{
Expand Down
4 changes: 3 additions & 1 deletion packages/calculator-bigint/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"module": "dist/esm/index.js",
"source": "src/index.ts",
"types": "dist/esm/index.d.ts",
"files": ["dist/"],
"files": [
"dist/"
],
"scripts": {
"build:clean": "rimraf ./{dist,temp}",
"build:esm": "babel src --root-mode upward --extensions '.ts' --out-dir dist/esm --ignore '**/*/__tests__/'",
Expand Down
2 changes: 1 addition & 1 deletion packages/calculator-bigint/src/api/zero.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
*
* @returns Zero as a bigint.
*/
export function zero() {
export function zero(): bigint {
return 0n;
}
4 changes: 3 additions & 1 deletion packages/calculator-number/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,9 @@
"module": "dist/esm/index.js",
"source": "src/index.ts",
"types": "dist/esm/index.d.ts",
"files": ["dist/"],
"files": [
"dist/"
],
"scripts": {
"build:clean": "rimraf ./{dist,temp}",
"build:esm": "babel src --root-mode upward --extensions '.ts' --out-dir dist/esm --ignore '**/*/__tests__/'",
Expand Down
2 changes: 1 addition & 1 deletion packages/calculator-number/src/api/zero.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
*
* @returns Zero as a number.
*/
export function zero() {
export function zero(): number {
return 0;
}
11 changes: 9 additions & 2 deletions packages/core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,12 @@
"name": "@dinero.js/core",
"version": "2.0.0-alpha.14",
"description": "Common code between Dinero.js packages",
"keywords": ["money", "monetary", "amount", "immutable"],
"keywords": [
"money",
"monetary",
"amount",
"immutable"
],
"homepage": "https://v2.dinerojs.com",
"bugs": "https://github.com/dinerojs/dinero.js/issues",
"repository": {
Expand All @@ -22,7 +27,9 @@
"module": "dist/esm/index.js",
"source": "src/index.ts",
"types": "dist/esm/index.d.ts",
"files": ["dist/"],
"files": [
"dist/"
],
"scripts": {
"build:clean": "rimraf ./{dist,temp}",
"build:esm": "babel src --root-mode upward --extensions '.ts' --out-dir dist/esm --ignore '**/*/__tests__/'",
Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/api/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,9 @@ export type AddParams<TAmount> = readonly [
];

function unsafeAdd<TAmount>(calculator: Calculator<TAmount>) {
return function add(...[augend, addend]: AddParams<TAmount>) {
return function add(
...[augend, addend]: AddParams<TAmount>
): Dinero<TAmount> {
const { amount: augendAmount, currency, scale } = augend.toJSON();
const { amount: addendAmount } = addend.toJSON();

Expand All @@ -26,7 +28,9 @@ function unsafeAdd<TAmount>(calculator: Calculator<TAmount>) {
};
}

export function safeAdd<TAmount>(calculator: Calculator<TAmount>) {
export function safeAdd<TAmount>(
calculator: Calculator<TAmount>
): (augend: Dinero<TAmount>, addend: Dinero<TAmount>) => Dinero<TAmount> {
const normalizeFn = normalizeScale(calculator);
const addFn = unsafeAdd(calculator);

Expand Down
15 changes: 10 additions & 5 deletions packages/core/src/api/allocate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ type UnsafeAllocateParams<TAmount> = readonly [
function unsafeAllocate<TAmount>(calculator: Calculator<TAmount>) {
return function allocate(
...[dineroObject, ratios]: UnsafeAllocateParams<TAmount>
) {
): ReadonlyArray<Dinero<TAmount>> {
const { amount, currency, scale } = dineroObject.toJSON();
const distributeFn = distribute(calculator);
const shares = distributeFn(
Expand All @@ -44,7 +44,12 @@ export type AllocateParams<TAmount> = readonly [
ratios: ReadonlyArray<ScaledAmount<TAmount> | TAmount>
];

export function safeAllocate<TAmount>(calculator: Calculator<TAmount>) {
export function safeAllocate<TAmount>(
calculator: Calculator<TAmount>
): (
dineroObject: Dinero<TAmount>,
ratios: ReadonlyArray<ScaledAmount<TAmount> | TAmount>
) => ReadonlyArray<Dinero<TAmount>> {
const allocateFn = unsafeAllocate(calculator);
const greaterThanOrEqualFn = greaterThanOrEqual(calculator);
const greaterThanFn = greaterThan(calculator);
Expand All @@ -58,12 +63,12 @@ export function safeAllocate<TAmount>(calculator: Calculator<TAmount>) {
const hasRatios = ratios.length > 0;
const scaledRatios = ratios.map((ratio) => getAmountAndScale(ratio, zero));
const highestRatioScale = hasRatios
? maximumFn(scaledRatios.map(({ scale }) => scale))
? maximumFn(scaledRatios.map(({ scale }) => scale ?? zero))
: zero;
const normalizedRatios = scaledRatios.map(({ amount, scale }) => {
const factor = equalFn(scale, highestRatioScale)
const factor = equalFn(scale ?? zero, highestRatioScale)
? zero
: calculator.subtract(highestRatioScale, scale);
: calculator.subtract(highestRatioScale, scale ?? zero);

return {
amount: calculator.multiply(amount, calculator.power(ten, factor)),
Expand Down
20 changes: 15 additions & 5 deletions packages/core/src/api/compare.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable functional/no-expression-statement */
import { UNEQUAL_CURRENCIES_MESSAGE } from '../checks';
import { assert } from '../helpers';
import type { Calculator, Dinero } from '../types';
import type { Calculator, ComparisonOperator, Dinero } from '../types';
import { compare as cmp } from '../utils';

import { haveSameCurrency } from './haveSameCurrency';
Expand All @@ -12,12 +12,17 @@ export type CompareParams<TAmount> = readonly [
comparator: Dinero<TAmount>
];

function unsafeCompare<TAmount>(calculator: Calculator<TAmount>) {
function unsafeCompare<TAmount>(
calculator: Calculator<TAmount>
): (
dineroObject: Dinero<TAmount>,
comparator: Dinero<TAmount>
) => ComparisonOperator {
const compareFn = cmp(calculator);

return function compare(
...[dineroObject, comparator]: CompareParams<TAmount>
) {
): ComparisonOperator {
const dineroObjects = [dineroObject, comparator];

const [subjectAmount, comparatorAmount] = dineroObjects.map((d) => {
Expand All @@ -30,13 +35,18 @@ function unsafeCompare<TAmount>(calculator: Calculator<TAmount>) {
};
}

export function safeCompare<TAmount>(calculator: Calculator<TAmount>) {
export function safeCompare<TAmount>(
calculator: Calculator<TAmount>
): (
dineroObject: Dinero<TAmount>,
comparator: Dinero<TAmount>
) => ComparisonOperator {
const normalizeFn = normalizeScale(calculator);
const compareFn = unsafeCompare(calculator);

return function compare(
...[dineroObject, comparator]: CompareParams<TAmount>
) {
): ComparisonOperator {
const condition = haveSameCurrency([dineroObject, comparator]);
assert(condition, UNEQUAL_CURRENCIES_MESSAGE);

Expand Down
12 changes: 9 additions & 3 deletions packages/core/src/api/convert.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,28 @@ export type ConvertParams<TAmount> = readonly [
rates: Rates<TAmount>
];

export function convert<TAmount>(calculator: Calculator<TAmount>) {
export function convert<TAmount>(
calculator: Calculator<TAmount>
): (
dineroObject: Dinero<TAmount>,
newCurrency: Currency<TAmount>,
rates: Rates<TAmount>
) => Dinero<TAmount> {
const convertScaleFn = transformScale(calculator);
const maximumFn = maximum(calculator);
const zero = calculator.zero();

return function convertFn(
...[dineroObject, newCurrency, rates]: ConvertParams<TAmount>
) {
): Dinero<TAmount> {
const rate = rates[newCurrency.code];
const { amount, scale } = dineroObject.toJSON();
const { amount: rateAmount, scale: rateScale } = getAmountAndScale(
rate,
zero
);

const newScale = calculator.add(scale, rateScale);
const newScale = calculator.add(scale, rateScale ?? zero);

return convertScaleFn(
dineroObject.create({
Expand Down
4 changes: 3 additions & 1 deletion packages/core/src/api/equal.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@ export type EqualParams<TAmount> = readonly [
];

export function equal<TAmount>(calculator: Calculator<TAmount>) {
return function _equal(...[dineroObject, comparator]: EqualParams<TAmount>) {
return function _equal(
...[dineroObject, comparator]: EqualParams<TAmount>
): boolean {
return (
haveSameAmount(calculator)([dineroObject, comparator]) &&
haveSameCurrency([dineroObject, comparator])
Expand Down
12 changes: 8 additions & 4 deletions packages/core/src/api/greaterThan.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ export type GreaterThanParams<TAmount> = readonly [
comparator: Dinero<TAmount>
];

function unsafeGreaterThan<TAmount>(calculator: Calculator<TAmount>) {
function unsafeGreaterThan<TAmount>(
calculator: Calculator<TAmount>
): (dineroObject: Dinero<TAmount>, comparator: Dinero<TAmount>) => boolean {
const greaterThanFn = gt(calculator);

return function greaterThan(
...[dineroObject, comparator]: GreaterThanParams<TAmount>
) {
): boolean {
const dineroObjects = [dineroObject, comparator];

const [subjectAmount, comparatorAmount] = dineroObjects.map((d) => {
Expand All @@ -30,13 +32,15 @@ function unsafeGreaterThan<TAmount>(calculator: Calculator<TAmount>) {
};
}

export function safeGreaterThan<TAmount>(calculator: Calculator<TAmount>) {
export function safeGreaterThan<TAmount>(
calculator: Calculator<TAmount>
): (dineroObject: Dinero<TAmount>, comparator: Dinero<TAmount>) => boolean {
const normalizeFn = normalizeScale(calculator);
const greaterThanFn = unsafeGreaterThan(calculator);

return function greaterThan(
...[dineroObject, comparator]: GreaterThanParams<TAmount>
) {
): boolean {
const condition = haveSameCurrency([dineroObject, comparator]);
assert(condition, UNEQUAL_CURRENCIES_MESSAGE);

Expand Down
10 changes: 6 additions & 4 deletions packages/core/src/api/greaterThanOrEqual.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,14 @@ export type GreaterThanOrEqualParams<TAmount> = readonly [
comparator: Dinero<TAmount>
];

function unsafeGreaterThanOrEqual<TAmount>(calculator: Calculator<TAmount>) {
function unsafeGreaterThanOrEqual<TAmount>(
calculator: Calculator<TAmount>
): (dineroObject: Dinero<TAmount>, comparator: Dinero<TAmount>) => boolean {
const greaterThanOrEqualFn = gte(calculator);

return function greaterThanOrEqual(
...[dineroObject, comparator]: GreaterThanOrEqualParams<TAmount>
) {
): boolean {
const dineroObjects = [dineroObject, comparator];

const [subjectAmount, comparatorAmount] = dineroObjects.map((d) => {
Expand All @@ -32,13 +34,13 @@ function unsafeGreaterThanOrEqual<TAmount>(calculator: Calculator<TAmount>) {

export function safeGreaterThanOrEqual<TAmount>(
calculator: Calculator<TAmount>
) {
): (dineroObject: Dinero<TAmount>, comparator: Dinero<TAmount>) => boolean {
const normalizeFn = normalizeScale(calculator);
const greaterThanOrEqualFn = unsafeGreaterThanOrEqual(calculator);

return function greaterThanOrEqual(
...[dineroObject, comparator]: GreaterThanOrEqualParams<TAmount>
) {
): boolean {
const condition = haveSameCurrency([dineroObject, comparator]);
assert(condition, UNEQUAL_CURRENCIES_MESSAGE);

Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/api/hasSubUnits.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,15 @@ export type HasSubUnitsParams<TAmount> = readonly [
dineroObject: Dinero<TAmount>
];

export function hasSubUnits<TAmount>(calculator: Calculator<TAmount>) {
export function hasSubUnits<TAmount>(
calculator: Calculator<TAmount>
): (dineroObject: Dinero<TAmount>) => boolean {
const equalFn = equal(calculator);
const computeBaseFn = computeBase(calculator);

return function _hasSubUnits(...[dineroObject]: HasSubUnitsParams<TAmount>) {
return function _hasSubUnits(
...[dineroObject]: HasSubUnitsParams<TAmount>
): boolean {
const { amount, currency, scale } = dineroObject.toJSON();
const base = computeBaseFn(currency.base);

Expand Down
4 changes: 3 additions & 1 deletion packages/core/src/api/haveSameAmount.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ export type HaveSameAmountParams<TAmount> = readonly [
dineroObjects: ReadonlyArray<Dinero<TAmount>>
];

export function haveSameAmount<TAmount>(calculator: Calculator<TAmount>) {
export function haveSameAmount<TAmount>(
calculator: Calculator<TAmount>
): (dineroObjects: ReadonlyArray<Dinero<TAmount>>) => boolean {
const normalizeFn = normalizeScale(calculator);
const equalFn = equal(calculator);

Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/api/haveSameCurrency.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { computeBase, equal } from '../utils';

export function haveSameCurrency<TAmount>(
dineroObjects: ReadonlyArray<Dinero<TAmount>>
) {
): boolean {
const [firstDinero, ...otherDineros] = dineroObjects;
const computeBaseFn = computeBase(firstDinero.calculator);

Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/api/isNegative.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ export type IsNegativeParams<TAmount> = readonly [
dineroObject: Dinero<TAmount>
];

export function isNegative<TAmount>(calculator: Calculator<TAmount>) {
export function isNegative<TAmount>(
calculator: Calculator<TAmount>
): (dineroObject: Dinero<TAmount>) => boolean {
const lessThanFn = lessThan(calculator);

return function _isNegative(...[dineroObject]: IsNegativeParams<TAmount>) {
return function _isNegative(
...[dineroObject]: IsNegativeParams<TAmount>
): boolean {
const { amount } = dineroObject.toJSON();

return lessThanFn(amount, calculator.zero());
Expand Down
8 changes: 6 additions & 2 deletions packages/core/src/api/isPositive.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ export type IsPositiveParams<TAmount> = readonly [
dineroObject: Dinero<TAmount>
];

export function isPositive<TAmount>(calculator: Calculator<TAmount>) {
export function isPositive<TAmount>(
calculator: Calculator<TAmount>
): (dineroObject: Dinero<TAmount>) => boolean {
const greaterThanFn = greaterThan(calculator);

return function _isPositive(...[dineroObject]: IsPositiveParams<TAmount>) {
return function _isPositive(
...[dineroObject]: IsPositiveParams<TAmount>
): boolean {
const { amount } = dineroObject.toJSON();

return greaterThanFn(amount, calculator.zero());
Expand Down
6 changes: 4 additions & 2 deletions packages/core/src/api/isZero.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,12 @@ import { equal } from '../utils';

export type IsZeroParams<TAmount> = readonly [dineroObject: Dinero<TAmount>];

export function isZero<TAmount>(calculator: Calculator<TAmount>) {
export function isZero<TAmount>(
calculator: Calculator<TAmount>
): (dineroObject: Dinero<TAmount>) => boolean {
const equalFn = equal(calculator);

return function _isZero(...[dineroObject]: IsZeroParams<TAmount>) {
return function _isZero(...[dineroObject]: IsZeroParams<TAmount>): boolean {
const { amount } = dineroObject.toJSON();

return equalFn(amount, calculator.zero());
Expand Down
Loading