From 773a1cfb74e44cab34d422a0cf35f792cca59d77 Mon Sep 17 00:00:00 2001 From: Dave Cohen Date: Wed, 21 Apr 2021 12:05:50 -0500 Subject: [PATCH] assertType handles multipleValues rather than caller --- source/index.ts | 18 ++++++++++++------ test/test.ts | 14 ++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/source/index.ts b/source/index.ts index 6e75b7e..d63dcdc 100644 --- a/source/index.ts +++ b/source/index.ts @@ -388,10 +388,17 @@ is.any = (predicate: Predicate | Predicate[], ...values: unknown[]): boolean => is.all = (predicate: Predicate, ...values: unknown[]): boolean => predicateOnArray(Array.prototype.every, predicate, values); -const assertType = (condition: boolean, description: string, value: unknown, options: { getValuesMessage?: () => string } = {}): asserts condition => { +const assertType = (condition: boolean, description: string, value: unknown, options: { multipleValues?: boolean } = {}): asserts condition => { if (!condition) { - const {getValuesMessage} = options; - const valuesMessage = getValuesMessage ? getValuesMessage() : `received value of type \`${is(value)}\``; + const {multipleValues} = options; + const valuesMessage = multipleValues ? + `received values of types ${[ + ...new Set( + (value as any[]).map(singleValue => `\`${is(singleValue)}\``) + ) + ].join(', ')}` : + `received value of type \`${is(value)}\``; + throw new TypeError(`Expected value which is \`${description}\`, ${valuesMessage}.`); } }; @@ -624,10 +631,9 @@ export const assert: Assert = { // Variadic functions. any: (predicate: Predicate | Predicate[], ...values: unknown[]): void | never => { // Remove duplicate value types using Set. - const getValuesMessage = () => `received values of types ${[...new Set(values.map(value => `\`${is(value)}\``))].join(', ')}`; - return assertType(is.any(predicate, ...values), AssertionTypeDescription.any, values, {getValuesMessage}); + return assertType(is.any(predicate, ...values), AssertionTypeDescription.any, values, {multipleValues: true}); }, - all: (predicate: Predicate, ...values: unknown[]): void | never => assertType(is.all(predicate, ...values), AssertionTypeDescription.all, values) + all: (predicate: Predicate, ...values: unknown[]): void | never => assertType(is.all(predicate, ...values), AssertionTypeDescription.all, values, {multipleValues: true}) }; // Some few keywords are reserved, but we'll populate them for Node.js users diff --git a/test/test.ts b/test/test.ts index 84ae578..30c1a86 100644 --- a/test/test.ts +++ b/test/test.ts @@ -1591,6 +1591,20 @@ test('is.all', t => { t.throws(() => { assert.all(is.string); }); + + t.throws(() => { + assert.all(is.string, 1, 2, 3); + }, { + // Removes duplicates: + message: /received values of types `number`./ + }); + + t.throws(() => { + assert.all(is.string, 1, [4]); + }, { + // Lists all types: + message: /received values of types `number`, `Array`./ + }); }); test('assert', t => {