All files / src/web/webview bpmnTypeGuards.ts

100% Statements 54/54
87.5% Branches 63/72
100% Functions 36/36
100% Lines 52/52

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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186                            164x       3x       131x       2x       30x       11x       2x       2x       2x       2x       2x       23x 1x   22x         22x 23x 23x 23x 23x 23x 23x       8x       6x       5x       4x       5x       2x       2x       2x       16x 16x             10x 10x           2x       2x       2x       8x       4x       3x 2x 2x       3x       5x           7x       9x       6x       5x       6x         4x 4x 4x 2x    
export interface BpmnBusinessObject {
	id: string;
	$type: string;
	name?: string;
	[key: string]: unknown;
}
 
export interface BpmnElement {
	id: string;
	type: string;
	businessObject: BpmnBusinessObject;
}
 
export function getBusinessObject(element: BpmnElement): BpmnBusinessObject {
	return element.businessObject || (element as unknown as BpmnBusinessObject);
}
 
export function getElementId(element: BpmnElement): string {
	return getBusinessObject(element).id || element.id;
}
 
export function getElementType(element: BpmnElement): string {
	return getBusinessObject(element).$type || element.type;
}
 
export function isUserTask(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:UserTask';
}
 
export function isServiceTask(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:ServiceTask';
}
 
export function isStartEvent(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:StartEvent';
}
 
export function isProcess(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:Process';
}
 
export function isSequenceFlow(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:SequenceFlow';
}
 
export function isScriptTask(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:ScriptTask';
}
 
export function isBusinessRuleTask(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:BusinessRuleTask';
}
 
export function isCallActivity(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:CallActivity';
}
 
function getServiceTaskImplementationType(element: BpmnElement): string | undefined {
	if (!isServiceTask(element)) {
		return undefined;
	}
	const bo = getBusinessObject(element) as BpmnBusinessObject & {
		type?: string;
		$attrs?: Record<string, unknown>;
		get?: (name: string) => unknown;
	};
	const attrsType = typeof bo.$attrs?.['activiti:type'] === 'string' ? bo.$attrs['activiti:type'] : undefined;
	const attrsUnprefixedType = typeof bo.$attrs?.type === 'string' ? bo.$attrs.type : undefined;
	const directActivitiType = typeof (bo as Record<string, unknown>)['activiti:type'] === 'string' ? (bo as Record<string, unknown>)['activiti:type'] as string : undefined;
	const directType = typeof bo.type === 'string' ? bo.type : undefined;
	const getterType = typeof bo.get === 'function' && typeof bo.get('activiti:type') === 'string' ? bo.get('activiti:type') as string : undefined;
	const getterUnprefixedType = typeof bo.get === 'function' && typeof bo.get('type') === 'string' ? bo.get('type') as string : undefined;
	return directActivitiType || directType || attrsType || attrsUnprefixedType || getterType || getterUnprefixedType;
}
 
export function isMailTask(element: BpmnElement): boolean {
	return getServiceTaskImplementationType(element) === 'mail';
}
 
export function isHttpTask(element: BpmnElement): boolean {
	return getServiceTaskImplementationType(element) === 'http';
}
 
export function isShellTask(element: BpmnElement): boolean {
	return getServiceTaskImplementationType(element) === 'shell';
}
 
export function isExternalWorkerTask(element: BpmnElement): boolean {
	return getServiceTaskImplementationType(element) === 'external-worker';
}
 
export function isGenericServiceTask(element: BpmnElement): boolean {
	return isServiceTask(element) && !isMailTask(element) && !isHttpTask(element) && !isShellTask(element) && !isExternalWorkerTask(element);
}
 
export function isSendTask(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:SendTask';
}
 
export function isReceiveTask(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:ReceiveTask';
}
 
export function isManualTask(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:ManualTask';
}
 
export function isActivity(element: BpmnElement): boolean {
	const type = getElementType(element);
	return type === 'bpmn:UserTask' || type === 'bpmn:ServiceTask' || type === 'bpmn:ScriptTask'
		|| type === 'bpmn:BusinessRuleTask' || type === 'bpmn:CallActivity'
		|| type === 'bpmn:SendTask' || type === 'bpmn:ReceiveTask' || type === 'bpmn:ManualTask'
		|| type === 'bpmn:SubProcess' || type === 'bpmn:Transaction';
}
 
export function isGateway(element: BpmnElement): boolean {
	const type = getElementType(element);
	return type === 'bpmn:ExclusiveGateway' || type === 'bpmn:InclusiveGateway'
		|| type === 'bpmn:ParallelGateway' || type === 'bpmn:EventBasedGateway'
		|| type === 'bpmn:ComplexGateway';
}
 
export function isTextAnnotation(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:TextAnnotation';
}
 
export function isParticipant(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:Participant';
}
 
export function isLane(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:Lane';
}
 
export function isSubProcess(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:SubProcess';
}
 
export function isTransaction(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:Transaction';
}
 
export function isEventSubProcess(element: BpmnElement): boolean {
	if (!isSubProcess(element)) { return false; }
	const bo = getBusinessObject(element);
	return bo.triggeredByEvent === true;
}
 
export function isSubProcessType(element: BpmnElement): boolean {
	return isSubProcess(element) || isTransaction(element);
}
 
export function isFlowNode(element: BpmnElement): boolean {
	return isActivity(element) || isGateway(element) || isStartEvent(element)
		|| isEndEvent(element) || isBoundaryEvent(element)
		|| isIntermediateCatchEvent(element) || isIntermediateThrowEvent(element);
}
 
export function isBoundaryEvent(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:BoundaryEvent';
}
 
export function isEndEvent(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:EndEvent';
}
 
export function isIntermediateCatchEvent(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:IntermediateCatchEvent';
}
 
export function isIntermediateThrowEvent(element: BpmnElement): boolean {
	return getElementType(element) === 'bpmn:IntermediateThrowEvent';
}
 
export function isEventElement(element: BpmnElement): boolean {
	return isStartEvent(element) || isEndEvent(element) || isBoundaryEvent(element)
		|| isIntermediateCatchEvent(element) || isIntermediateThrowEvent(element);
}
 
export function getEventDefinitionType(element: BpmnElement): string | null {
	const bo = getBusinessObject(element);
	const eventDefs = bo.eventDefinitions as Array<{ $type: string }> | undefined;
	if (!eventDefs || eventDefs.length === 0) { return null; }
	return eventDefs[0].$type || null;
}