import type { ToolcraftControlSectionModuleContribution, ToolcraftPanelActionModuleContribution, ToolcraftProductModuleContribution, } from "../contract/contribution"; import type { ToolcraftProductModuleDefinition } from "../contract/module-definition"; export function permutations( values: readonly T[], ): readonly (readonly T[])[] { if (values.length <= 1) { return [[...values]]; } return values.flatMap((value, index) => permutations([...values.slice(0, index), ...values.slice(index + 1)]).map( (tail) => [value, ...tail], ), ); } export function getSettingsContribution( definition: ToolcraftProductModuleDefinition, id: "image-export.settings", ): Extract< ToolcraftControlSectionModuleContribution, Readonly<{ id: "image-export.settings" }> >; export function getSettingsContribution( definition: ToolcraftProductModuleDefinition, id: "video-export.settings", ): Extract< ToolcraftControlSectionModuleContribution, Readonly<{ id: "video-export.settings" }> >; export function getSettingsContribution( definition: ToolcraftProductModuleDefinition, id: ToolcraftControlSectionModuleContribution["id"], ): ToolcraftControlSectionModuleContribution { const contribution = definition.contributions.find( (candidate) => candidate.kind === "control-section" && candidate.id === id, ); if (contribution?.kind !== "control-section") { throw new Error(`Missing test contribution ${id}.`); } return contribution; } export function getActionContribution( definition: ToolcraftProductModuleDefinition, id: ToolcraftPanelActionModuleContribution["id"], ): ToolcraftPanelActionModuleContribution { const contribution = definition.contributions.find( (candidate) => candidate.kind === "panel-action" && candidate.id === id, ); if (contribution?.kind !== "panel-action") { throw new Error(`Missing test contribution ${id}.`); } return contribution; } export function getTestModuleContributions( definitions: readonly ToolcraftProductModuleDefinition[], ): readonly ToolcraftProductModuleContribution[] { return definitions.flatMap((definition) => definition.contributions); }