// Copyright 2024 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only // Only for tests. Use this to generate multiple test cases for a config matrix. // // Example: // // generateConfigMatrix({ // contacts: [20, 30], // hasNotification: [false, true], // }); // // Outputs: // // [ // { contacts: 20, hasNotification: false }, // { contacts: 30, hasNotification: false }, // { contacts: 20, hasNotification: true }, // { contacts: 30, hasNotification: true }, // ] export function generateConfigMatrix(combinations: { [K in keyof Config]: ReadonlyArray; }): ReadonlyArray { let result = [{} as Record]; const entries = [...Object.entries(combinations)] as Array< [string, ReadonlyArray] >; if ( entries.length === 0 || entries.every(([, values]) => values.length === 0) ) { return []; } for (const [key, values] of entries) { result = values // Make a copy of each existing result for each value // eslint-disable-next-line no-loop-func .map(value => result.map(config => ({ ...config, [key]: value, })) ) .flat(); } return result as ReadonlyArray; }