Use Intl.ListFormat

This commit is contained in:
Bjorn Stromberg 2023-08-09 09:24:01 +08:00
parent fdb697e34c
commit cae2664bca
2 changed files with 10 additions and 19 deletions

View file

@ -799,28 +799,13 @@ function unique<T>(values: T[]): T[] {
return Array.from(new Set(values)); return Array.from(new Set(values));
} }
function joinWithWord(values: string[], word: 'and' | 'or'): string { const andFormatter = new Intl.ListFormat('en', {style: 'long', type: 'conjunction'});
switch (values.length) { const orFormatter = new Intl.ListFormat('en', {style: 'long', type: 'disjunction'});
case 0:
case 1: {
return values.join('');
}
case 2: {
return values.join(` ${word} `);
}
default: {
// TODO: Replace with .at after node v14 support is dropped
return `${[...values].slice(0, -1).join(', ')}, ${word} ${values[values.length - 1] ?? ''}`;
}
}
}
function typeErrorMessageMultipleValues(expectedType: AssertionTypeDescription | AssertionTypeDescription[], values: unknown[]): string { function typeErrorMessageMultipleValues(expectedType: AssertionTypeDescription | AssertionTypeDescription[], values: unknown[]): string {
const uniqueExpectedTypes = unique((isArray(expectedType) ? expectedType : [expectedType]).map(value => `\`${value}\``)); const uniqueExpectedTypes = unique((isArray(expectedType) ? expectedType : [expectedType]).map(value => `\`${value}\``));
const uniqueValueTypes = unique(values.map(value => `\`${is(value)}\``)); const uniqueValueTypes = unique(values.map(value => `\`${is(value)}\``));
return `Expected values which are ${joinWithWord(uniqueExpectedTypes, 'or')}. Received values of type${uniqueValueTypes.length > 1 ? 's' : ''} ${joinWithWord(uniqueValueTypes, 'and')}.`; return `Expected values which are ${orFormatter.format(uniqueExpectedTypes)}. Received values of type${uniqueValueTypes.length > 1 ? 's' : ''} ${andFormatter.format(uniqueValueTypes)}.`;
} }
// Type assertions have to be declared with an explicit type. // Type assertions have to be declared with an explicit type.

View file

@ -1,7 +1,13 @@
{ {
"extends": "@sindresorhus/tsconfig", "extends": "@sindresorhus/tsconfig",
"compilerOptions": { "compilerOptions": {
"outDir": "dist" "lib": [
"DOM",
"DOM.Iterable",
"ES2021"
],
"outDir": "dist",
"target": "ES2021"
}, },
"include": [ "include": [
"source" "source"