All files / src/web/webview counterSync.ts

96.96% Statements 32/33
100% Branches 2/2
94.11% Functions 16/17
96.15% Lines 25/26

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62                              9x   9x 10x 13x 13x 3x     10x       9x       1x   1x 1x     1x 1x 1x 1x       1x 1x     1x 1x 1x         1x 1x 1x 1x 1x  
import type { FlowableDocumentState } from '../flowable/types';
 
export interface ActionCounters {
	field: number;
	listener: number;
	formProperty: number;
	ioParameter: number;
	dataObject: number;
	signalDefinition: number;
	messageDefinition: number;
	eventListener: number;
	localization: number;
}
 
function getMaxSuffix(ids: string[], prefixes: string[]): number {
	let maxSuffix = 0;
 
	for (const id of ids) {
		for (const prefix of prefixes) {
			const match = id.match(new RegExp(`^${prefix}(\\d+)$`));
			if (!match) {
				continue;
			}
 
			maxSuffix = Math.max(maxSuffix, Number(match[1]));
		}
	}
 
	return maxSuffix;
}
 
export function syncActionCountersFromState(state: FlowableDocumentState, counters: ActionCounters): void {
	const allElementStates = Object.values(state.elements);
 
	counters.field = getMaxSuffix(
		allElementStates.flatMap((elementState) => elementState.fieldExtensions.map((fieldExtension) => fieldExtension.id)),
		['field-'],
	);
	counters.listener = getMaxSuffix(
		allElementStates.flatMap((elementState) => [
			...elementState.taskListeners.map((listener) => listener.id),
			...elementState.executionListeners.map((listener) => listener.id),
		]),
		['task-listener-', 'execution-listener-'],
	);
	counters.formProperty = getMaxSuffix(
		allElementStates.flatMap((elementState) => elementState.formProperties.map((formProperty) => formProperty.id)),
		['form-property-'],
	);
	counters.ioParameter = getMaxSuffix(
		allElementStates.flatMap((elementState) => [
			...elementState.inputParameters.map((parameter) => parameter.id),
			...elementState.outputParameters.map((parameter) => parameter.id),
		]),
		['io-param-'],
	);
	counters.dataObject = getMaxSuffix(state.dataObjects.map((dataObject) => dataObject.id), ['data-object-', 'dataObj-']);
	counters.signalDefinition = getMaxSuffix(state.signalDefinitions.map((signalDefinition) => signalDefinition.id), ['signal-']);
	counters.messageDefinition = getMaxSuffix(state.messageDefinitions.map((messageDefinition) => messageDefinition.id), ['message-']);
	counters.eventListener = getMaxSuffix(state.eventListeners.map((listener) => listener.id), ['event-listener-']);
	counters.localization = getMaxSuffix(state.localizations.map((localization) => localization.id), ['localization-']);
}