diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..b364ad1e --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,27 @@ +--- +name: Bug report +about: Describe an occurring bug +title: '' +labels: '' +assignees: '' + +--- + +**Current Behavior:** + + +**Expected Behavior:** + + +**Steps to Reproduce:** + + + 1. + 1. + 1. + +**Other Information:** + + +**System Information:** + diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..657f5cc8 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,30 @@ +--- +name: Feature request +about: Describe the feature +title: '' +labels: '' +assignees: '' + +--- + +**Problem Statement:** + + +**Sketch (Optional):** + + +**References (Optional):** + + +**Expected Behavior:** + + +**Tasks:** + + +- [ ] Task 1 +- [ ] Task 2 +- [ ] Task 3 + +**Other Information:** + diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 00000000..a64d8338 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,11 @@ +#### Short Description + + +#### Proposed Changes + + + * + * + * + +**Fixes**: # \ No newline at end of file diff --git a/components/bpmn-q/.bpmnlintrc b/components/bpmn-q/.bpmnlintrc new file mode 100644 index 00000000..e153bd98 --- /dev/null +++ b/components/bpmn-q/.bpmnlintrc @@ -0,0 +1,12 @@ +{ + "extends": [ + "plugin:camunda/recommended", + "plugin:custom/recommended" + ], + "rules": { + "custom/quantme-tasks": "warn", + "custom/subprocess-connected-end-event": "warn", + "custom/subprocess-required-start-event": "warn", + "camunda/no-collapsed-sub-processes": "off" + } +} \ No newline at end of file diff --git a/components/bpmn-q/.gitignore b/components/bpmn-q/.gitignore index a19b1ae8..010d43cb 100644 --- a/components/bpmn-q/.gitignore +++ b/components/bpmn-q/.gitignore @@ -1,3 +1,5 @@ node_modules/* public/* -!public/index.html \ No newline at end of file +!public/index.html +!public/src +bpmnlint-plugin-custom/node_modules/* diff --git a/components/bpmn-q/bpmnlint-plugin-custom/index.js b/components/bpmn-q/bpmnlint-plugin-custom/index.js new file mode 100644 index 00000000..450b234d --- /dev/null +++ b/components/bpmn-q/bpmnlint-plugin-custom/index.js @@ -0,0 +1,15 @@ +module.exports = { + configs: { + recommended: { + rules: { + } + }, + all: { + rules: { + 'quantme-tasks': 'warn', + 'subprocess-required-start-event': 'warn', + 'subprocess-connected-end-event': 'warn' + } + } + } +} \ No newline at end of file diff --git a/components/bpmn-q/bpmnlint-plugin-custom/package.json b/components/bpmn-q/bpmnlint-plugin-custom/package.json new file mode 100644 index 00000000..8142026d --- /dev/null +++ b/components/bpmn-q/bpmnlint-plugin-custom/package.json @@ -0,0 +1,26 @@ +{ + "name": "bpmnlint-plugin-custom", + "version": "0.0.0", + "description": "The bpmnlint custom plug-in", + "main": "index.js", + "scripts": { + "all": "npm test", + "test": "mocha test.js" + }, + "keywords": [ + "bpmnlint", + "plugin" + ], + "devDependencies": { + "bpmnlint": "^7.2.1", + "chai": "^4.2.0", + "mocha": "^9.1.3" + }, + "dependencies": { + "bpmnlint-utils": "^1.0.2" + }, + "files": [ + "rules", + "index.js" + ] +} diff --git a/components/bpmn-q/bpmnlint-plugin-custom/rules/quantme-tasks.js b/components/bpmn-q/bpmnlint-plugin-custom/rules/quantme-tasks.js new file mode 100644 index 00000000..b986503d --- /dev/null +++ b/components/bpmn-q/bpmnlint-plugin-custom/rules/quantme-tasks.js @@ -0,0 +1,20 @@ +let QuantMEAttributeChecker = require('../../modeler-component/extensions/quantme/replacement/QuantMEAttributeChecker'); + +/** + * Rule that reports QuantME tasks for which no suited replacement model exists + */ +module.exports = function() { + + function check(node, reporter) { + if (node.$type && node.$type.startsWith('quantme:')) { + if (!QuantMEAttributeChecker.requiredAttributesAvailable(node)) { + reporter.report(node.id, 'Not all required attributes are set. Unable to replace task!'); + return; + } + } + } + + return { + check: check + }; +}; \ No newline at end of file diff --git a/components/bpmn-q/bpmnlint-plugin-custom/rules/subprocess-connected-end-event.js b/components/bpmn-q/bpmnlint-plugin-custom/rules/subprocess-connected-end-event.js new file mode 100644 index 00000000..d7f2740e --- /dev/null +++ b/components/bpmn-q/bpmnlint-plugin-custom/rules/subprocess-connected-end-event.js @@ -0,0 +1,46 @@ +const { + is, + isAny +} = require('bpmnlint-utils'); + + +/** + * A rule that checks the presence of an end event per scope. + */ +module.exports = function () { + + function hasEndEvent(node) { + const flowElements = node.flowElements || []; + + return ( + flowElements.some(node => is(node, 'bpmn:EndEvent')) + ); + } + + function hasConnectedEndEvent(node) { + const flowElements = node.flowElements || []; + + return ( + flowElements.some(node => { const incomingflow = node.incoming || []; return is(node, 'bpmn:EndEvent') && incomingflow.length === 0; }) + ); + + } + + function check(node, reporter) { + console.log(node) + if (!isAny(node, ['bpmn:SubProcess'])) { + return; + } + + if (!hasEndEvent(node)) { + + reporter.report(node.id, 'Subprocess is missing end event'); + } + + if (hasConnectedEndEvent(node)) { + reporter.report(node.id, 'Each end event must have at least one incoming flow'); + } + } + + return { check }; +}; \ No newline at end of file diff --git a/components/bpmn-q/bpmnlint-plugin-custom/rules/subprocess-required-start-event.js b/components/bpmn-q/bpmnlint-plugin-custom/rules/subprocess-required-start-event.js new file mode 100644 index 00000000..bbb06d17 --- /dev/null +++ b/components/bpmn-q/bpmnlint-plugin-custom/rules/subprocess-required-start-event.js @@ -0,0 +1,38 @@ +const { + is +} = require('bpmnlint-utils'); + + +/** + * A rule that checks that start events inside a normal sub-processes + * are blank (do not have an event definition). + */ +module.exports = function () { + + function check(node, reporter) { + + if (!is(node, 'bpmn:SubProcess') || node.triggeredByEvent) { + return; + } + + const flowElements = node.flowElements || []; + + flowElements.forEach(function (flowElement) { + + if (!is(flowElement, 'bpmn:StartEvent')) { + return false; + } + + const eventDefinitions = flowElement.eventDefinitions || []; + + if (eventDefinitions.length > 0) { + reporter.report(flowElement.id, 'Start event must be blank', ['eventDefinitions']); + } + }); + } + + return { + check + }; + +}; \ No newline at end of file diff --git a/components/bpmn-q/client/index.js b/components/bpmn-q/client/index.js new file mode 100644 index 00000000..01847a26 --- /dev/null +++ b/components/bpmn-q/client/index.js @@ -0,0 +1,22 @@ +/** + * Copyright (c) 2021 Institute of Architecture of Application Systems - + * University of Stuttgart + * + * This program and the accompanying materials are made available under the + * terms the Apache Software License 2.0 + * which is available at https://www.apache.org/licenses/LICENSE-2.0. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +import { registerBpmnJSPlugin } from 'camunda-modeler-plugin-helpers'; + +import customLinterConfig from '../.bpmnlintrc'; + +registerBpmnJSPlugin({ + __init__: [ + function(linting) { + linting.setLinterConfig(customLinterConfig); + } + ] +}); diff --git a/components/bpmn-q/modeler-component/QuantumWorkflowModeler.js b/components/bpmn-q/modeler-component/QuantumWorkflowModeler.js index 53d6d4be..ce9da905 100644 --- a/components/bpmn-q/modeler-component/QuantumWorkflowModeler.js +++ b/components/bpmn-q/modeler-component/QuantumWorkflowModeler.js @@ -6,17 +6,20 @@ import './editor/resources/styling/editor-ui.css'; import './editor/ui/notifications/Notifications.css'; import './editor/ui/notifications/Notification.css'; import './editor/resources/styling/camunda-styles/style.css'; +import 'bpmn-js-bpmnlint/dist/assets/css/bpmn-js-bpmnlint.css'; +import './modeler.css'; import React from 'react'; -import {createRoot} from 'react-dom/client'; +import { createRoot } from 'react-dom/client'; import ButtonToolbar from "./editor/ui/ButtonToolbar"; -import {createNewDiagram, loadDiagram} from "./editor/util/IoUtilities"; +import { createNewDiagram, loadDiagram } from "./editor/util/IoUtilities"; import NotificationHandler from "./editor/ui/notifications/NotificationHandler"; -import {createModeler, getModeler} from "./editor/ModelerHandler"; -import {getPluginButtons, getStyles, getTransformationButtons} from "./editor/plugin/PluginHandler"; -import {getPluginConfig, setPluginConfig} from "./editor/plugin/PluginConfigHandler"; +import { createModeler, getModeler } from "./editor/ModelerHandler"; +import { getPluginButtons, getTransformationButtons } from "./editor/plugin/PluginHandler"; +import { getPluginConfig, setPluginConfig } from "./editor/plugin/PluginConfigHandler"; import * as editorConfig from './editor/config/EditorConfigManager'; -import {initEditorEventHandler} from './editor/events/EditorEventHandler'; +import { initEditorEventHandler } from './editor/events/EditorEventHandler'; +import $ from 'jquery'; /** * The Quantum Workflow modeler HTML web component which contains the bpmn-js modeler to model BPMN diagrams, an editor @@ -63,7 +66,7 @@ export class QuantumWorkflowModeler extends HTMLElement { event.preventDefault(); return event.returnValue = ''; }; - addEventListener("beforeunload", beforeUnloadListener, {capture: true}); + addEventListener("beforeunload", beforeUnloadListener, { capture: true }); } @@ -75,12 +78,164 @@ export class QuantumWorkflowModeler extends HTMLElement {

-
+
-
+
`; + + let panel = document.getElementById("properties"); + let maindiv = document.getElementById("main-div"); + + let isResizing = false; + let startX; + let startWidth; + let width = panel.style.width; + let propertiesElement = document.getElementById("properties"); + + propertiesElement.addEventListener("mousemove", function (e) { + let rect = this.getBoundingClientRect(); + let x = e.clientX - rect.left; + let y = e.clientY - rect.top; + + let borderSize = 5; + + if ( + x < borderSize || + x > rect.width - borderSize || + y < borderSize || + y > rect.height - borderSize + ) { + this.style.cursor = "w-resize"; + } else { + this.style.cursor = "default"; + + } + }); + + + // Mouse down event listener + panel.addEventListener('mousedown', handleMouseDown); + + panel.addEventListener("mouseup", function () { + this.style.cursor = "default"; + }); + + // Mouse move event listener + document.addEventListener('mousemove', handleMouseMove); + + // Mouse up event listener + document.addEventListener('mouseup', handleMouseUp); + + // Mouse down handler + function handleMouseDown(event) { + let rect = panel.getBoundingClientRect(); + let x = event.clientX - rect.left; + + let borderSize = 5; + + if ( + x < borderSize || + x > rect.width - borderSize + ) { + + isResizing = true; + } + startX = event.clientX; + startWidth = parseFloat(panel.style.width); + } + let isCollapsed = false; + const resizeButton = document.createElement('button'); + resizeButton.className = "fa fa-angle-right resize"; + maindiv.appendChild(resizeButton); + + // Mouse move handler + function handleMouseMove(event) { + if (!isResizing) { maindiv.style.cursor = "default"; return; } + maindiv.style.cursor = "w-resize"; + panel.style.cursor = "w-resize"; + const deltaX = event.clientX - startX; + let newWidth = startWidth - deltaX; + + // enable to completely hide the panel + if (newWidth < 20) { + newWidth = 0; + isCollapsed = true; + resizeButton.className = "fa fa-angle-left resize"; + } + panel.style.width = `${newWidth}px`; + } + + // Mouse up handler + function handleMouseUp() { + panel.style.cursor = "default"; + isResizing = false; + } + + + resizeButton.addEventListener('click', function () { + let offsetWidth = panel.offsetWidth; + if (isCollapsed) { + panel.style.display = 'block'; + panel.style.width = offsetWidth; + if (panel.offsetWidth < parseInt(width, 10)) { + panel.style.width = width; + } + resizeButton.className = "fa fa-angle-right resize"; + } else { + panel.style.display = 'none'; + resizeButton.className = "fa fa-angle-left resize"; + } + + isCollapsed = !isCollapsed; + }); + + let editor = document.getElementById('editor'); + let dragging = false; + let aceEditor = ace.edit(editor); + + + $("#editor_dragbar").mousedown(function (e) { + e.preventDefault(); + dragging = true; + + let editorElement = $("#editor"); + let editor_wrap = $("#editor_wrap"); + let dragbar = $("#editor_dragbar"); + let startY = e.pageY; + let startTop = parseInt(editorElement.css("top")); + let startHeight = editor_wrap.height(); + + $(document).mousemove(function (e) { + if (!dragging) return; + + let actualY = e.pageY; + let deltaY = startY - actualY; + let newTop = startTop - deltaY; + let newHeight = startHeight + deltaY; + const viewportHeight = window.innerHeight; + const heightInVh = (newHeight / viewportHeight) * 100; + + // since we move the editor element up we need to add the actual height of the + // wrapper element + const editorHeight = 2 * newHeight; + if (newHeight >= 75 && heightInVh <= 89) { + editorElement.css("top", newTop + "px"); + editor_wrap.css("height", newHeight + "px"); + editorElement.css("height", editorHeight + "px"); + dragbar.css("top", newTop - dragbar.height() + "px"); + aceEditor.resize(); + } + }); + }); + + $(document).mouseup(function (e) { + if (dragging) { + dragging = false; + $(document).unbind("mousemove"); + } + }); } /** @@ -118,10 +273,15 @@ export class QuantumWorkflowModeler extends HTMLElement { // integrate the React ButtonToolbar into its DOM container const root = createRoot(document.getElementById('button-container')); root.render(); + transformButtons={transformationButtons} />); // load initial workflow this.workflowModel = this.workflowModel || getPluginConfig('editor').defaultWorkflow; + getModeler().on('commandStack.changed', function () { + getModeler().saveXML({ format: true }).then(function (result) { + modeler.xml = result; + }) + }); if (this.workflowModel) { loadDiagram(this.workflowModel, getModeler()).then(); } else { @@ -179,4 +339,4 @@ export class QuantumWorkflowModeler extends HTMLElement { } } -window.customElements.define('quantum-workflow-modeler', QuantumWorkflowModeler); \ No newline at end of file +window.customElements.define('quantum-workflow-modeler', QuantumWorkflowModeler); diff --git a/components/bpmn-q/modeler-component/editor/EditorConstants.js b/components/bpmn-q/modeler-component/editor/EditorConstants.js index 85155ba1..3ede37e5 100644 --- a/components/bpmn-q/modeler-component/editor/EditorConstants.js +++ b/components/bpmn-q/modeler-component/editor/EditorConstants.js @@ -2,7 +2,7 @@ // supported options to handle a transformed workflow export const transformedWorkflowHandlers = { NEW_TAB: 'Open in new Tab', - SAVE_AS_FILE: 'Save as File', + SAVE_AS_FILE: 'Save as File' }; // workflow event types dispatched by the EditorEventHandler @@ -10,5 +10,13 @@ export const workflowEventTypes = { LOADED: 'quantum-workflow-loaded', // New Workflow loaded in modeler SAVED: 'quantum-workflow-saved', // Workflow saved TRANSFORMED: 'quantum-workflow-transformed', // Workflow transformed - DEPLOYED: 'quantum-workflow-deployed', // Workflow deployed to workflow engine + DEPLOYED: 'quantum-workflow-deployed' // Workflow deployed to workflow engine +}; + +// supported save file options +export const saveFileFormats = { + ALL: 'all', + BPMN: '.bpmn', + PNG: '.png', + SVG: '.svg' }; \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/ModelerHandler.js b/components/bpmn-q/modeler-component/editor/ModelerHandler.js index 35702179..ebcb98fc 100644 --- a/components/bpmn-q/modeler-component/editor/ModelerHandler.js +++ b/components/bpmn-q/modeler-component/editor/ModelerHandler.js @@ -7,8 +7,12 @@ import { } from "bpmn-js-properties-panel"; import CamundaExtensionModule from 'camunda-bpmn-moddle/resources/camunda.json'; import CustomPopupMenuModule from "./popup/"; -import {getAdditionalModules, getModdleExtension} from "./plugin/PluginHandler"; +import { getAdditionalModules, getModdleExtension } from "./plugin/PluginHandler"; +import ModelerRulesModule from "./rules/"; +import LintModule from 'bpmn-js-bpmnlint'; +import bpmnlintConfig from '../../.bpmnlintrc'; +import Clipboard from 'diagram-js/lib/features/clipboard/Clipboard'; let camundaModdleDescriptor = require('camunda-bpmn-moddle/resources/camunda.json'); /** @@ -35,7 +39,10 @@ export function createModeler(containerId, propertiesParentId) { }, additionalModules: getModules(), keyboard: { - bindTo: document + bindTo: document + }, + linting: { + bpmnlint: bpmnlintConfig }, moddleExtensions: getExtensions(), }); @@ -122,6 +129,9 @@ export function getModeler() { */ function getModules() { const pluginModules = getAdditionalModules(); + var clipboardModule = { + 'clipboard': [ 'value', new Clipboard() ] + }; let additionalModules = [ BpmnPalletteModule, BpmnPropertiesPanelModule, @@ -129,6 +139,9 @@ function getModules() { CamundaPlatformPropertiesProviderModule, CamundaExtensionModule, CustomPopupMenuModule, + LintModule, + clipboardModule, + ModelerRulesModule ].concat(pluginModules); console.log('\n Additional modules of the modeler: '); diff --git a/components/bpmn-q/modeler-component/editor/config/EditorConfigManager.js b/components/bpmn-q/modeler-component/editor/config/EditorConfigManager.js index c7cd1b1f..1339fedd 100644 --- a/components/bpmn-q/modeler-component/editor/config/EditorConfigManager.js +++ b/components/bpmn-q/modeler-component/editor/config/EditorConfigManager.js @@ -1,11 +1,12 @@ -import {getPluginConfig} from '../plugin/PluginConfigHandler'; -import {transformedWorkflowHandlers} from '../EditorConstants'; +import { getPluginConfig } from '../plugin/PluginConfigHandler'; +import { saveFileFormats, transformedWorkflowHandlers } from '../EditorConstants'; // default configurations of the editor const defaultConfig = { camundaEndpoint: process.env.CAMUNDA_ENDPOINT, - fileName: 'quantum-workflow-model.bpmn', + fileName: process.env.DOWNLOAD_FILE_NAME, transformedWorkflowHandler: transformedWorkflowHandlers.NEW_TAB, + fileFormat: saveFileFormats.BPMN }; let config = {}; @@ -53,7 +54,7 @@ export function getFileName() { * @param fileName the new file name */ export function setFileName(fileName) { - if (fileName !== null && fileName !== undefined && /^[a-zA-Z0-9-_]+\.bpmn$/.test(fileName)) { + if (fileName !== null && fileName !== undefined) { // remove trailing slashes config.fileName = fileName; @@ -88,6 +89,33 @@ export function setTransformedWorkflowHandler(transformedWorkflowHandler) { } } +/** + * Get the file format + * + * @return {string} the currently specified handler id + */ +export function getFileFormat() { + if (config.fileFormat === undefined) { + const fileFormat = saveFileFormats[getPluginConfig('editor').fileFormat]; + setFileFormat(fileFormat || defaultConfig.fileFormat); + } + return config.fileFormat; +} + +/** + * Set the format of the downloaded file + * + * @param fileFormat the file format + */ +export function setFileFormat(fileFormat) { + if (fileFormat !== null && fileFormat !== undefined + // check that the new value is a valid handler id + && Object.values(saveFileFormats).includes(fileFormat)) { + + config.fileFormat = fileFormat; + } +} + /** * Resets the current editor configs */ diff --git a/components/bpmn-q/modeler-component/editor/config/EditorTab.js b/components/bpmn-q/modeler-component/editor/config/EditorTab.js index fe8c9d42..38ed8bc6 100644 --- a/components/bpmn-q/modeler-component/editor/config/EditorTab.js +++ b/components/bpmn-q/modeler-component/editor/config/EditorTab.js @@ -1,7 +1,7 @@ -import React, {useState} from 'react'; -import {getModeler} from "../ModelerHandler"; +import React, { useState } from 'react'; +import { getModeler } from "../ModelerHandler"; import * as editorConfig from "./EditorConfigManager"; -import {transformedWorkflowHandlers} from '../EditorConstants'; +import { transformedWorkflowHandlers, saveFileFormats } from '../EditorConstants'; /** * Tab for the ConfigModal. Used to allow the configurations of the editor configs, namely the camunda endpoint and the @@ -14,6 +14,8 @@ export default function EditorTab() { const [camundaEndpoint, setCamundaEndpoint] = useState(editorConfig.getCamundaEndpoint()); const [workflowHandler, setWorkflowHandler] = useState(editorConfig.getTransformedWorkflowHandler()); + const [fileName, setFileName] = useState(editorConfig.getFileName()); + const [fileFormat, setFileFormat] = useState(editorConfig.getFileFormat()); const modeler = getModeler(); @@ -28,11 +30,23 @@ export default function EditorTab() { }); } + // register listener for editor action to get changes on the camunda endpoint + if (!editorActions._actions.hasOwnProperty('fileNameChanged')) { + editorActions.register({ + fileNameChanged: function (fileName) { + modeler.config.fileName = fileName; + } + }); + } + // save values of the tab entries in the editor config EditorTab.prototype.onClose = () => { modeler.config.camundaEndpoint = camundaEndpoint; + modeler.config.fileName = fileName; editorConfig.setCamundaEndpoint(camundaEndpoint); editorConfig.setTransformedWorkflowHandler(workflowHandler); + editorConfig.setFileName(fileName); + editorConfig.setFileFormat(fileFormat); }; // return tab which contains entries to change the camunda endpoint and the workflow handler @@ -40,37 +54,68 @@ export default function EditorTab() {

Workflow Engine configuration:

- - - - + + + +
Camunda Engine Endpoint - setCamundaEndpoint(event.target.value)}/> -
Camunda Engine Endpoint + setCamundaEndpoint(event.target.value)} /> +

Handle for transformed workflows:

- - - + + + + +
Transformed Workflow Handler - +
Transformed Workflow Handler + + +
+

Download workflow:

+ + + + + + + + + - + +
Download file name + setFileName(event.target.value)} /> +
Download file format + -
); @@ -80,4 +125,5 @@ EditorTab.prototype.config = () => { const modeler = getModeler(); modeler.config.camundaEndpoint = editorConfig.getCamundaEndpoint(); + modeler.config.fileName = editorConfig.getFileName(); }; \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/resources/icons/upload-icon.png b/components/bpmn-q/modeler-component/editor/resources/icons/upload-icon.png new file mode 100644 index 00000000..91305169 Binary files /dev/null and b/components/bpmn-q/modeler-component/editor/resources/icons/upload-icon.png differ diff --git a/components/bpmn-q/modeler-component/editor/resources/icons/xml-viewer-icon.png b/components/bpmn-q/modeler-component/editor/resources/icons/xml-viewer-icon.png new file mode 100644 index 00000000..95f342f3 Binary files /dev/null and b/components/bpmn-q/modeler-component/editor/resources/icons/xml-viewer-icon.png differ diff --git a/components/bpmn-q/modeler-component/editor/resources/styling/editor-ui.css b/components/bpmn-q/modeler-component/editor/resources/styling/editor-ui.css index 205a93c4..6ac30c6e 100644 --- a/components/bpmn-q/modeler-component/editor/resources/styling/editor-ui.css +++ b/components/bpmn-q/modeler-component/editor/resources/styling/editor-ui.css @@ -193,4 +193,39 @@ .qwm-tmp { background: url("../icons/save-outline-icon.png") no-repeat center center; -} \ No newline at end of file +} + +#editor { + position: absolute; + width: 100%; + height: 100%; +} + +.ace_print-margin { + display: none; +} + +.qwm-icon-upload:before { + content: ""; + width: 15px; + height: 18px; + margin-top: 0px; + background-size: contain; + background-image: url("../icons/upload-icon.png"); + background-repeat: no-repeat; + display: inline-block; + float: left; +} + +.qwm-icon-xml-viewer:before { + content: ""; + width: 20px; + height: 18px; + margin-top: 0px; + background-size: contain; + background-image: url("../icons/xml-viewer-icon.png"); + background-repeat: no-repeat; + display: inline-block; + float: left; +} + diff --git a/components/bpmn-q/modeler-component/editor/resources/styling/modeler.css b/components/bpmn-q/modeler-component/editor/resources/styling/modeler.css index 68f18c5e..92f15955 100644 --- a/components/bpmn-q/modeler-component/editor/resources/styling/modeler.css +++ b/components/bpmn-q/modeler-component/editor/resources/styling/modeler.css @@ -1,11 +1,11 @@ .qwm-content, -.qwm-content > div { +.qwm-content>div { width: 100%; height: 100%; overflow: hidden; } -.qwm-content > .qwm-message { +.qwm-content>.qwm-message { text-align: center; display: table; @@ -13,7 +13,7 @@ color: #111; } -.qwm-content > .qwm-message .qwm-note { +.qwm-content>.qwm-message .qwm-note { vertical-align: middle; text-align: center; display: table-cell; @@ -58,11 +58,12 @@ list-style: none; } -.qwm-buttons > li { +.qwm-buttons>li { display: inline-block; margin-right: 10px; } -.qwm-buttons > li > a { + +.qwm-buttons>li>a { background: #DDD; border: solid 1px #666; display: inline-block; @@ -77,6 +78,73 @@ opacity: 1.0; } +.bjs-breadcrumbs { + position: absolute; + display: none; + flex-wrap: wrap; + align-items: center; + top: 20px; + left: 20px; + padding: 0px; + margin: 0px; + font-size: 20px; + line-height: normal; +} + +.bjs-breadcrumbs-shown .bjs-breadcrumbs { + display: flex; +} + +.djs-palette-shown .bjs-breadcrumbs { + left: 90px; +} + +.djs-palette-shown.djs-palette-two-column .bjs-breadcrumbs { + left: 140px; +} + +.bjs-breadcrumbs li { + display: inline-flex; + padding-bottom: 5px; + font-size: 17px; + font-family: Arial, serif; + font-weight: bold; +} + +.bjs-breadcrumbs li a { + cursor: pointer; + color: blue +} + +.bjs-breadcrumbs li:last-of-type a { + color: inherit; + cursor: default; +} + +.bjs-breadcrumbs li:not(:first-child)::before { + content: url('data:image/svg+xml;utf8,'); + padding: 0 8px; + color: var(--breadcrumbs-arrow-color); + height: 1em; +} + +.bjs-breadcrumbs .bjs-crumb { + display: inline-block; + max-width: 200px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.bjs-drilldown-empty { + display: none; +} + +.selected .bjs-drilldown-empty { + display: inherit; +} + .bjs-drilldown { - display: none + position: relative; + top: 10px; } \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/rules/ModelerRules.js b/components/bpmn-q/modeler-component/editor/rules/ModelerRules.js new file mode 100644 index 00000000..7be4e38b --- /dev/null +++ b/components/bpmn-q/modeler-component/editor/rules/ModelerRules.js @@ -0,0 +1,21 @@ +import BpmnRules from 'bpmn-js/lib/features/rules/BpmnRules'; +import { getModeler } from '../ModelerHandler'; +import { saveModelerAsLocalFile } from '../util/IoUtilities'; + +/** + * Contains the rules for the modeler. + */ +export default class ModelerRules extends BpmnRules { + + constructor(eventBus) { + super(eventBus); + eventBus.on('saveFile', function(context) { + saveModelerAsLocalFile(getModeler()); + }); + } +} + +ModelerRules.$inject = [ + 'eventBus', +]; + diff --git a/components/bpmn-q/modeler-component/editor/rules/index.js b/components/bpmn-q/modeler-component/editor/rules/index.js new file mode 100644 index 00000000..2fc8f2d1 --- /dev/null +++ b/components/bpmn-q/modeler-component/editor/rules/index.js @@ -0,0 +1,6 @@ +import ModelerRules from './ModelerRules'; + +export default { + __init__: ['modelerRules'], + modelerRules: ["type", ModelerRules] +}; \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/shortcut/ShortcutModal.js b/components/bpmn-q/modeler-component/editor/shortcut/ShortcutModal.js index 028423ae..a23bde56 100644 --- a/components/bpmn-q/modeler-component/editor/shortcut/ShortcutModal.js +++ b/components/bpmn-q/modeler-component/editor/shortcut/ShortcutModal.js @@ -43,6 +43,10 @@ export default function ShortcutModal({ onClose }) { Search ctrl + F + + Download + ctrl + S + Redo ctrl + Y @@ -73,7 +77,7 @@ export default function ShortcutModal({ onClose }) { Replace Tool - R + R Space Tool diff --git a/components/bpmn-q/modeler-component/editor/ui/ButtonToolbar.js b/components/bpmn-q/modeler-component/editor/ui/ButtonToolbar.js index d0a2ba5e..2e2ac26b 100644 --- a/components/bpmn-q/modeler-component/editor/ui/ButtonToolbar.js +++ b/components/bpmn-q/modeler-component/editor/ui/ButtonToolbar.js @@ -5,8 +5,9 @@ import NewDiagramButton from "./NewDiagramButton"; import DeploymentButton from "./DeploymentButton"; import ConfigPlugin from "../config/ConfigPlugin"; import TransformationToolbarButton from "./TransformationToolbarButton"; +import UploadButton from "./UploadButton"; import ShortcutPlugin from "../shortcut/ShortcutPlugin"; - +import XMLViewerButton from "./XMLViewerButton"; /** * React component which displays the toolbar of the modeler @@ -32,6 +33,8 @@ export default function ButtonToolbar(props) { + +

diff --git a/components/bpmn-q/modeler-component/editor/ui/SaveButton.js b/components/bpmn-q/modeler-component/editor/ui/SaveButton.js index 0f9195c1..a3450209 100644 --- a/components/bpmn-q/modeler-component/editor/ui/SaveButton.js +++ b/components/bpmn-q/modeler-component/editor/ui/SaveButton.js @@ -1,5 +1,5 @@ import React from "react"; -import {saveModelerAsLocalFile} from "../util/IoUtilities"; +import { saveModelerAsLocalFile } from "../util/IoUtilities"; /** * React button which saves the current workflow to the users local file system when clicked @@ -10,14 +10,19 @@ import {saveModelerAsLocalFile} from "../util/IoUtilities"; */ export default function SaveButton(props) { - const {modeler} = props; + const { modeler } = props; return ( - - ); +
+ +
+ ) } \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/ui/UploadButton.js b/components/bpmn-q/modeler-component/editor/ui/UploadButton.js new file mode 100644 index 00000000..fd1b8a45 --- /dev/null +++ b/components/bpmn-q/modeler-component/editor/ui/UploadButton.js @@ -0,0 +1,21 @@ +import React from "react"; +import { uploadToGitHub } from '../../extensions/quantme/qrm-manager/git-handler'; +import { getModeler } from "../ModelerHandler"; + +/** + * React button which uploads the current workflow to GitHub. + * + * @returns {JSX.Element} + * @constructor + */ +export default function UploadButton() { + + return ( + + ); +} \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/ui/XMLViewerButton.js b/components/bpmn-q/modeler-component/editor/ui/XMLViewerButton.js new file mode 100644 index 00000000..aa59adfd --- /dev/null +++ b/components/bpmn-q/modeler-component/editor/ui/XMLViewerButton.js @@ -0,0 +1,63 @@ +import React, { useState } from "react"; +import { getModeler } from "../ModelerHandler"; +import ace from "ace-builds"; +import { loadDiagram } from "../util/IoUtilities"; + +/** + * React button which enables the XML Viewer. + * + * @returns {JSX.Element} + * @constructor + */ +export default function XMLViewerButton() { + + const [enabledXMLView, setEnabledXMLView] = useState(false); + function enableXMLViewer(enabledXMLView) { + let modelerContainer = document.getElementById('modeler-container'); + let editor = document.getElementById('editor'); + let editorWrap = document.getElementById('editor_wrap'); + let panel = document.getElementById("properties"); + let aceEditor = ace.edit(editor); + if (!enabledXMLView) { + modelerContainer.style.height = '93vh'; + editor.style.display = 'block'; + editor.style.height = '93vh'; + panel.style.display = 'none'; + editorWrap.style.display = 'block'; + + // Dynamically set the value of the editor + let xml = getModeler().xml; + if (xml.xml != undefined) { + xml = xml.xml; + } + aceEditor.setValue(xml); + } else { + modelerContainer.style.height = '98vh'; + editor.style.display = 'none'; + panel.style.display = 'block'; + editorWrap.style.display = 'none'; + + + aceEditor.getSession().on('change', function () { + update(); + }); + + function update() { + let xml = aceEditor.getSession().getValue(); + loadDiagram(xml, getModeler()); + } + } + + setEnabledXMLView(!enabledXMLView) + + } + + return ( + + ); +} \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/util/IoUtilities.js b/components/bpmn-q/modeler-component/editor/util/IoUtilities.js index 3a5a26f5..db34386b 100644 --- a/components/bpmn-q/modeler-component/editor/util/IoUtilities.js +++ b/components/bpmn-q/modeler-component/editor/util/IoUtilities.js @@ -1,5 +1,6 @@ -import {transformedWorkflowHandlers, workflowEventTypes} from '../EditorConstants'; -import {dispatchWorkflowEvent} from '../events/EditorEventHandler'; +import { file } from 'jszip'; +import { transformedWorkflowHandlers, workflowEventTypes, saveFileFormats } from '../EditorConstants'; +import { dispatchWorkflowEvent } from '../events/EditorEventHandler'; const editorConfig = require('../config/EditorConfigManager'); @@ -29,10 +30,10 @@ const NEW_DIAGRAM_XML = '\n' + * @returns {Promise} */ export async function saveXmlAsLocalFile(xml, fileName = editorConfig.getFileName()) { - const bpmnFile = await new File([xml], fileName, {type: 'text/xml'}); + const bpmnFile = await new File([xml], fileName, { type: 'text/xml' }); const link = document.createElement('a'); - link.download = fileName; + link.download = fileName + '.bpmn'; link.href = URL.createObjectURL(bpmnFile); link.click(); @@ -46,9 +47,18 @@ export async function saveXmlAsLocalFile(xml, fileName = editorConfig.getFileNam * @param fileName The name of the file. * @returns {Promise} */ -export async function saveModelerAsLocalFile(modeler, fileName = editorConfig.getFileName()) { +export async function saveModelerAsLocalFile(modeler, fileName = editorConfig.getFileName(), fileFormat = editorConfig.getFileFormat()) { const xml = await getXml(modeler); - return saveXmlAsLocalFile(xml, fileName); + + if (fileFormat === saveFileFormats.BPMN || fileFormat === saveFileFormats.ALL) { + await openFileDialog(xml, fileName, saveFileFormats.BPMN); + } + + if (fileFormat === saveFileFormats.ALL || fileFormat === saveFileFormats.SVG || fileFormat === saveFileFormats.PNG) { + await saveWorkflowAsSVG(modeler, fileName, fileFormat); + } + + return; } /** @@ -58,7 +68,7 @@ export async function saveModelerAsLocalFile(modeler, fileName = editorConfig.ge * @returns {Promise<*>} The xml diagram. */ export async function getXml(modeler) { - const {xml} = await modeler.saveXML({format: true}); + const { xml } = await modeler.saveXML({ format: true }); return xml; } @@ -71,19 +81,21 @@ export async function getXml(modeler) { * @returns {Promise} Undefined, if an error occurred during import. */ export async function loadDiagram(xml, modeler, dispatchEvent = true) { + if (xml !== '') { + try { + const result = await modeler.importXML(xml); + modeler.xml = xml; - try { - const result = await modeler.importXML(xml); - - if (dispatchEvent) { - dispatchWorkflowEvent(workflowEventTypes.LOADED, xml, editorConfig.getFileName()); - } + if (dispatchEvent) { + dispatchWorkflowEvent(workflowEventTypes.LOADED, xml, editorConfig.getFileName()); + } - return result; - } catch (err) { - console.error(err); + return result; + } catch (err) { + console.error(err); - return {error: err}; + return { error: err }; + } } } @@ -120,7 +132,7 @@ export async function deployWorkflowToCamunda(workflowName, workflowXml, viewMap } // add diagram to the body - const bpmnFile = new File([workflowXml], fileName, {type: 'text/xml'}); + const bpmnFile = new File([workflowXml], fileName, { type: 'text/xml' }); form.append('data', bpmnFile); // upload all provided views @@ -151,7 +163,7 @@ export async function deployWorkflowToCamunda(workflowName, workflowXml, viewMap // abort if there is not exactly one deployed process definition if (Object.values(result['deployedProcessDefinitions'] || {}).length !== 1) { console.error('Invalid size of deployed process definitions list: ' + Object.values(result['deployedProcessDefinitions'] || {}).length); - return {status: 'failed'}; + return { status: 'failed' }; } dispatchWorkflowEvent(workflowEventTypes.DEPLOYED, workflowXml, workflowName); @@ -162,11 +174,11 @@ export async function deployWorkflowToCamunda(workflowName, workflowXml, viewMap }; } else { console.error('Deployment of workflow returned invalid status code: %s', response.status); - return {status: 'failed'}; + return { status: 'failed' }; } } catch (error) { console.error('Error while executing post to deploy workflow: ' + error); - return {status: 'failed'}; + return { status: 'failed' }; } } @@ -215,6 +227,89 @@ export function openInNewTab(workflowXml, fileName) { newWindow.onload = function () { // Pass the XML string to the new window using postMessage - newWindow.postMessage({workflow: workflowXml, name: fileName}, window.location.href); + newWindow.postMessage({ workflow: workflowXml, name: fileName }, window.location.href); }; +} + +export async function saveWorkflowAsSVG(modeler, fileName, fileFormat) { + modeler.saveSVG({ format: true }, function (error, svg) { + if (error) { + return; + } + + if (fileFormat === saveFileFormats.ALL || fileFormat === saveFileFormats.SVG) { + openFileDialog(svg, fileName, saveFileFormats.SVG) + } + if (fileFormat === saveFileFormats.ALL || fileFormat === saveFileFormats.PNG) { + convertSvgToPng(svg, fileName, saveFileFormats.PNG); + } + }); +} + +// Function to convert SVG to PNG using an external library +function convertSvgToPng(svg, fileName, fileFormat) { + var img = new Image(); + img.onload = function () { + var canvas = document.createElement('canvas'); + canvas.width = img.width; + canvas.height = img.height; + var ctx = canvas.getContext('2d'); + ctx.drawImage(img, 0, 0, img.width, img.height); + var pngDataUrl = canvas.toDataURL('image/png'); + downloadPng(pngDataUrl, fileName, fileFormat); + }; + img.src = 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(svg))); +} + +// Function to initiate the PNG download +function downloadPng(pngDataUrl, fileName, fileFormat) { + openFileUrlDialog(pngDataUrl, fileName, fileFormat); +} + +async function openFileDialog(content, fileName, fileFormat) { + let suggestedName = fileName; + if (suggestedName.includes('.bpmn')) { + suggestedName = fileName.split('.bpmn')[0]; + } + let fileHandle = await window.showSaveFilePicker({ + startIn: 'downloads', suggestedName: suggestedName + fileFormat, types: [ + { + description: "BPMN file", + accept: { "text/plain": [".bpmn"] }, + }, + { + description: "SVG file", + accept: { "text/plain": [".svg"] }, + } + ] + }); + writeFile(fileHandle, content); +} + +async function openFileUrlDialog(content, fileName, fileFormat) { + let suggestedName = fileName; + if (suggestedName.includes('.bpmn')) { + suggestedName = fileName.split('.bpmn')[0]; + } + let fileHandle = await window.showSaveFilePicker({ + startIn: 'downloads', suggestedName: suggestedName + fileFormat, types: [ + { + description: "PNG file", + accept: { "text/plain": [".png"] }, + } + ] + }); + writeURLToFile(fileHandle, content); +} + +async function writeFile(fileHandle, contents) { + const writable = await fileHandle.createWritable(); + await writable.write(contents); + await writable.close(); +} + +async function writeURLToFile(fileHandle, url) { + const writable = await fileHandle.createWritable(); + const response = await fetch(url); + await response.body.pipeTo(writable); } \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/editor/util/TransformationUtilities.js b/components/bpmn-q/modeler-component/editor/util/TransformationUtilities.js index b8e8173f..f283945c 100644 --- a/components/bpmn-q/modeler-component/editor/util/TransformationUtilities.js +++ b/components/bpmn-q/modeler-component/editor/util/TransformationUtilities.js @@ -48,14 +48,17 @@ export function insertShape(definitions, parent, newElement, idMap, replace, mod idMap[newElement['id']] = element.id; // if the element is a subprocess, check if it is expanded in the replacement fragment and expand the new element - if (newElement.$type === 'bpmn:SubProcess') { + if (['bpmn:SubProcess', 'quantme:QuantumHardwareSelectionSubprocess', 'quantme:CircuitCuttingSubprocess'].includes(newElement.$type)) { // get the shape element related to the subprocess let shape = getDi(element); - if (shape && shape.isExpanded) { + shape.isExpanded = true; + + // TODO: fix the following if, as the access to the DI of the new element is not possible with the current BPMN-JS version + /*if (shape && shape.isExpanded) { // expand the new element elementRegistry.get(element.id).businessObject.di.isExpanded = true; - } + }*/ // preserve messages defined in ReceiveTasks } else if (newElement.$type === 'bpmn:ReceiveTask' && newElement.messageRef) { diff --git a/components/bpmn-q/modeler-component/extensions/data-extension/rules/DataFlowRulesProvider.js b/components/bpmn-q/modeler-component/extensions/data-extension/rules/DataFlowRulesProvider.js index b01d2991..63cb439a 100644 --- a/components/bpmn-q/modeler-component/extensions/data-extension/rules/DataFlowRulesProvider.js +++ b/components/bpmn-q/modeler-component/extensions/data-extension/rules/DataFlowRulesProvider.js @@ -4,7 +4,9 @@ import { isAny } from 'bpmn-js/lib/features/modeling/util/ModelingUtil'; import * as consts from '../Constants'; -import {isConnectedWith} from '../../../editor/util/ModellingUtilities'; +import { isConnectedWith } from '../../../editor/util/ModellingUtilities'; +import { getModeler } from '../../../editor/ModelerHandler'; +import ace from 'ace-builds'; /** * Custom rules provider for the DataFlow elements. Extends the BpmnRules. @@ -18,6 +20,15 @@ export default class CustomRulesProvider extends BpmnRules { const canConnect = this.canConnect.bind(this); const canCreate = this.canCreate.bind(this); + // persist into local storage whenever + // copy took place + eventBus.on('copyPaste.elementsCopied', event => { + const { tree } = event; + + // persist in local storage, encoded as json + localStorage.setItem('bpmnClipboard', JSON.stringify(tree)); + }); + /** * Fired during creation of a new connection (while you selected the target of a connection) */ @@ -56,6 +67,22 @@ export default class CustomRulesProvider extends BpmnRules { context.position ); }); + + // update xml viewer on diagram change + eventBus.on("commandStack.changed", function () { + let editor = document.getElementById('editor'); + let aceEditor = ace.edit(editor); + let modeler = getModeler(); + if (modeler) { + modeler.saveXML({ format: true }).then(function (result) { + if (result.xml != undefined) { + result = result.xml; + } + aceEditor.setValue(result); + }) + } + }); + } /** @@ -78,7 +105,7 @@ export default class CustomRulesProvider extends BpmnRules { // test connection via sequence flow if (this.canConnectSequenceFlow(source, target)) { - return {type: 'bpmn:SequenceFlow'}; + return { type: 'bpmn:SequenceFlow' }; } } @@ -129,20 +156,20 @@ export default class CustomRulesProvider extends BpmnRules { if (isAny(source, [consts.DATA_MAP_OBJECT]) && isAny(target, [consts.DATA_MAP_OBJECT])) { console.log('Create connection between DataMapObjects with ' + consts.OUTPUT_TRANSFORMATION_ASSOCIATION); - return {type: consts.OUTPUT_TRANSFORMATION_ASSOCIATION}; + return { type: consts.OUTPUT_TRANSFORMATION_ASSOCIATION }; } // the normal rules for a DataObject if (isAny(source, [consts.DATA_MAP_OBJECT]) && isAny(target, ['bpmn:Activity', 'bpmn:ThrowEvent'])) { console.log('Map to act'); - return {type: 'bpmn:DataInputAssociation'}; + return { type: 'bpmn:DataInputAssociation' }; } if (isAny(target, [consts.DATA_MAP_OBJECT]) && isAny(source, ['bpmn:ThrowEvent'])) { console.log('Map to act'); return false; } if (isAny(target, [consts.DATA_MAP_OBJECT]) && isAny(source, ['bpmn:Activity', 'bpmn:CatchEvent'])) { - return {type: 'bpmn:DataOutputAssociation'}; + return { type: 'bpmn:DataOutputAssociation' }; } if (isAny(source, [consts.DATA_MAP_OBJECT]) && isAny(target, ['bpmn:CatchEvent'])) { return false; diff --git a/components/bpmn-q/modeler-component/extensions/data-extension/transformation/TransformationManager.js b/components/bpmn-q/modeler-component/extensions/data-extension/transformation/TransformationManager.js index 0390b9ba..9671fcb8 100644 --- a/components/bpmn-q/modeler-component/extensions/data-extension/transformation/TransformationManager.js +++ b/components/bpmn-q/modeler-component/extensions/data-extension/transformation/TransformationManager.js @@ -1,6 +1,6 @@ -import {is} from 'bpmn-js/lib/util/ModelUtil'; -import {getXml, loadDiagram} from '../../../editor/util/IoUtilities'; -import {createLightweightModeler} from '../../../editor/ModelerHandler'; +import { is } from 'bpmn-js/lib/util/ModelUtil'; +import { getXml } from '../../../editor/util/IoUtilities'; +import { createTempModelerFromXml } from '../../../editor/ModelerHandler'; import * as consts from '../Constants'; import { getAllElementsForProcess, @@ -14,6 +14,7 @@ import { addFormField, findSequenceFlowConnection, getDocumentation, getRootProcess, setDocumentation, } from '../../../editor/util/ModellingUtilities'; +import { layout } from '../../quantme/replacement/layouter/Layouter'; /** * Replace data flow extensions with camunda bpmn elements so that it complies with the standard @@ -22,8 +23,7 @@ import { * @returns {Promise<{xml: *, status: string}|{cause: string, status: string}>} */ export async function startDataFlowReplacementProcess(xml) { - let modeler = await createLightweightModeler(); - await loadDiagram(xml, modeler); + let modeler = await createTempModelerFromXml(xml); let elementRegistry = modeler.get('elementRegistry'); let modeling = modeler.get('modeling'); @@ -36,7 +36,7 @@ export async function startDataFlowReplacementProcess(xml) { if (typeof rootProcess === 'undefined') { console.log('Unable to retrieve root process element from definitions!'); - return {status: 'failed', cause: 'Unable to retrieve root process element from definitions!'}; + return { status: 'failed', cause: 'Unable to retrieve root process element from definitions!' }; } // Mark process as executable @@ -133,12 +133,12 @@ export async function startDataFlowReplacementProcess(xml) { for (let c of businessObject.get(consts.CONTENT)) { let formField = - { - 'defaultValue': c.value, - 'id': name + '.' + c.name, - 'label': name + '.' + c.name, - 'type': 'string' - }; + { + 'defaultValue': c.value, + 'id': name + '.' + c.name, + 'label': name + '.' + c.name, + 'type': 'string' + }; addFormField(activity.id, formField, elementRegistry, moddle, modeling); } @@ -195,10 +195,10 @@ export async function startDataFlowReplacementProcess(xml) { } } - // layout(modeling, elementRegistry, rootProcess); + layout(modeling, elementRegistry, rootProcess); const transformedXML = await getXml(modeler); - return {status: 'transformed', xml: transformedXML}; + return { status: 'transformed', xml: transformedXML }; } /** @@ -261,11 +261,11 @@ function transformDataMapObjects(rootProcess, definitions, processContextVariabl const dataDoc = createDataMapObjectDocs(dataMapObjectBo); setDocumentation(result.element, currentDoc.concat(dataDoc), bpmnFactory); } else { - return {success: false, failedData: dataMapObjectBo}; + return { success: false, failedData: dataMapObjectBo }; } } - return {success: true}; + return { success: true }; } /** @@ -292,10 +292,10 @@ function transformDataStoreMaps(rootProcess, definitions, processContextVariable if (!result.success) { // break transformation and propagate failure - return {success: false, failedData: dataElement.element}; + return { success: false, failedData: dataElement.element }; } } - return {success: true}; + return { success: true }; } /** @@ -336,9 +336,9 @@ export function transformDataStoreMap(dataStoreMap, parentElement, definitions, const dataDoc = createDataStoreMapDocs(dataStoreMap); setDocumentation(result.element, currentDoc.concat(dataDoc), bpmnFactory); } else { - return {success: false, failedData: dataStoreMap}; + return { success: false, failedData: dataStoreMap }; } - return {success: true}; + return { success: true }; } @@ -371,13 +371,13 @@ function transformTransformationTask(rootProcess, definitions, processContextVar const result = insertShape(definitions, serviceTask.parent, serviceTask, {}, true, modeler, transformationTask); if (!result.success) { - return {success: false, failedData: transformationTask}; + return { success: false, failedData: transformationTask }; } // add parameters attribute as camunda map to service task inputs addCamundaInputMapParameter(result.element.businessObject, consts.PARAMETERS, transformationTask.get(consts.PARAMETERS), bpmnFactory); } - return {success: true}; + return { success: true }; } /** @@ -419,7 +419,7 @@ export function createProcessContextVariablesTask(processContextVariables, rootP } } - return {success: true}; + return { success: true }; } /** @@ -458,15 +458,15 @@ function getProcessContextVariablesTask(startEventElement, parent, bpmnFactory, const newTaskElement = modeling.createShape({ type: 'bpmn:Task', businessObject: processVariablesTaskBo, - }, {x: startEventElement.x, y: startEventElement.y + Y_OFFSET_TASK}, parent, {}); + }, { x: startEventElement.x, y: startEventElement.y + Y_OFFSET_TASK }, parent, {}); modeling.updateProperties(newTaskElement, processVariablesTaskBo); // move start event to the left to create space for the new task - modeling.moveElements([startEventElement], {x: -120, y: 0}); + modeling.moveElements([startEventElement], { x: -120, y: 0 }); // connect new Task with activities which were connected with the start event - modeling.connect(startEventElement, newTaskElement, {type: 'bpmn:SequenceFlow'}); + modeling.connect(startEventElement, newTaskElement, { type: 'bpmn:SequenceFlow' }); for (let outgoingConnectionBo of outgoingFlowElements) { const outgoingConnectionElement = elementRegistry.get(outgoingConnectionBo.id); const target = outgoingConnectionElement.target; diff --git a/components/bpmn-q/modeler-component/extensions/planqk/PlanQKReplaceMenuProvider.js b/components/bpmn-q/modeler-component/extensions/planqk/PlanQKReplaceMenuProvider.js index ba1a57f8..0b276c90 100644 --- a/components/bpmn-q/modeler-component/extensions/planqk/PlanQKReplaceMenuProvider.js +++ b/components/bpmn-q/modeler-component/extensions/planqk/PlanQKReplaceMenuProvider.js @@ -1,8 +1,8 @@ import * as planqkReplaceOptions from './PlanQKReplaceOptions'; -import {is} from 'bpmn-js/lib/util/ModelUtil'; +import { is } from 'bpmn-js/lib/util/ModelUtil'; import * as consts from './utilities/Constants'; -import {createMenuEntries, createMoreOptionsEntryWithReturn} from "../../editor/util/PopupMenuUtilities"; -import {getPluginConfig} from "../../editor/plugin/PluginConfigHandler"; +import { createMenuEntries, createMoreOptionsEntryWithReturn } from "../../editor/util/PopupMenuUtilities"; +import { getPluginConfig } from "../../editor/plugin/PluginConfigHandler"; import * as planqkConsts from './utilities/Constants'; import { filter } from 'min-dash'; import { isDifferentType } from 'bpmn-js/lib/features/popup-menu/util/TypeUtil'; @@ -37,7 +37,7 @@ export default class PlanQKMenuProvider { getPopupMenuEntries(element) { const self = this; return function (entries) { - + // do not show entries for extension elements of other plugins if (!(element.type.startsWith('bpmn') || element.type.startsWith('planqk'))) { return entries; @@ -45,7 +45,8 @@ export default class PlanQKMenuProvider { // add replacement entries for the active service subscription as replacements for a PlanQK service task if (is(element, consts.PLANQK_SERVICE_TASK)) { - return self.createPlanQKServiceTaskEntries(element, self.activeSubscriptions); + let serviceTaskEntries = self.createTaskEntries(element, self.activeSubscriptions); + return Object.assign(serviceTaskEntries, entries); } // add replacement entries for the available data pools as replacements for a PlanQK data pool @@ -84,9 +85,10 @@ export default class PlanQKMenuProvider { const replaceElement = this.replaceElement; const activeSubscriptions = this.activeSubscriptions; const self = this; - let options = self.createPlanQKServiceTaskEntries(element, activeSubscriptions); - options = Object.assign(createMenuEntries(element, planqkReplaceOptions.TASK, translate, replaceElement), options); + if (element.type !== consts.PLANQK_SERVICE_TASK) { + options = Object.assign(createMenuEntries(element, planqkReplaceOptions.TASK, translate, replaceElement), options); + } return { ['replace-by-more-planqk-task-options']: createMoreOptionsEntryWithReturn( @@ -146,7 +148,7 @@ export default class PlanQKMenuProvider { // replace selected element if it is not already a PlanQK service task let newElement; if (element.type !== planqkConsts.PLANQK_SERVICE_TASK) { - newElement = replaceElement(element, {type: planqkConsts.PLANQK_SERVICE_TASK}); + newElement = replaceElement(element, { type: planqkConsts.PLANQK_SERVICE_TASK }); } let serviceElement = newElement || element; @@ -193,9 +195,9 @@ export default class PlanQKMenuProvider { for (let dataPool of dataPools) { if (element.businessObject.name !== dataPool.name) { dataPoolEntries['replace-with-' + dataPool.id + ' (2)'] = this.createNewDataPoolEntry(element, dataPool); - } + } } - + return dataPoolEntries; } diff --git a/components/bpmn-q/modeler-component/extensions/planqk/exec-completion/PlanQKServiceTaskCompletion.js b/components/bpmn-q/modeler-component/extensions/planqk/exec-completion/PlanQKServiceTaskCompletion.js index bb1651e6..76950303 100644 --- a/components/bpmn-q/modeler-component/extensions/planqk/exec-completion/PlanQKServiceTaskCompletion.js +++ b/components/bpmn-q/modeler-component/extensions/planqk/exec-completion/PlanQKServiceTaskCompletion.js @@ -1,5 +1,5 @@ import * as consts from "../utilities/Constants"; -import {getXml} from "../../../editor/util/IoUtilities"; +import { getXml } from "../../../editor/util/IoUtilities"; import { setInputParameter, getDefinitionsFromXml, @@ -10,13 +10,14 @@ import { getCamundaInputOutput, } from "../../../editor/util/ModellingUtilities"; -import {createTempModelerFromXml} from '../../../editor/ModelerHandler'; -import {insertShape} from "../../../editor/util/TransformationUtilities"; +import { createTempModelerFromXml } from '../../../editor/ModelerHandler'; +import { insertShape } from "../../../editor/util/TransformationUtilities"; import * as dataConsts from '../../data-extension/Constants'; import { createProcessContextVariablesTask, transformDataStoreMap } from '../../data-extension/transformation/TransformationManager'; +import { layout } from '../../quantme/replacement/layouter/Layouter'; /** * Replace custom PlanQK extensions with camunda bpmn elements @@ -27,6 +28,7 @@ import { export async function startPlanqkReplacementProcess(xml) { let modeler = await createTempModelerFromXml(xml); let elementRegistry = modeler.get('elementRegistry'); + let modeling = modeler.get('modeling'); // get root element of the current diagram const definitions = modeler.getDefinitions(); @@ -36,7 +38,7 @@ export async function startPlanqkReplacementProcess(xml) { if (typeof rootProcess === 'undefined') { console.log('Unable to retrieve root process element from definitions!'); - return {status: 'failed', cause: 'Unable to retrieve root process element from definitions!'}; + return { status: 'failed', cause: 'Unable to retrieve root process element from definitions!' }; } // Mark process as executable @@ -73,7 +75,7 @@ export async function startPlanqkReplacementProcess(xml) { // check if transformation is necessary if (isTransformed) { - return {status: 'transformed', xml: xml}; + return { status: 'transformed', xml: xml }; } const processContextVariables = {}; @@ -101,10 +103,10 @@ export async function startPlanqkReplacementProcess(xml) { createProcessContextVariablesTask(processContextVariables, rootProcess, definitions, modeler); } - // layout(modeling, elementRegistry, rootProcess); + layout(modeling, elementRegistry, rootProcess); const transformedXml = await getXml(modeler); - return {status: 'transformed', xml: transformedXml}; + return { status: 'transformed', xml: transformedXml }; } /** @@ -204,7 +206,7 @@ async function replaceByDataStore(definitions, dataPool, parentProcess, processC // add data pool link to details attribute of data pool const parameters = dataPool.get(dataConsts.DETAILS) || []; - const linkParam = bpmnFactory.create(dataConsts.KEY_VALUE_ENTRY, {name: consts.DATA_POOL_LINK, value: dataPool.get(consts.DATA_POOL_LINK)}); + const linkParam = bpmnFactory.create(dataConsts.KEY_VALUE_ENTRY, { name: consts.DATA_POOL_LINK, value: dataPool.get(consts.DATA_POOL_LINK) }); parameters.push(linkParam); // transform data pool like data store map @@ -230,7 +232,7 @@ export function getPlanqkServiceTasks(process, elementRegistry) { for (let i = 0; i < flowElements.length; i++) { let flowElement = flowElements[i]; if (flowElement.$type && flowElement.$type === consts.PLANQK_SERVICE_TASK) { - planqkServiceTasks.push({task: flowElement, parent: processBo}); + planqkServiceTasks.push({ task: flowElement, parent: processBo }); } // recursively retrieve service tasks if subprocess is found @@ -258,7 +260,7 @@ export function getPlanqkDataPools(process, elementRegistry) { for (let i = 0; i < flowElements.length; i++) { let flowElement = flowElements[i]; if (flowElement.$type && flowElement.$type === consts.PLANQK_DATA_POOL) { - planqkDataPools.push({pool: flowElement, parent: processBo}); + planqkDataPools.push({ pool: flowElement, parent: processBo }); } // recursively retrieve service tasks if subprocess is found diff --git a/components/bpmn-q/modeler-component/extensions/qhana/transformation/QHAnaTransformationHandler.js b/components/bpmn-q/modeler-component/extensions/qhana/transformation/QHAnaTransformationHandler.js index 133ff4aa..6c13c7b0 100644 --- a/components/bpmn-q/modeler-component/extensions/qhana/transformation/QHAnaTransformationHandler.js +++ b/components/bpmn-q/modeler-component/extensions/qhana/transformation/QHAnaTransformationHandler.js @@ -1,12 +1,13 @@ -import {getXml} from '../../../editor/util/IoUtilities'; -import {createTempModelerFromXml} from '../../../editor/ModelerHandler'; +import { getXml } from '../../../editor/util/IoUtilities'; +import { createTempModelerFromXml } from '../../../editor/ModelerHandler'; import { addCamundaInputParameter, getRootProcess, } from '../../../editor/util/ModellingUtilities'; -import {getAllElementsInProcess, insertShape} from '../../../editor/util/TransformationUtilities'; +import { getAllElementsInProcess, insertShape } from '../../../editor/util/TransformationUtilities'; import * as consts from '../QHAnaConstants'; import * as qhanaConsts from '../QHAnaConstants'; +import { layout } from '../../quantme/replacement/layouter/Layouter'; /** * Replace QHAna extensions with camunda bpmn elements so that it complies with the standard @@ -17,6 +18,7 @@ import * as qhanaConsts from '../QHAnaConstants'; export async function startQHAnaReplacementProcess(xml) { let modeler = await createTempModelerFromXml(xml); let elementRegistry = modeler.get('elementRegistry'); + let modeling = modeler.get('modeling'); // get root element of the current diagram const definitions = modeler.getDefinitions(); @@ -27,7 +29,7 @@ export async function startQHAnaReplacementProcess(xml) { if (typeof rootProcess === 'undefined') { console.log('Unable to retrieve root process element from definitions!'); - return {status: 'failed', cause: 'Unable to retrieve root process element from definitions!'}; + return { status: 'failed', cause: 'Unable to retrieve root process element from definitions!' }; } // Mark process as executable @@ -43,7 +45,7 @@ export async function startQHAnaReplacementProcess(xml) { // skip transformation if no QHAna service tasks and no QHAna service step tasks exist in the process if ((!qhanaServiceTasks || !qhanaServiceTasks.length) && (!qhanaServiceStepTasks || !qhanaServiceStepTasks.length)) { - return {status: 'transformed', xml: xml}; + return { status: 'transformed', xml: xml }; } // replace each qhana:QHAnaServiceTask with a ServiceTask with external implementation @@ -79,8 +81,9 @@ export async function startQHAnaReplacementProcess(xml) { } const transformedXml = await getXml(modeler); + layout(modeling, elementRegistry, rootProcess); // await saveResultXmlFn(transformedXml); - return {status: 'transformed', xml: transformedXml}; + return { status: 'transformed', xml: transformedXml }; } @@ -99,7 +102,7 @@ async function replaceQHAnaServiceTaskByServiceTask(definitions, qhanaServiceTas // create a BPMN service task with implementation external const topic = 'qhana-plugin.' + qhanaServiceTask.get(qhanaConsts.IDENTIFIER); - const newServiceTask = bpmnFactory.create('bpmn:ServiceTask', {type: 'external', topic: topic}); + const newServiceTask = bpmnFactory.create('bpmn:ServiceTask', { type: 'external', topic: topic }); let result = insertShape(definitions, parentProcess, newServiceTask, {}, true, modeler, qhanaServiceTask); @@ -130,7 +133,7 @@ async function replaceQHAnaServiceStepTaskByServiceTask(definitions, qhanaServic // create a BPMN service task with implementation external and the topic defined in the next step attribute const topic = 'plugin-step.' + consts.NEXT_STEP; - const newServiceTask = bpmnFactory.create('bpmn:ServiceTask', {type: 'external', topic: topic}); + const newServiceTask = bpmnFactory.create('bpmn:ServiceTask', { type: 'external', topic: topic }); let result = insertShape(definitions, parentProcess, newServiceTask, {}, true, modeler, qhanaServiceTask); diff --git a/components/bpmn-q/modeler-component/extensions/quantme/QuantMEPlugin.js b/components/bpmn-q/modeler-component/extensions/quantme/QuantMEPlugin.js index 226698da..7a99ad35 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/QuantMEPlugin.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/QuantMEPlugin.js @@ -6,6 +6,7 @@ import OpenToscaTab from "./configTabs/OpenToscaTab"; import NisqAnalyzerTab from "./configTabs/NisqAnalyzerTab"; import QrmDataTab from "./configTabs/QrmDataTab"; import HybridRuntimeTab from "./configTabs/HybridRuntimeTab"; +import UploadTab from "./configTabs/UploadTab"; import {getQRMs} from "./qrm-manager"; import {startQuantmeReplacementProcess} from "./replacement/QuantMETransformator"; import * as camundaConfig from "../../editor/config/EditorConfigManager"; @@ -53,6 +54,11 @@ export default { tabId: 'HybridRuntimesTab', tabTitle: 'Hybrid Runtimes', configTab: HybridRuntimeTab, + }, + { + tabId: 'UploadTab', + tabTitle: 'Upload data', + configTab: UploadTab, } ], name: 'quantme', diff --git a/components/bpmn-q/modeler-component/extensions/quantme/configTabs/QrmDataTab.js b/components/bpmn-q/modeler-component/extensions/quantme/configTabs/QrmDataTab.js index e08c01a2..6a2b7068 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/configTabs/QrmDataTab.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/configTabs/QrmDataTab.js @@ -14,7 +14,7 @@ export default function QrmDataTab() { const [githubRepositoryName, setGithubRepositoryName] = useState(config.getQRMRepositoryName()); const [githubUsername, setGithubUsername] = useState(config.getQRMRepositoryUserName()); const [githubRepositoryPath, setGithubRepositoryPath] = useState(config.getQRMRepositoryPath()); - + const [githubToken, setGitHubToken] = useState(config.getGitHubToken()); const modeler = getModeler(); const editorActions = modeler.get('editorActions'); @@ -41,15 +41,24 @@ export default function QrmDataTab() { } }); } + if (!editorActions._actions.hasOwnProperty('githubTokenChanged')) { + editorActions.register({ + githubTokenChanged: function (githubToken) { + self.modeler.config.githubToken = githubToken; + } + }); + } // save changed config entries on close QrmDataTab.prototype.onClose = () => { modeler.config.githubRepositoryName = githubRepositoryName; modeler.config.githubUsername = githubUsername; modeler.config.githubRepositoryPath = githubRepositoryPath; + modeler.config.githubToken = githubToken; config.setQRMRepositoryName(githubRepositoryName); config.setQRMUserName(githubUsername); config.setQRMRepositoryPath(githubRepositoryPath); + config.setGitHubToken(githubToken); }; return <> @@ -88,6 +97,21 @@ export default function QrmDataTab() { +

GitHub Authentication

+ + + + + + + +
GitHub Token [1]: + setGitHubToken(event.target.value)}/> +
; } @@ -97,4 +121,6 @@ QrmDataTab.prototype.config = () => { modeler.config.githubRepositoryName = config.getQRMRepositoryName(); modeler.config.githubUsername = config.getQRMRepositoryUserName(); modeler.config.githubRepositoryPath = config.getQRMRepositoryPath(); + modeler.config.githubToken = config.getGitHubToken(); + }; \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/extensions/quantme/configTabs/UploadTab.js b/components/bpmn-q/modeler-component/extensions/quantme/configTabs/UploadTab.js new file mode 100644 index 00000000..66624d03 --- /dev/null +++ b/components/bpmn-q/modeler-component/extensions/quantme/configTabs/UploadTab.js @@ -0,0 +1,123 @@ +import React, {useState} from 'react'; +import {getModeler} from "../../../editor/ModelerHandler"; +import * as config from "../framework-config/config-manager"; + +/** + * React component specifying a tab for the configuration dialog of the modeler. The tab allows the user to change the + * QRM data. + * + * @return {JSX.Element} The tab as a React component + * @constructor + */ +export default function UploadTab() { + + const [uploadGithubRepositoryName, setUploadGithubRepositoryName] = useState(config.getUploadGithubRepositoryName()); + const [uploadGithubOwner, setUploadGithubOwner] = useState(config.getUploadGithubRepositoryOwner()); + const [uploadFileName, setUploadFileName] = useState(config.getUploadFileName()); + const [uploadBranchName, setUploadBranchName] = useState(config.getUploadBranchName()); + const modeler = getModeler(); + + const editorActions = modeler.get('editorActions'); + + // register editor action listener for changes in config entries + if (!editorActions._actions.hasOwnProperty('uploadGithubRepositoryNameChanged')) { + editorActions.register({ + uploadGithubRepositoryNameChanged: function (uploadGithubRepositoryName) { + self.modeler.config.uploadGithubRepositoryName = uploadGithubRepositoryName; + } + }); + } + if (!editorActions._actions.hasOwnProperty('uploadGithubRepositoryOwnerChanged')) { + editorActions.register({ + uploadGithubRepositoryOwnerChanged: function (uploadGithubRepositoryOwner) { + self.modeler.config.uploadGithubRepositoryOwner = uploadGithubRepositoryOwner; + } + }); + } + if (!editorActions._actions.hasOwnProperty('uploadFileNameChanged')) { + editorActions.register({ + uploadFileNameChanged: function (uploadFileName) { + self.modeler.config.uploadFileName = uploadFileName; + } + }); + } + + if (!editorActions._actions.hasOwnProperty('uploadBranchNameChanged')) { + editorActions.register({ + uploadBranchNameChanged: function (uploadBranchName) { + self.modeler.config.uploadBranchName = uploadBranchName; + } + }); + } + + // save changed config entries on close + UploadTab.prototype.onClose = () => { + modeler.config.uploadGithubRepositoryName = uploadGithubRepositoryName; + modeler.config.uploadGithubRepositoryOwner = uploadGithubOwner; + modeler.config.uploadFileName = uploadFileName; + modeler.config.uploadBranchName = uploadBranchName; + + config.setUploadGithubRepositoryName(uploadGithubRepositoryName); + config.setUploadGithubRepositoryOwner(uploadGithubOwner); + config.setUploadFileName(uploadFileName); + config.setUploadBranchName(uploadBranchName); + + }; + + return <> +

Upload Data

+ + + + + + + + + + + + + + + + + + + +
GitHub Repository Owner: + setUploadGithubOwner(event.target.value)}/> +
GitHub Repository Name: + setUploadGithubRepositoryName(event.target.value)}/> +
GitHub Repository Branch: + setUploadBranchName(event.target.value)}/> +
Workflow File Name: + setUploadFileName(event.target.value)}/> +
+ ; +} + +UploadTab.prototype.config = () => { + const modeler = getModeler(); + + modeler.config.uploadGithubRepositoryName = config.getUploadGithubRepositoryName(); + modeler.config.uploadGithubRepositoryOwner = config.getUploadGithubRepositoryOwner(); + modeler.config.uploadFileName = config.getUploadFileName(); + modeler.config.uploadBranchName = config.getUploadBranchName(); +}; \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config-manager.js b/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config-manager.js index 11f1a52a..74aec1f0 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config-manager.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config-manager.js @@ -10,7 +10,7 @@ */ import defaultConfig from "./config"; -import {getPluginConfig} from '../../../editor/plugin/PluginConfigHandler'; +import { getPluginConfig } from '../../../editor/plugin/PluginConfigHandler'; let config = {}; @@ -20,8 +20,8 @@ let config = {}; export function getQuantMEDataConfigurationsEndpoint() { if (config.quantmeDataConfigurationsEndpoint === undefined) { setQuantMEDataConfigurationsEndpoint( - getPluginConfig('quantme').quantmeDataConfigurationsEndpoint - || defaultConfig.quantmeDataConfigurationsEndpoint); + getPluginConfig('quantme').quantmeDataConfigurationsEndpoint + || defaultConfig.quantmeDataConfigurationsEndpoint); } return config.quantmeDataConfigurationsEndpoint; } @@ -41,8 +41,8 @@ export function setQuantMEDataConfigurationsEndpoint(dataConfigurationsEndpoint) export function getNisqAnalyzerEndpoint() { if (config.nisqAnalyzerEndpoint === undefined) { setNisqAnalyzerEndpoint( - getPluginConfig('quantme').nisqAnalyzerEndpoint - || defaultConfig.nisqAnalyzerEndpoint); + getPluginConfig('quantme').nisqAnalyzerEndpoint + || defaultConfig.nisqAnalyzerEndpoint); } return config.nisqAnalyzerEndpoint; } @@ -62,8 +62,8 @@ export function setNisqAnalyzerEndpoint(nisqAnalyzerEndpoint) { export function getTransformationFrameworkEndpoint() { if (config.transformationFrameworkEndpoint === undefined) { setTransformationFrameworkEndpoint( - getPluginConfig('quantme').transformationFrameworkEndpoint - || defaultConfig.transformationFrameworkEndpoint); + getPluginConfig('quantme').transformationFrameworkEndpoint + || defaultConfig.transformationFrameworkEndpoint); } return config.transformationFrameworkEndpoint; } @@ -85,8 +85,8 @@ export function setTransformationFrameworkEndpoint(transformationFrameworkEndpoi export function getOpenTOSCAEndpoint() { if (config.opentoscaEndpoint === undefined) { setOpenTOSCAEndpoint( - getPluginConfig('quantme').opentoscaEndpoint - || defaultConfig.opentoscaEndpoint); + getPluginConfig('quantme').opentoscaEndpoint + || defaultConfig.opentoscaEndpoint); } return config.opentoscaEndpoint; } @@ -110,8 +110,8 @@ export function setOpenTOSCAEndpoint(opentoscaEndpoint) { export function getWineryEndpoint() { if (config.wineryEndpoint === undefined) { setWineryEndpoint( - getPluginConfig('quantme').wineryEndpoint - || defaultConfig.wineryEndpoint); + getPluginConfig('quantme').wineryEndpoint + || defaultConfig.wineryEndpoint); } return config.wineryEndpoint; } @@ -135,8 +135,8 @@ export function setWineryEndpoint(wineryEndpoint) { export function getQRMRepositoryPath() { if (config.githubRepositoryPath === undefined) { setQRMRepositoryPath( - getPluginConfig('quantme').githubRepositoryPath - || defaultConfig.githubRepositoryPath); + getPluginConfig('quantme').githubRepositoryPath + || defaultConfig.githubRepositoryPath); } return config.githubRepositoryPath; } @@ -160,8 +160,8 @@ export function setQRMRepositoryPath(repositoryPath) { export function getQRMRepositoryName() { if (config.githubRepositoryName === undefined) { setQRMRepositoryName( - getPluginConfig('quantme').githubRepositoryName - || defaultConfig.githubRepositoryName); + getPluginConfig('quantme').githubRepositoryName + || defaultConfig.githubRepositoryName); } return config.githubRepositoryName; } @@ -185,8 +185,8 @@ export function setQRMRepositoryName(repositoryName) { export function getQRMRepositoryUserName() { if (config.githubUsername === undefined) { setQRMUserName( - getPluginConfig('quantme').githubUsername - || defaultConfig.githubUsername); + getPluginConfig('quantme').githubUsername + || defaultConfig.githubUsername); } return config.githubUsername; } @@ -207,11 +207,11 @@ export function setQRMUserName(userName) { * * @return {string} the specified username */ -export function getGithubToken() { +export function getGitHubToken() { if (config.githubToken === undefined) { - setGithubToken( - getPluginConfig('quantme').githubToken - || defaultConfig.githubToken); + setGitHubToken( + getPluginConfig('quantme').githubToken + || defaultConfig.githubToken); } return config.githubToken; } @@ -221,7 +221,7 @@ export function getGithubToken() { * * @param githubToken the username */ -export function setGithubToken(githubToken) { +export function setGitHubToken(githubToken) { if (githubToken !== null && githubToken !== undefined) { config.githubToken = githubToken; } @@ -235,8 +235,8 @@ export function setGithubToken(githubToken) { export function getQiskitRuntimeHandlerEndpoint() { if (config.qiskitRuntimeHandlerEndpoint === undefined) { setQiskitRuntimeHandlerEndpoint( - getPluginConfig('quantme').qiskitRuntimeHandlerEndpoint - || defaultConfig.qiskitRuntimeHandlerEndpoint); + getPluginConfig('quantme').qiskitRuntimeHandlerEndpoint + || defaultConfig.qiskitRuntimeHandlerEndpoint); } return config.qiskitRuntimeHandlerEndpoint; } @@ -260,8 +260,8 @@ export function setQiskitRuntimeHandlerEndpoint(endpoint) { export function getScriptSplitterEndpoint() { if (config.scriptSplitterEndpoint === undefined) { setScriptSplitterEndpoint( - getPluginConfig('quantme').scriptSplitterEndpoint - || defaultConfig.scriptSplitterEndpoint); + getPluginConfig('quantme').scriptSplitterEndpoint + || defaultConfig.scriptSplitterEndpoint); } return config.scriptSplitterEndpoint; } @@ -285,8 +285,8 @@ export function setScriptSplitterEndpoint(endpoint) { export function getScriptSplitterThreshold() { if (config.scriptSplitterThreshold === undefined) { setScriptSplitterThreshold( - getPluginConfig('quantme').scriptSplitterThreshold - || defaultConfig.scriptSplitterThreshold); + getPluginConfig('quantme').scriptSplitterThreshold + || defaultConfig.scriptSplitterThreshold); } return config.scriptSplitterThreshold; } @@ -310,8 +310,8 @@ export function setScriptSplitterThreshold(threshold) { export function getHybridRuntimeProvenance() { if (config.hybridRuntimeProvenance === undefined) { setHybridRuntimeProvenance( - getPluginConfig('quantme').hybridRuntimeProvenance - || defaultConfig.hybridRuntimeProvenance); + getPluginConfig('quantme').hybridRuntimeProvenance + || defaultConfig.hybridRuntimeProvenance); } return config.hybridRuntimeProvenance; } @@ -335,8 +335,8 @@ export function setHybridRuntimeProvenance(hybridRuntimeProvenance) { export function getAWSRuntimeHandlerEndpoint() { if (config.awsRuntimeHandlerEndpoint === undefined) { setAWSRuntimeHandlerEndpoint( - getPluginConfig('quantme').awsRuntimeHandlerEndpoint - || defaultConfig.awsRuntimeHandlerEndpoint); + getPluginConfig('quantme').awsRuntimeHandlerEndpoint + || defaultConfig.awsRuntimeHandlerEndpoint); } return config.awsRuntimeHandlerEndpoint; } @@ -352,6 +352,82 @@ export function setAWSRuntimeHandlerEndpoint(endpoint) { } } +/** + * Get the upload Github Repository Name + */ +export function getUploadGithubRepositoryName() { + if (config.uploadGithubRepositoryName === undefined) { + setUploadGithubRepositoryName(defaultConfig.uploadGithubRepositoryName); + } + return config.uploadGithubRepositoryName; +} + +/** + * Set the upload Github Repositoryname + */ +export function setUploadGithubRepositoryName(uploadGithubRepositoryName) { + if (uploadGithubRepositoryName !== null && uploadGithubRepositoryName !== undefined) { + config.uploadGithubRepositoryName = uploadGithubRepositoryName; + } +} + +/** + * Get the Upload Github Reposítory Owner + */ +export function getUploadGithubRepositoryOwner() { + if (config.uploadGithubRepositoryOwner === undefined) { + setUploadGithubRepositoryOwner(defaultConfig.uploadGithubRepositoryOwner); + } + return config.uploadGithubRepositoryOwner; +} + +/** + * Set the Upload Github Repository User + */ +export function setUploadGithubRepositoryOwner(uploadGithubRepositoryOwner) { + if (uploadGithubRepositoryOwner !== null && uploadGithubRepositoryOwner !== undefined) { + config.uploadGithubRepositoryOwner = uploadGithubRepositoryOwner; + } +} + +/** + * Get the Upload File Name + */ +export function getUploadFileName() { + if (config.uploadFileName === undefined) { + setUploadFileName(defaultConfig.uploadFileName); + } + return config.uploadFileName; +} + +/** + * Set the Upload File Name + */ +export function setUploadFileName(uploadFileName) { + if (uploadFileName !== null && uploadFileName !== undefined) { + config.uploadFileName = uploadFileName; + } +} + +/** + * Get the Upload Branch Name + */ +export function getUploadBranchName() { + if (config.uploadBranchName === undefined) { + setUploadBranchName(defaultConfig.uploadBranchName); + } + return config.uploadBranchName; +} + +/** + * Set the Upload Branch Name + */ +export function setUploadBranchName(uploadBranchName) { + if (uploadBranchName !== null && uploadBranchName !== undefined) { + config.uploadBranchName = uploadBranchName; + } +} + /** * Reset all saved endpoints and configuration values back to default or the value of the respective plugin config * by setting this.comfig to an empty js object. diff --git a/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config.js b/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config.js index 05ead47b..10fba564 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/framework-config/config.js @@ -15,6 +15,7 @@ const defaultConfig = { opentoscaEndpoint: process.env.OPENTOSCA_ENDPOINT, wineryEndpoint: process.env.WINERY_ENDPOINT, nisqAnalyzerEndpoint: process.env.NISQ_ANALYZER_ENDPOINT, + githubToken: process.env.GITHUB_TOKEN, transformationFrameworkEndpoint: process.env.TRANSFORMATION_FRAMEWORK_ENDPOINT, qiskitRuntimeHandlerEndpoint: process.env.QISKIT_RUNTIME_HANDLER_ENDPOINT, awsRuntimeHandlerEndpoint: process.env.AWS_RUNTIME_HANDLER_ENDPOINT, @@ -23,7 +24,10 @@ const defaultConfig = { githubRepositoryName: process.env.QRM_REPONAME, githubUsername: process.env.QRM_USERNAME, githubRepositoryPath: process.env.QRM_REPOPATH, - githubToken: process.env.GITHUB_TOKEN, - hybridRuntimeProvenance: process.env.PROVENANCE_COLLECTION + hybridRuntimeProvenance: process.env.PROVENANCE_COLLECTION, + uploadGithubRepositoryName: process.env.UPLOAD_GITHUB_REPO, + uploadGithubRepositoryOwner: process.env.UPLOAD_GITHUB_USER, + uploadFileName: process.env.UPLOAD_FILE_NAME, + uploadBranchName: process.env.UPLOAD_BRANCH_NAME }; export default defaultConfig; \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnEditorActions.js b/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnEditorActions.js index e2e70672..be72fae4 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnEditorActions.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnEditorActions.js @@ -158,6 +158,10 @@ BpmnEditorActions.prototype._registerDefaultActions = function(injector) { eventBus.fire('removeSelection', context); }); + this._registerAction('downloadFiles', function(event) { + eventBus.fire('saveFile', {}); + }); + this._registerAction('undoOperation', function(event) { let context = {}; eventBus.fire('undo', context); diff --git a/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnKeyboardBindings.js b/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnKeyboardBindings.js index a62bacde..0f19b051 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnKeyboardBindings.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/modeling/BpmnKeyboardBindings.js @@ -1,6 +1,7 @@ import inherits from 'inherits-browser'; import KeyboardBindings from 'diagram-js/lib/features/keyboard/KeyboardBindings'; +import { getModeler } from '../../../editor/ModelerHandler'; /** * @typedef {import('didi').Injector} Injector @@ -61,7 +62,7 @@ BpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActio }); // search labels - // F + // CTRL + F addListener('find', function(context) { var event = context.keyEvent; @@ -131,7 +132,7 @@ BpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActio return true; } }); - + // delete selected element // D addListener('removeSelection', function(context) { @@ -145,7 +146,7 @@ BpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActio }); // undo operation - // U + // CTRL + U addListener('undoOperation', function(context) { var event = context.keyEvent; @@ -157,7 +158,7 @@ BpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActio }); // redo operation - // R + // CTRL + R addListener('redoOperation', function(context) { var event = context.keyEvent; @@ -168,4 +169,72 @@ BpmnKeyboardBindings.prototype.registerBindings = function(keyboard, editorActio } }); -}; \ No newline at end of file + // download files + // CTRL + S + addListener('downloadFiles', function(context) { + var event = context.keyEvent; + if (keyboard.isKey(['s', 'S'], event) && keyboard.isCmd(event)) { + event.preventDefault(); + editorActions.trigger('downloadFiles'); + return true; + } + }); + + // copy bpmn objects + addListener('copy', function(context) { + + // retrieve from local storage + const serializedCopy = localStorage.getItem('bpmnClipboard'); + + if (!serializedCopy) { + return; + } + + // parse tree, reinstantiating contained objects + const parsedCopy = JSON.parse(serializedCopy, createReviver(getModeler().get('moddle'))); + + // put into clipboard + getModeler().get('clipboard').set(parsedCopy); + }); + + /** + * A factory function that returns a reviver to be + * used with JSON#parse to reinstantiate moddle instances. + * + * @param {Moddle} moddle + * + * @return {Function} + */ +function createReviver(moddle) { + + var elCache = {}; + + return function(key, object) { + + if (typeof object === 'object' && typeof object.$type === 'string') { + + var objectId = object.id; + + if (objectId && elCache[objectId]) { + return elCache[objectId]; + } + + var type = object.$type; + var attrs = Object.assign({}, object); + + delete attrs.$type; + + var newEl = moddle.create(type, attrs); + + if (objectId) { + elCache[objectId] = newEl; + } + + return newEl; + } + + return object; + }; +} + +}; diff --git a/components/bpmn-q/modeler-component/extensions/quantme/modeling/QuantMESVGMap.js b/components/bpmn-q/modeler-component/extensions/quantme/modeling/QuantMESVGMap.js index 75ba342a..c5f61a2c 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/modeling/QuantMESVGMap.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/modeling/QuantMESVGMap.js @@ -27,7 +27,7 @@ export function getQuantMESVG(svgId) { 'SUBPROCESS_TYPE_CIRCUIT_CUTTING':{ transform: 'matrix(0.23, 0, 0, 0.23, 4, 3)', viewBox: '0 0 144 144', svg: '' }, 'TASK_TYPE_PARAMETER_OPTIMIZATION':{ transform: 'matrix(0.22, 0, 0, 0.22, 4, 3)', viewBox: '0 0 125 113', svg: '' }, 'TASK_TYPE_VQA':{ transform: 'matrix(0.25, 0, 0, 0.25, 3, 2)', viewBox: '0 0 189 98',svg: '' }, - 'TASK_TYPE_RESULT_EVALUATION':{ transform: 'matrix(0.35, 0, 0, 0.35, 4, -3)', viewBox: '0 0 188.96001 98.400002', svg: 'image/svg+xml' } + 'TASK_TYPE_RESULT_EVALUATION':{ transform: 'matrix(0.35, 0, 0, 0.35, 4, -3)', viewBox: '0 0 188.96001 98.400002', svg: '' } }; return quantMESVGMap[svgId]; diff --git a/components/bpmn-q/modeler-component/extensions/quantme/modeling/properties-provider/QuantMEPropertyEntries.js b/components/bpmn-q/modeler-component/extensions/quantme/modeling/properties-provider/QuantMEPropertyEntries.js index 4b2a7d21..7b329b50 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/modeling/properties-provider/QuantMEPropertyEntries.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/modeling/properties-provider/QuantMEPropertyEntries.js @@ -856,7 +856,7 @@ export function MaxNumberOfCutsEntry({ element }) { return response.json()).then(data => { defaultBranch = data.default_branch; if (branchName === '') { branchName = defaultBranch; } }); + + // Construct the API request to get the file's SHA + const apiUrl = `https://api.github.com/repos/${githubRepoOwner}/${githubRepo}/contents/${fileName}.bpmn?ref=${branchName}`; + + // check if branch exists + let includesBranch = false; + const apiBranchUrl = `https://api.github.com/repos/${githubRepoOwner}/${githubRepo}/branches`; + await fetch(apiBranchUrl, request) + .then(response => response.json()).then(data => { + includesBranch = data.some(element => element.name === branchName); + }); + + if (!includesBranch) { + const apiBranchShaUrl = `https://api.github.com/repos/${githubRepoOwner}/${githubRepo}/branches/${defaultBranch}`; + let sha = ''; + await fetch(apiBranchShaUrl, request) + .then(response => response.json()).then(data => { + sha = data.commit.sha; + }); + await createNewBranch(githubRepoOwner, githubRepo, githubToken, branchName, sha); + } + + // Get the file's SHA + await fetch(apiUrl, request) + .then(response => response.json()) + .then(fileData => { + let updateUrl = apiUrl; + if (fileData.message !== 'Not Found') { + updateUrl = `https://api.github.com/repos/${githubRepoOwner}/${githubRepo}/contents/${fileName}.bpmn?sha=${fileData.sha}`; + } + + const commitMessage = 'Update file'; + + const updateRequest = { + method: 'PUT', + headers: { + 'Authorization': `Token ${accessToken}`, + 'Content-Type': '*/*' + }, + body: JSON.stringify({ + message: commitMessage, + content: encodedXml, + sha: fileData.sha, + branch: branchName + }) + }; + + // Update the file + return fetch(updateUrl, updateRequest); + }) + .then(response => { + console.log('Upload successful:', response); + }) + .catch(error => { + console.error('Upload failed:', error); + }); +}; /** * Get the URLs to all folders in the given public repository @@ -20,28 +104,28 @@ import fetch from 'node-fetch'; * @param token github Token that can be used to authenticate */ export const getFoldersInRepository = async function (userName, repoName, repoPath, token) { - const directoryURLs = []; - const headers = {}; - if (token) { - headers['Authorization'] = `Token ${token}`; - } + const directoryURLs = []; + const headers = {}; + if (token) { + headers['Authorization'] = `Token ${token}`; + } - let response = await fetch(`https://api.github.com/repos/${userName}/${repoName}/contents/${repoPath}?ref=HEAD`, { - headers: headers - }); - const contents = await response.json(); + let response = await fetch(`https://api.github.com/repos/${userName}/${repoName}/contents/${repoPath}?ref=HEAD`, { + headers: headers + }); + const contents = await response.json(); - if (response.status !== 200) { - throw 'Status code not equal to 200: ' + response.status; - } + if (response.status !== 200) { + throw 'Status code not equal to 200: ' + response.status; + } - for (let i = 0; i < contents.length; i++) { - let item = contents[i]; - if (item.type === 'dir') { - directoryURLs.push(item.url); - } + for (let i = 0; i < contents.length; i++) { + let item = contents[i]; + if (item.type === 'dir') { + directoryURLs.push(item.url); } - return directoryURLs; + } + return directoryURLs; }; /** @@ -51,8 +135,8 @@ export const getFoldersInRepository = async function (userName, repoName, repoPa * @returns the content of the given file */ export const getFileContent = async function (fileURL) { - let response = await fetch(fileURL); - return await response.text(); + let response = await fetch(fileURL); + return await response.text(); }; /** @@ -62,21 +146,49 @@ export const getFileContent = async function (fileURL) { * @param token github Token that can be used to authenticate */ export const getFilesInFolder = async function (folderURL, token) { - const fileURLs = []; - const headers = {}; - if (token) { - headers['Authorization'] = `Token ${token}`; + const fileURLs = []; + const headers = {}; + if (token) { + headers['Authorization'] = `Token ${token}`; + } + let response = await fetch(folderURL, { + headers: headers + }); + const contents = await response.json(); + + for (let i = 0; i < contents.length; i++) { + let item = contents[i]; + if (item.type === 'file') { + fileURLs.push({ name: item.name, download_url: item.download_url }); } - let response = await fetch(folderURL, { - headers: headers - }); - const contents = await response.json(); + } + return fileURLs; +}; + +async function createNewBranch(repositoryOwner, repositoryName, accessToken, newBranchName, commitSHA) { + try { + const response = await fetch( + `https://api.github.com/repos/${repositoryOwner}/${repositoryName}/git/refs`, + { + method: 'POST', + headers: { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ref: `refs/heads/${newBranchName}`, + sha: commitSHA, + }), + } + ); - for (let i = 0; i < contents.length; i++) { - let item = contents[i]; - if (item.type === 'file') { - fileURLs.push({ name: item.name, download_url: item.download_url }); - } + if (response.ok) { + console.log(`New branch "${newBranchName}" created successfully!`); + } else { + const errorData = await response.json(); + console.error(`Failed to create new branch: ${errorData.message}`); } - return fileURLs; -}; \ No newline at end of file + } catch (error) { + console.error(error); + } +} diff --git a/components/bpmn-q/modeler-component/extensions/quantme/qrm-manager/qrm-handler.js b/components/bpmn-q/modeler-component/extensions/quantme/qrm-manager/qrm-handler.js index 558df497..f5b30c73 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/qrm-manager/qrm-handler.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/qrm-manager/qrm-handler.js @@ -21,9 +21,12 @@ export const getCurrentQRMs = async function () { // get all folders of the defined QRM repository which could contain a QRM let folders = []; + let repoPath = config.getQRMRepositoryPath().replace(/^\/|\/$/g, ''); + let QRMs = []; + + try { - let repoPath = config.getQRMRepositoryPath().replace(/^\/|\/$/g, ''); - folders = await gitHandler.getFoldersInRepository(config.getQRMRepositoryUserName(), config.getQRMRepositoryName(), repoPath, config.getGithubToken()); + folders = await gitHandler.getFoldersInRepository(config.getQRMRepositoryUserName(), config.getQRMRepositoryName(), repoPath, config.getGitHubToken()); } catch (error) { throw 'Unable to load QRMs from Github repository with username \'' + config.getQRMRepositoryUserName() + '\', repository name \'' + config.getQRMRepositoryName() + '\', and path \'' @@ -32,9 +35,9 @@ export const getCurrentQRMs = async function () { // filter invalid folders and retrieve QRMs console.log('Found %i folders with QRM candidates!', folders.length); - let QRMs = []; + for (let i = 0; i < folders.length; i++) { - let qrm = await getQRM(config.getQRMRepositoryUserName(), config.getQRMRepositoryName(), folders[i], config.getGithubToken()); + let qrm = await getQRM(config.getQRMRepositoryUserName(), config.getQRMRepositoryName(), folders[i], config.getGitHubToken()); if (qrm != null) { QRMs.push(qrm); } else { @@ -42,6 +45,7 @@ export const getCurrentQRMs = async function () { } } + return QRMs; }; @@ -51,7 +55,7 @@ export const getCurrentQRMs = async function () { * @param userName the Github username to which the QRM repository belongs * @param repoName the Github repository name to load the QRMs from * @param qrmUrl the URL to the folder containing the potential QRM - * @param token github Token that can be used to authenticate + * @param token the Github token to authenticate requests * @returns the QRM if it is valid or null otherwise */ async function getQRM(userName, repoName, qrmUrl, token) { @@ -89,4 +93,4 @@ async function getQRM(userName, repoName, qrmUrl, token) { 'detector': await gitHandler.getFileContent(detectorUrl), 'replacement': await gitHandler.getFileContent(replacementUrl) }; -} +} \ No newline at end of file diff --git a/components/bpmn-q/modeler-component/extensions/quantme/replacement/layouter/Layouter.js b/components/bpmn-q/modeler-component/extensions/quantme/replacement/layouter/Layouter.js index f76bebc4..ef1035d5 100644 --- a/components/bpmn-q/modeler-component/extensions/quantme/replacement/layouter/Layouter.js +++ b/components/bpmn-q/modeler-component/extensions/quantme/replacement/layouter/Layouter.js @@ -54,7 +54,7 @@ function layoutProcess(modeling, elementRegistry, process) { } else { // layout elements in subprocess - if (flowElements[i].$type === 'bpmn:SubProcess') { + if (['bpmn:SubProcess', 'quantme:QuantumHardwareSelectionSubprocess', 'quantme:CircuitCuttingSubprocess'].includes(flowElements[i].$type)) { console.log('Flow element is subprocess. Layouting contained elements...'); const flowElement = elementRegistry.get(flowElements[i].id); let oldBounds = getDi(flowElement).bounds; diff --git a/components/bpmn-q/modeler-component/modeler.css b/components/bpmn-q/modeler-component/modeler.css new file mode 100644 index 00000000..15488b09 --- /dev/null +++ b/components/bpmn-q/modeler-component/modeler.css @@ -0,0 +1,54 @@ +.resize { + position: absolute; + bottom: 45px; + right: 0; +} + +.xml-viewer-button { + position: absolute; + bottom: 45px; + left: 20px; + z-index: 2; +} + +.ace_editor.ace-tm { + width: 99%; + top: 0%; + position: absolute; + bottom: 0; + left: 0; + right: 0; + z-index: 1; +} + +#properties { + cursor: default; +} + +#properties::before { + content: ''; + position: absolute; + cursor: w-resize; +} + +body { + overflow-y: hidden; +} + +#editor_wrap { + position: relative; + border-bottom: 1px solid #222222; +} + +#editor_dragbar { + position: absolute; + top: 200; + /* Adjust the initial top position as needed */ + left: 0; + right: 0; + background-color: #222222; + height: 3px; + cursor: row-resize; + opacity: 1; + z-index: 3; +} \ No newline at end of file diff --git a/components/bpmn-q/package-lock.json b/components/bpmn-q/package-lock.json index 91a545e7..41f5694e 100644 --- a/components/bpmn-q/package-lock.json +++ b/components/bpmn-q/package-lock.json @@ -10,6 +10,7 @@ "license": "Apache-2.0", "dependencies": { "@bpmn-io/properties-panel": "^1.3.1", + "ace-builds": "^1.23.0", "autoprefixer": "^10.4.13", "bpmn-font": "^0.12.0", "bpmn-js": "^11.1.1", @@ -52,12 +53,18 @@ "babel-loader": "^9.1.2", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "babelify": "^10.0.0", + "bpmn-js-bpmnlint": "^0.14.0", + "bpmnlint": "^6.3.0", + "bpmnlint-loader": "^0.1.4", + "bpmnlint-plugin-camunda": "^0.4.2", + "bpmnlint-plugin-custom": "file:bpmnlint-plugin-custom", "browserify": "^14.5.0", "browserify-css": "^0.15.0", "canvg-browser": "^1.0.0", "chai": "^4.3.7", "chai-xml": "^0.4.0", "clean-webpack-plugin": "^4.0.0", + "client": "file:client", "copy-webpack-plugin": "^4.6.0", "css-loader": "^6.7.2", "cssify": "^1.0.3", @@ -100,6 +107,325 @@ "xmlbuilder": "^15.1.1" } }, + "bpmnlint-plugin-custom": { + "version": "0.0.0", + "dev": true, + "dependencies": { + "bpmnlint-utils": "^1.0.2" + }, + "devDependencies": { + "bpmnlint": "^7.2.1", + "chai": "^4.2.0", + "mocha": "^9.1.3" + } + }, + "bpmnlint-plugin-custom/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "bpmnlint-plugin-custom/node_modules/bpmn-moddle": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-7.1.3.tgz", + "integrity": "sha512-ZcBfw0NSOdYTSXFKEn7MOXHItz7VfLZTrFYKO8cK6V8ZzGjCcdiLIOiw7Lctw1PJsihhLiZQS8Htj2xKf+NwCg==", + "dev": true, + "dependencies": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "moddle-xml": "^9.0.6" + } + }, + "bpmnlint-plugin-custom/node_modules/bpmnlint": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-7.8.0.tgz", + "integrity": "sha512-hzmDB/yMzv90bRYkey6lvJ5fyqSCBPdIMRLBzWSvqpH/XvSasaRo3Gibp1oX3dJg1JyHeZw4EnJZdhP55CzGWQ==", + "dev": true, + "dependencies": { + "@philippfromme/moddle-helpers": "^0.1.0", + "ansi-colors": "^4.1.1", + "bpmn-moddle": "^7.1.2", + "bpmnlint-utils": "^1.0.2", + "cli-table": "^0.3.9", + "color-support": "^1.1.3", + "min-dash": "^3.8.0", + "mri": "^1.2.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.9" + }, + "bin": { + "bpmnlint": "bin/bpmnlint.js" + }, + "engines": { + "node": ">= 10" + } + }, + "bpmnlint-plugin-custom/node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "bpmnlint-plugin-custom/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "bpmnlint-plugin-custom/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "bpmnlint-plugin-custom/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "bpmnlint-plugin-custom/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "bpmnlint-plugin-custom/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "bpmnlint-plugin-custom/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "bpmnlint-plugin-custom/node_modules/min-dash": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", + "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==", + "dev": true + }, + "bpmnlint-plugin-custom/node_modules/mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "dependencies": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mochajs" + } + }, + "bpmnlint-plugin-custom/node_modules/mocha/node_modules/minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": ">=10" + } + }, + "bpmnlint-plugin-custom/node_modules/mocha/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "bpmnlint-plugin-custom/node_modules/moddle": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.4.tgz", + "integrity": "sha512-Kjb+hjuzO+YlojNGxEUXvdhLYTHTtAABDlDcJTtTcn5MbJF9Zkv4I1Fyvp3Ypmfgg1EfHDZ3PsCQTuML9JD6wg==", + "dev": true, + "dependencies": { + "min-dash": "^3.0.0" + } + }, + "bpmnlint-plugin-custom/node_modules/moddle-xml": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-9.0.6.tgz", + "integrity": "sha512-tl0reHpsY/aKlLGhXeFlQWlYAQHFxTkFqC8tq8jXRYpQSnLVw13T6swMaourLd7EXqHdWsc+5ggsB+fEep6xZQ==", + "dev": true, + "dependencies": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "saxen": "^8.1.2" + } + }, + "bpmnlint-plugin-custom/node_modules/nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "bpmnlint-plugin-custom/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "bpmnlint-plugin-custom/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "bpmnlint-plugin-custom/node_modules/serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "bpmnlint-plugin-custom/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "bpmnlint-plugin-custom/node_modules/workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + }, + "client": { + "dev": true + }, + "edbpmnlint-plugin-custom": { + "extraneous": true + }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -2321,6 +2647,13 @@ "node": ">= 8" } }, + "node_modules/@philippfromme/moddle-helpers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@philippfromme/moddle-helpers/-/moddle-helpers-0.1.0.tgz", + "integrity": "sha512-eKnrt2mCtcYFhweNr20mOWSG0431BPPFnhYJEQd+D2/5ssWPaHVEEgD3YnUOmbg1gdRQdVe2rrxcdEvvPugB/A==", + "deprecated": "Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.", + "dev": true + }, "node_modules/@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -2673,6 +3006,12 @@ "@types/node": "*" } }, + "node_modules/@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, "node_modules/@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -2871,6 +3210,11 @@ "node": ">= 0.6" } }, + "node_modules/ace-builds": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.23.0.tgz", + "integrity": "sha512-PKRuQaQkjIhg1zeqJPW1QFtJO2fx13Nlv7N/VLhQS/kIQ/2aGAgWvYVcE9X64gbSiLzPdY3jcxv5wJJpLj1gLw==" + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -3105,6 +3449,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -3230,6 +3583,15 @@ "get-intrinsic": "^1.1.3" } }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -3585,6 +3947,80 @@ "tiny-svg": "^3.0.0" } }, + "node_modules/bpmn-js-bpmnlint": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/bpmn-js-bpmnlint/-/bpmn-js-bpmnlint-0.14.0.tgz", + "integrity": "sha512-Vfs2WJwqsIOkbSRft68IIpekQwcOKSn9I3sTtaA7ejszwS5ZGng8R7e27vc0pmZpM5A+8BnuoVIHG+rcStgApA==", + "dev": true, + "dependencies": { + "diagram-js": "^5.0.2", + "min-dash": "^3.5.2", + "min-dom": "^3.1.1" + }, + "peerDependencies": { + "bpmnlint": "^3.2.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" + } + }, + "node_modules/bpmn-js-bpmnlint/node_modules/component-event": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/component-event/-/component-event-0.1.4.tgz", + "integrity": "sha512-GMwOG8MnUHP1l8DZx1ztFO0SJTFnIzZnBDkXAj8RM2ntV2A6ALlDxgbMY1Fvxlg6WPQ+5IM/a6vg4PEYbjg/Rw==", + "dev": true + }, + "node_modules/bpmn-js-bpmnlint/node_modules/diagram-js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-5.1.1.tgz", + "integrity": "sha512-SLxHOfEDLBC7LBjQFmXyvQXt4P5yZYFnTvhsCZZtJyQCadrVs71cUlchMmH+kUS/zaga/BkPWFbnV1d+4MsF8A==", + "dev": true, + "dependencies": { + "css.escape": "^1.5.1", + "didi": "^4.0.0", + "hammerjs": "^2.0.1", + "inherits": "^2.0.1", + "min-dash": "^3.5.0", + "min-dom": "^3.0.0", + "object-refs": "^0.3.0", + "path-intersection": "^1.0.2", + "tiny-svg": "^2.2.1" + } + }, + "node_modules/bpmn-js-bpmnlint/node_modules/didi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/didi/-/didi-4.0.0.tgz", + "integrity": "sha512-AzMElh8mCHOPWPCWfGjoJRla31fMXUT6+287W5ef3IPmtuBcyG9+MkFS7uPP6v3t2Cl086KwWfRB9mESa0OsHQ==", + "dev": true + }, + "node_modules/bpmn-js-bpmnlint/node_modules/min-dash": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", + "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==", + "dev": true + }, + "node_modules/bpmn-js-bpmnlint/node_modules/min-dom": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-3.2.1.tgz", + "integrity": "sha512-v6YCmnDzxk4rRJntWTUiwggLupPw/8ZSRqUq0PDaBwVZEO/wYzCH4SKVBV+KkEvf3u0XaWHly5JEosPtqRATZA==", + "dev": true, + "dependencies": { + "component-event": "^0.1.4", + "domify": "^1.3.1", + "indexof": "0.0.1", + "matches-selector": "^1.2.0", + "min-dash": "^3.8.1" + } + }, + "node_modules/bpmn-js-bpmnlint/node_modules/path-intersection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-1.1.1.tgz", + "integrity": "sha512-EdeUuXCm0+tb/2gv8PmRhd9fYYOtbDeTYkwCnzkBuAEjevEZi2mWUi1DVFF5nqSObYsxKcchvKUhnRULWOFreQ==", + "dev": true + }, + "node_modules/bpmn-js-bpmnlint/node_modules/tiny-svg": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-2.2.4.tgz", + "integrity": "sha512-NOi39lBknf4UdDEahNkbEAJnzhu1ZcN2j75IS2vLRmIhsfxdZpTChfLKBcN1ShplVmPIXJAIafk6YY5/Aa80lQ==", + "dev": true + }, "node_modules/bpmn-js-cli": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/bpmn-js-cli/-/bpmn-js-cli-2.3.0.tgz", @@ -3633,6 +4069,92 @@ "moddle-xml": "^10.0.0" } }, + "node_modules/bpmnlint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-6.5.0.tgz", + "integrity": "sha512-plF2kcTqcQ7gyusnR9gQhDd04Ld/rJ0b9k8HGa5Bg3m88w8hf6O2AJ5JHpITttncJzNNxFvNXzYmJVOhIgqB2g==", + "dev": true, + "dependencies": { + "bpmn-moddle": "^6.0.0", + "bpmnlint-utils": "^1.0.1", + "chalk": "^2.4.2", + "cli-table": "^0.3.1", + "meow": "^5.0.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.8" + }, + "bin": { + "bpmnlint": "bin/bpmnlint.js" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/bpmnlint-loader": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/bpmnlint-loader/-/bpmnlint-loader-0.1.6.tgz", + "integrity": "sha512-/XmvV70NT1uTpjtC6C5bTJvWFR6v5RFxLzUCuP0ScKKlTf6me9rYgV0sAXdbW2011vFSFfD8DJHTi+D3gnSUww==", + "dev": true, + "peerDependencies": { + "bpmnlint": "*" + } + }, + "node_modules/bpmnlint-plugin-camunda": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/bpmnlint-plugin-camunda/-/bpmnlint-plugin-camunda-0.4.2.tgz", + "integrity": "sha512-gp/m8/+HNSw9Gi6lVMe2SgkXAL/KHRlBe5f3aDqsVx7IVR/y7pQWiknT0VIVaLCLZmox3BBQ0WK3GwtQrI9lug==", + "dev": true, + "dependencies": { + "bpmnlint-utils": "^1.0.2" + } + }, + "node_modules/bpmnlint-plugin-custom": { + "resolved": "bpmnlint-plugin-custom", + "link": true + }, + "node_modules/bpmnlint-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bpmnlint-utils/-/bpmnlint-utils-1.0.2.tgz", + "integrity": "sha512-+ti0VICOpgYpQgzpF0mwXqDX4NhrQCc2YKy28VjPu7v9sXpdpWEylP+iBw6WlheJFRcXoZh2q/QRLb5DMB3naQ==", + "dev": true + }, + "node_modules/bpmnlint/node_modules/bpmn-moddle": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-6.0.7.tgz", + "integrity": "sha512-MD649c7/I7+AKl3OGLs8ed8guzKuIRIJhOvLeVBSyCHtd41iB8ZRi+NL2UeC8pNgpqcjMsZG3ye++x3fh6MQ+g==", + "dev": true, + "dependencies": { + "min-dash": "^3.0.0", + "moddle": "^5.0.1", + "moddle-xml": "^8.0.8" + } + }, + "node_modules/bpmnlint/node_modules/min-dash": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", + "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==", + "dev": true + }, + "node_modules/bpmnlint/node_modules/moddle": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.4.tgz", + "integrity": "sha512-Kjb+hjuzO+YlojNGxEUXvdhLYTHTtAABDlDcJTtTcn5MbJF9Zkv4I1Fyvp3Ypmfgg1EfHDZ3PsCQTuML9JD6wg==", + "dev": true, + "dependencies": { + "min-dash": "^3.0.0" + } + }, + "node_modules/bpmnlint/node_modules/moddle-xml": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-8.0.8.tgz", + "integrity": "sha512-JzW8wUCH7Qze7eh0T8A1exi7QJg6hRgq+uw8goHNP5Q7pWTGrLj83S+NgA/94M2I0JmqnK9hw3sCbyiKVOjc4Q==", + "dev": true, + "dependencies": { + "min-dash": "^3.0.0", + "moddle": "^5.0.1", + "saxen": "^8.1.2" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4095,6 +4617,38 @@ "node": ">=6" } }, + "node_modules/camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase-keys/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/camelcase-keys/node_modules/quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/camunda-bpmn-js-behaviors": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/camunda-bpmn-js-behaviors/-/camunda-bpmn-js-behaviors-0.5.0.tgz", @@ -4347,15 +4901,31 @@ "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", "dev": true, "dependencies": { - "del": "^4.1.1" + "del": "^4.1.1" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.0 <6.0.0" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" }, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.0 <6.0.0" + "node": ">= 0.2.0" } }, + "node_modules/client": { + "resolved": "client", + "link": true + }, "node_modules/cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -4414,12 +4984,30 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", @@ -5252,6 +5840,12 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -5281,6 +5875,18 @@ "node": ">= 0.12.0" } }, + "node_modules/currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "dependencies": { + "array-find-index": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -5345,6 +5951,40 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -7715,6 +8355,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "node_modules/globby": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", @@ -7747,6 +8393,12 @@ "node": ">=4" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -7809,6 +8461,15 @@ "lodash": "^4.17.15" } }, + "node_modules/growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true, + "engines": { + "node": ">=4.x" + } + }, "node_modules/hammerjs": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", @@ -8012,6 +8673,12 @@ "node": ">=0.10.0" } }, + "node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "node_modules/hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -8402,6 +9069,15 @@ "node": ">=0.8.19" } }, + "node_modules/indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -9096,6 +9772,12 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "node_modules/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -9538,6 +10220,43 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "node_modules/load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/load-json-file/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -9828,6 +10547,19 @@ "loose-envify": "cli.js" } }, + "node_modules/loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "dependencies": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -9897,6 +10629,15 @@ "dev": true, "peer": true }, + "node_modules/map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -9923,6 +10664,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/matches-selector": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/matches-selector/-/matches-selector-1.2.0.tgz", + "integrity": "sha512-c4vLwYWyl+Ji+U43eU/G5FwxWd4ZH0ePUsFs5y0uwD9HUEFBXUQ1zUUan+78IpRD+y4pUfG0nAzNM292K7ItvA==", + "dev": true + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -9955,6 +10702,44 @@ "node": ">= 4.0.0" } }, + "node_modules/meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "dependencies": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/meow/node_modules/camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/meow/node_modules/yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "dependencies": { + "camelcase": "^4.1.0" + } + }, "node_modules/merge": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", @@ -10137,6 +10922,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "engines": { + "node": ">= 4" + } + }, "node_modules/mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", @@ -10476,6 +11274,15 @@ "run-queue": "^1.0.3" } }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10665,6 +11472,27 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, + "node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/normalize-package-data/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -11355,6 +12183,15 @@ "node": ">=8" } }, + "node_modules/pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -12159,6 +12996,79 @@ "readable-stream": "^2.0.2" } }, + "node_modules/read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "dependencies": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "dependencies": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "dependencies": { + "locate-path": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "dependencies": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "dependencies": { + "p-limit": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -12210,6 +13120,19 @@ "node": ">= 10.13.0" } }, + "node_modules/redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", + "dev": true, + "dependencies": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -13171,6 +14094,38 @@ "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, + "node_modules/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "node_modules/spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -13471,6 +14426,15 @@ "node": ">=8" } }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-css-comments": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-css-comments/-/strip-css-comments-3.0.0.tgz", @@ -13492,6 +14456,15 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -13734,6 +14707,16 @@ "node": ">=0.6.0" } }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "node_modules/tiny-svg": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-3.0.1.tgz", @@ -13806,6 +14789,15 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -14312,6 +15304,16 @@ "dev": true, "peer": true }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -16930,6 +17932,12 @@ "fastq": "^1.6.0" } }, + "@philippfromme/moddle-helpers": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@philippfromme/moddle-helpers/-/moddle-helpers-0.1.0.tgz", + "integrity": "sha512-eKnrt2mCtcYFhweNr20mOWSG0431BPPFnhYJEQd+D2/5ssWPaHVEEgD3YnUOmbg1gdRQdVe2rrxcdEvvPugB/A==", + "dev": true + }, "@sindresorhus/is": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", @@ -17277,6 +18285,12 @@ "@types/node": "*" } }, + "@ungap/promise-all-settled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", + "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "dev": true + }, "@webassemblyjs/ast": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", @@ -17449,6 +18463,11 @@ "negotiator": "0.6.3" } }, + "ace-builds": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.23.0.tgz", + "integrity": "sha512-PKRuQaQkjIhg1zeqJPW1QFtJO2fx13Nlv7N/VLhQS/kIQ/2aGAgWvYVcE9X64gbSiLzPdY3jcxv5wJJpLj1gLw==" + }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", @@ -17625,6 +18644,12 @@ "is-array-buffer": "^3.0.1" } }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==", + "dev": true + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -17714,6 +18739,12 @@ "get-intrinsic": "^1.1.3" } }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -17990,6 +19021,79 @@ "tiny-svg": "^3.0.0" } }, + "bpmn-js-bpmnlint": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/bpmn-js-bpmnlint/-/bpmn-js-bpmnlint-0.14.0.tgz", + "integrity": "sha512-Vfs2WJwqsIOkbSRft68IIpekQwcOKSn9I3sTtaA7ejszwS5ZGng8R7e27vc0pmZpM5A+8BnuoVIHG+rcStgApA==", + "dev": true, + "requires": { + "diagram-js": "^5.0.2", + "min-dash": "^3.5.2", + "min-dom": "^3.1.1" + }, + "dependencies": { + "component-event": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/component-event/-/component-event-0.1.4.tgz", + "integrity": "sha512-GMwOG8MnUHP1l8DZx1ztFO0SJTFnIzZnBDkXAj8RM2ntV2A6ALlDxgbMY1Fvxlg6WPQ+5IM/a6vg4PEYbjg/Rw==", + "dev": true + }, + "diagram-js": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-5.1.1.tgz", + "integrity": "sha512-SLxHOfEDLBC7LBjQFmXyvQXt4P5yZYFnTvhsCZZtJyQCadrVs71cUlchMmH+kUS/zaga/BkPWFbnV1d+4MsF8A==", + "dev": true, + "requires": { + "css.escape": "^1.5.1", + "didi": "^4.0.0", + "hammerjs": "^2.0.1", + "inherits": "^2.0.1", + "min-dash": "^3.5.0", + "min-dom": "^3.0.0", + "object-refs": "^0.3.0", + "path-intersection": "^1.0.2", + "tiny-svg": "^2.2.1" + } + }, + "didi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/didi/-/didi-4.0.0.tgz", + "integrity": "sha512-AzMElh8mCHOPWPCWfGjoJRla31fMXUT6+287W5ef3IPmtuBcyG9+MkFS7uPP6v3t2Cl086KwWfRB9mESa0OsHQ==", + "dev": true + }, + "min-dash": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", + "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==", + "dev": true + }, + "min-dom": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-3.2.1.tgz", + "integrity": "sha512-v6YCmnDzxk4rRJntWTUiwggLupPw/8ZSRqUq0PDaBwVZEO/wYzCH4SKVBV+KkEvf3u0XaWHly5JEosPtqRATZA==", + "dev": true, + "requires": { + "component-event": "^0.1.4", + "domify": "^1.3.1", + "indexof": "0.0.1", + "matches-selector": "^1.2.0", + "min-dash": "^3.8.1" + } + }, + "path-intersection": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-1.1.1.tgz", + "integrity": "sha512-EdeUuXCm0+tb/2gv8PmRhd9fYYOtbDeTYkwCnzkBuAEjevEZi2mWUi1DVFF5nqSObYsxKcchvKUhnRULWOFreQ==", + "dev": true + }, + "tiny-svg": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-2.2.4.tgz", + "integrity": "sha512-NOi39lBknf4UdDEahNkbEAJnzhu1ZcN2j75IS2vLRmIhsfxdZpTChfLKBcN1ShplVmPIXJAIafk6YY5/Aa80lQ==", + "dev": true + } + } + }, "bpmn-js-cli": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/bpmn-js-cli/-/bpmn-js-cli-2.3.0.tgz", @@ -18005,31 +19109,339 @@ } } }, - "bpmn-js-properties-panel": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-1.20.3.tgz", - "integrity": "sha512-6IsmR7wCQw/uEk/1Wp46gWHzY96x2KslEVnUa/NOh07ZGunfImOYdKD5M/09nIxn+3JroeS+Rb++k75edbleMA==", - "requires": { - "@bpmn-io/element-templates-validator": "^0.13.0", - "@bpmn-io/extract-process-variables": "^0.8.0", - "array-move": "^3.0.1", - "classnames": "^2.3.1", - "ids": "^1.0.0", - "min-dash": "^4.0.0", - "min-dom": "^4.0.3", - "preact-markup": "^2.1.1", - "semver-compare": "^1.0.0" - } - }, - "bpmn-moddle": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-8.0.1.tgz", - "integrity": "sha512-mwZcrWhi52+JH5Oq58WwKYcUxQ1ZMiDQuzt1bpqiqEEFFnQLqCgtLwEXQuDXFmAuQPdMAghyPzqdOZQqIQVesw==", - "requires": { - "min-dash": "^4.0.0", - "moddle": "^6.0.0", - "moddle-xml": "^10.0.0" - } + "bpmn-js-properties-panel": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-1.20.3.tgz", + "integrity": "sha512-6IsmR7wCQw/uEk/1Wp46gWHzY96x2KslEVnUa/NOh07ZGunfImOYdKD5M/09nIxn+3JroeS+Rb++k75edbleMA==", + "requires": { + "@bpmn-io/element-templates-validator": "^0.13.0", + "@bpmn-io/extract-process-variables": "^0.8.0", + "array-move": "^3.0.1", + "classnames": "^2.3.1", + "ids": "^1.0.0", + "min-dash": "^4.0.0", + "min-dom": "^4.0.3", + "preact-markup": "^2.1.1", + "semver-compare": "^1.0.0" + } + }, + "bpmn-moddle": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-8.0.1.tgz", + "integrity": "sha512-mwZcrWhi52+JH5Oq58WwKYcUxQ1ZMiDQuzt1bpqiqEEFFnQLqCgtLwEXQuDXFmAuQPdMAghyPzqdOZQqIQVesw==", + "requires": { + "min-dash": "^4.0.0", + "moddle": "^6.0.0", + "moddle-xml": "^10.0.0" + } + }, + "bpmnlint": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-6.5.0.tgz", + "integrity": "sha512-plF2kcTqcQ7gyusnR9gQhDd04Ld/rJ0b9k8HGa5Bg3m88w8hf6O2AJ5JHpITttncJzNNxFvNXzYmJVOhIgqB2g==", + "dev": true, + "requires": { + "bpmn-moddle": "^6.0.0", + "bpmnlint-utils": "^1.0.1", + "chalk": "^2.4.2", + "cli-table": "^0.3.1", + "meow": "^5.0.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.8" + }, + "dependencies": { + "bpmn-moddle": { + "version": "6.0.7", + "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-6.0.7.tgz", + "integrity": "sha512-MD649c7/I7+AKl3OGLs8ed8guzKuIRIJhOvLeVBSyCHtd41iB8ZRi+NL2UeC8pNgpqcjMsZG3ye++x3fh6MQ+g==", + "dev": true, + "requires": { + "min-dash": "^3.0.0", + "moddle": "^5.0.1", + "moddle-xml": "^8.0.8" + } + }, + "min-dash": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", + "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==", + "dev": true + }, + "moddle": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.4.tgz", + "integrity": "sha512-Kjb+hjuzO+YlojNGxEUXvdhLYTHTtAABDlDcJTtTcn5MbJF9Zkv4I1Fyvp3Ypmfgg1EfHDZ3PsCQTuML9JD6wg==", + "dev": true, + "requires": { + "min-dash": "^3.0.0" + } + }, + "moddle-xml": { + "version": "8.0.8", + "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-8.0.8.tgz", + "integrity": "sha512-JzW8wUCH7Qze7eh0T8A1exi7QJg6hRgq+uw8goHNP5Q7pWTGrLj83S+NgA/94M2I0JmqnK9hw3sCbyiKVOjc4Q==", + "dev": true, + "requires": { + "min-dash": "^3.0.0", + "moddle": "^5.0.1", + "saxen": "^8.1.2" + } + } + } + }, + "bpmnlint-loader": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/bpmnlint-loader/-/bpmnlint-loader-0.1.6.tgz", + "integrity": "sha512-/XmvV70NT1uTpjtC6C5bTJvWFR6v5RFxLzUCuP0ScKKlTf6me9rYgV0sAXdbW2011vFSFfD8DJHTi+D3gnSUww==", + "dev": true, + "requires": {} + }, + "bpmnlint-plugin-camunda": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/bpmnlint-plugin-camunda/-/bpmnlint-plugin-camunda-0.4.2.tgz", + "integrity": "sha512-gp/m8/+HNSw9Gi6lVMe2SgkXAL/KHRlBe5f3aDqsVx7IVR/y7pQWiknT0VIVaLCLZmox3BBQ0WK3GwtQrI9lug==", + "dev": true, + "requires": { + "bpmnlint-utils": "^1.0.2" + } + }, + "bpmnlint-plugin-custom": { + "version": "file:bpmnlint-plugin-custom", + "requires": { + "bpmnlint": "^7.2.1", + "bpmnlint-utils": "^1.0.2", + "chai": "^4.2.0", + "mocha": "^9.1.3" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "bpmn-moddle": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-7.1.3.tgz", + "integrity": "sha512-ZcBfw0NSOdYTSXFKEn7MOXHItz7VfLZTrFYKO8cK6V8ZzGjCcdiLIOiw7Lctw1PJsihhLiZQS8Htj2xKf+NwCg==", + "dev": true, + "requires": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "moddle-xml": "^9.0.6" + } + }, + "bpmnlint": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-7.8.0.tgz", + "integrity": "sha512-hzmDB/yMzv90bRYkey6lvJ5fyqSCBPdIMRLBzWSvqpH/XvSasaRo3Gibp1oX3dJg1JyHeZw4EnJZdhP55CzGWQ==", + "dev": true, + "requires": { + "@philippfromme/moddle-helpers": "^0.1.0", + "ansi-colors": "^4.1.1", + "bpmn-moddle": "^7.1.2", + "bpmnlint-utils": "^1.0.2", + "cli-table": "^0.3.9", + "color-support": "^1.1.3", + "min-dash": "^3.8.0", + "mri": "^1.2.0", + "pluralize": "^7.0.0", + "tiny-glob": "^0.2.9" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + } + }, + "glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "min-dash": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", + "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==", + "dev": true + }, + "mocha": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", + "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", + "dev": true, + "requires": { + "@ungap/promise-all-settled": "1.1.2", + "ansi-colors": "4.1.1", + "browser-stdout": "1.3.1", + "chokidar": "3.5.3", + "debug": "4.3.3", + "diff": "5.0.0", + "escape-string-regexp": "4.0.0", + "find-up": "5.0.0", + "glob": "7.2.0", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "4.1.0", + "log-symbols": "4.1.0", + "minimatch": "4.2.1", + "ms": "2.1.3", + "nanoid": "3.3.1", + "serialize-javascript": "6.0.0", + "strip-json-comments": "3.1.1", + "supports-color": "8.1.1", + "which": "2.0.2", + "workerpool": "6.2.0", + "yargs": "16.2.0", + "yargs-parser": "20.2.4", + "yargs-unparser": "2.0.0" + }, + "dependencies": { + "minimatch": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", + "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "moddle": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.4.tgz", + "integrity": "sha512-Kjb+hjuzO+YlojNGxEUXvdhLYTHTtAABDlDcJTtTcn5MbJF9Zkv4I1Fyvp3Ypmfgg1EfHDZ3PsCQTuML9JD6wg==", + "dev": true, + "requires": { + "min-dash": "^3.0.0" + } + }, + "moddle-xml": { + "version": "9.0.6", + "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-9.0.6.tgz", + "integrity": "sha512-tl0reHpsY/aKlLGhXeFlQWlYAQHFxTkFqC8tq8jXRYpQSnLVw13T6swMaourLd7EXqHdWsc+5ggsB+fEep6xZQ==", + "dev": true, + "requires": { + "min-dash": "^3.5.2", + "moddle": "^5.0.2", + "saxen": "^8.1.2" + } + }, + "nanoid": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", + "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", + "dev": true + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "serialize-javascript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", + "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "workerpool": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", + "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", + "dev": true + } + } + }, + "bpmnlint-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bpmnlint-utils/-/bpmnlint-utils-1.0.2.tgz", + "integrity": "sha512-+ti0VICOpgYpQgzpF0mwXqDX4NhrQCc2YKy28VjPu7v9sXpdpWEylP+iBw6WlheJFRcXoZh2q/QRLb5DMB3naQ==", + "dev": true }, "brace-expansion": { "version": "1.1.11", @@ -18435,6 +19847,31 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha512-Ej37YKYbFUI8QiYlvj9YHb6/Z60dZyPJW0Cs8sFilMbd2lP0bw3ylAq9yJkK4lcTA2dID5fG8LjmJYbO7kWb7Q==", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true + }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha512-tRS7sTgyxMXtLum8L65daJnHUhfDUgboRdcWW2bR9vBfrj2+O5HSMbQOJfJJjIVSPFqbBCF37FpwWXGitDc5tA==", + "dev": true + } + } + }, "camunda-bpmn-js-behaviors": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/camunda-bpmn-js-behaviors/-/camunda-bpmn-js-behaviors-0.5.0.tgz", @@ -18624,6 +20061,18 @@ "del": "^4.1.1" } }, + "cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "requires": { + "colors": "1.0.3" + } + }, + "client": { + "version": "file:client" + }, "cliui": { "version": "7.0.4", "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", @@ -18673,12 +20122,24 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, "colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", "dev": true }, + "colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true + }, "combine-source-map": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", @@ -19379,6 +20840,12 @@ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, + "css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", + "dev": true + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -19399,6 +20866,15 @@ "through2": "^2.0.0" } }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -19446,6 +20922,30 @@ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", "dev": true }, + "decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true + } + } + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -21297,6 +22797,12 @@ "define-properties": "^1.1.3" } }, + "globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, "globby": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", @@ -21325,6 +22831,12 @@ } } }, + "globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, "gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -21378,6 +22890,12 @@ "lodash": "^4.17.15" } }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, "hammerjs": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", @@ -21531,6 +23049,12 @@ "parse-passwd": "^1.0.0" } }, + "hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true + }, "hpack.js": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", @@ -21814,6 +23338,12 @@ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true }, + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha512-BYqTHXTGUIvg7t1r4sJNKcbDZkL92nkXA8YtRpbjFHRHGDL/NtUeiBJMeE60kIFN/Mg8ESaWQvftaYMGJzQZCQ==", + "dev": true + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -22316,6 +23846,12 @@ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -22670,6 +24206,36 @@ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, + "load-json-file": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", + "integrity": "sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", + "dev": true + } + } + }, "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", @@ -22919,6 +24485,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "loupe": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", @@ -22973,6 +24549,12 @@ "dev": true, "peer": true }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha512-TzQSV2DiMYgoF5RycneKVUzIa9bQsj/B3tTgsE3dOGqlzHnGIDaC7XBE7grnA+8kZPnfqSGFe95VHc2oc0VFUQ==", + "dev": true + }, "matcher": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", @@ -22992,6 +24574,12 @@ } } }, + "matches-selector": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/matches-selector/-/matches-selector-1.2.0.tgz", + "integrity": "sha512-c4vLwYWyl+Ji+U43eU/G5FwxWd4ZH0ePUsFs5y0uwD9HUEFBXUQ1zUUan+78IpRD+y4pUfG0nAzNM292K7ItvA==", + "dev": true + }, "md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -23018,6 +24606,40 @@ "fs-monkey": "^1.0.3" } }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "merge": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/merge/-/merge-2.1.1.tgz", @@ -23156,6 +24778,16 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + } + }, "mississippi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz", @@ -23426,6 +25058,12 @@ "run-queue": "^1.0.3" } }, + "mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -23571,6 +25209,26 @@ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -24093,6 +25751,12 @@ "find-up": "^4.0.0" } }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, "postcss": { "version": "8.4.21", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.21.tgz", @@ -24691,6 +26355,63 @@ "readable-stream": "^2.0.2" } }, + "read-pkg": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", + "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", + "dev": true, + "requires": { + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" + } + }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true + } + } + }, "readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", @@ -24738,6 +26459,16 @@ "resolve": "^1.20.0" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha512-XNwrTx77JQCEMXTeb8movBKuK75MgH0RZkujNuDKCezemx/voapl9i2gCSi8WWm8+ox5ycJi1gxF22fR7c0Ciw==", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + } + }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", @@ -25498,6 +27229,38 @@ "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "dev": true }, + "spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, "spdy": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", @@ -25763,6 +27526,12 @@ "ansi-regex": "^5.0.1" } }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + }, "strip-css-comments": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-css-comments/-/strip-css-comments-3.0.0.tgz", @@ -25778,6 +27547,12 @@ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha512-RsSNPLpq6YUL7QYy44RnPVTn/lcVZtb48Uof3X5JLbF4zD/Gs7ZFDv2HWol+leoQN2mT86LAzSshGfkTlSOpsA==", + "dev": true + }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -25946,6 +27721,16 @@ "process": "~0.11.0" } }, + "tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "requires": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, "tiny-svg": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-3.0.1.tgz", @@ -26002,6 +27787,12 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha512-MTBWv3jhVjTU7XR3IQHllbiJs8sc75a80OEhB6or/q7pLTWgQ0bMGQXXYQSrSuXe6WiKWDZ5txXY5P59a/coVA==", + "dev": true + }, "ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -26363,6 +28154,16 @@ "dev": true, "peer": true }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/components/bpmn-q/package.json b/components/bpmn-q/package.json index 7bbe734c..1d7f909d 100644 --- a/components/bpmn-q/package.json +++ b/components/bpmn-q/package.json @@ -3,7 +3,7 @@ "version": "0.1.8", "description": "", "package name": "@PlanQK/workflow-modeler", - "main": "public/index.js", + "main": "index.js", "files": [ "public/**/*", "!public/index.html" @@ -12,7 +12,8 @@ "test": "karma start", "test:watch": "npm test -- --auto-watch --no-single-run", "build": "webpack", - "dev": "webpack-dev-server --open" + "dev": "webpack-dev-server", + "dev-open": "webpack-dev-server --open" }, "author": "", "license": "Apache-2.0", @@ -23,6 +24,7 @@ }, "dependencies": { "@bpmn-io/properties-panel": "^1.3.1", + "ace-builds": "^1.23.0", "autoprefixer": "^10.4.13", "bpmn-font": "^0.12.0", "bpmn-js": "^11.1.1", @@ -42,8 +44,8 @@ "min-dash": "^4.0.0", "min-dom": "^4.1.0", "node-fetch": "^2.1.2", - "process": "^0.11.10", "prefix-css-loader": "^1.0.0", + "process": "^0.11.10", "react": "^18.2.0", "react-dom": "^18.2.0", "stream": "^0.0.2", @@ -65,12 +67,18 @@ "babel-loader": "^9.1.2", "babel-plugin-transform-react-remove-prop-types": "^0.4.24", "babelify": "^10.0.0", + "bpmn-js-bpmnlint": "^0.14.0", + "bpmnlint": "^6.3.0", + "bpmnlint-loader": "^0.1.4", + "bpmnlint-plugin-camunda": "^0.4.2", + "bpmnlint-plugin-custom": "file:bpmnlint-plugin-custom", "browserify": "^14.5.0", "browserify-css": "^0.15.0", "canvg-browser": "^1.0.0", "chai": "^4.3.7", "chai-xml": "^0.4.0", "clean-webpack-plugin": "^4.0.0", + "client": "file:client", "copy-webpack-plugin": "^4.6.0", "css-loader": "^6.7.2", "cssify": "^1.0.3", diff --git a/components/bpmn-q/public/index.html b/components/bpmn-q/public/index.html index 206d6868..b3b752f2 100644 --- a/components/bpmn-q/public/index.html +++ b/components/bpmn-q/public/index.html @@ -1,167 +1,181 @@ + + Workflow Modeler + -
- -
- - + + + + + + \ No newline at end of file diff --git a/components/bpmn-q/test/tests/dataflow/DataFlowWorkflows.js b/components/bpmn-q/test/tests/dataflow/DataFlowWorkflows.js index 67238daf..07cfc78e 100644 --- a/components/bpmn-q/test/tests/dataflow/DataFlowWorkflows.js +++ b/components/bpmn-q/test/tests/dataflow/DataFlowWorkflows.js @@ -27,7 +27,7 @@ export const MULTI_IO_WORKFLOW = ' ]+>[\s\S]*?<\/bpmndi:BPMNDiagram>/g, ''); + + expect(workflowWithoutDiagramElements).to.equal(UNTRANSFORMED_BPMN_WORKFLOW); }); it('Should transform all input and output data map objects', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(MULTI_IO_WORKFLOW); @@ -207,7 +210,7 @@ describe('Test the TransformationManager of the data flow extension.', function }); it('Should created documentation in transformed data map objects', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(DOCUMENTATION_WORKFLOW); @@ -246,7 +249,7 @@ describe('Test the TransformationManager of the data flow extension.', function }); it('Should not create a task for publishing global process variables', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(ONLY_LOCAL_VARS_WORKFLOW); @@ -265,7 +268,7 @@ describe('Test the TransformationManager of the data flow extension.', function }); it('Should create a task for process variables because a DataMapObject is used before its initialization', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(USED_BEFORE_INIT_WORKFLOW); @@ -294,7 +297,7 @@ describe('Test the TransformationManager of the data flow extension.', function }); it('Should create a task for process variables for each start event', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(MULTIPLE_START_EVENTS_WORKFLOW); @@ -336,7 +339,7 @@ describe('Test the TransformationManager of the data flow extension.', function }); it('Should create a task for process variables inside the subprocess', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(SUBPROCESS_WORKFLOW); @@ -379,7 +382,7 @@ describe('Test the TransformationManager of the data flow extension.', function }); it('Should transform split and merged DataMapObjects', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(SPLIT_MERGE_WORKFLOW); @@ -463,7 +466,7 @@ describe('Test the TransformationManager of the data flow extension.', function }); it('Should add TransformationAssociation expressions to the input', async function () { - setPluginConfig([{name: 'dataflow'}]); + setPluginConfig([{ name: 'dataflow' }]); const result = await startDataFlowReplacementProcess(INPUT_TRANSFORMATION_ASSOCIATION); diff --git a/components/bpmn-q/test/tests/editor/editor.spec.js b/components/bpmn-q/test/tests/editor/editor.spec.js index 395951a7..b243ce98 100644 --- a/components/bpmn-q/test/tests/editor/editor.spec.js +++ b/components/bpmn-q/test/tests/editor/editor.spec.js @@ -49,11 +49,11 @@ describe('Test editor functions', function () { }); afterEach('reset fileName', function () { - editorConfig.setFileName('quantum-workflow-model.bpmn'); + editorConfig.setFileName('quantum-workflow-model'); }); it('Should configure fileName', function () { - const newFileName = 'new-file.bpmn'; + const newFileName = 'new-file'; setPluginConfig([{name: 'editor', config: {fileName: newFileName}}]); const endpointConfig = editorConfig.getFileName(); @@ -70,7 +70,7 @@ describe('Test editor functions', function () { const endpointConfig = editorConfig.getFileName(); - expect(endpointConfig).to.equal('quantum-workflow-model.bpmn'); + expect(endpointConfig).to.equal('quantum-workflow-model'); }); it('Should use default camundaEndpoint if no pluginConfig is defined', function () { @@ -78,7 +78,7 @@ describe('Test editor functions', function () { const endpointConfig = editorConfig.getFileName(); - expect(endpointConfig).to.equal('quantum-workflow-model.bpmn'); + expect(endpointConfig).to.equal('quantum-workflow-model'); }); }); }); diff --git a/components/bpmn-q/test/tests/editor/plugin.spec.js b/components/bpmn-q/test/tests/editor/plugin.spec.js index adf87c37..271ea7c8 100644 --- a/components/bpmn-q/test/tests/editor/plugin.spec.js +++ b/components/bpmn-q/test/tests/editor/plugin.spec.js @@ -54,7 +54,7 @@ describe('Test plugins', function () { expect(extensions['planqk']).to.not.be.undefined; expect(transfButtons.length).to.equal(3); expect(buttons.length).to.equal(2); - expect(tabs.length).to.equal(8); + expect(tabs.length).to.equal(9); expect(styles.length).to.equal(3); }); }); diff --git a/components/bpmn-q/webpack.config.js b/components/bpmn-q/webpack.config.js index 20aee90c..85d9aaa8 100644 --- a/components/bpmn-q/webpack.config.js +++ b/components/bpmn-q/webpack.config.js @@ -1,6 +1,6 @@ const MiniCssExtractPlugin = require("mini-css-extract-plugin"); const path = require('path'); -const webpack = require('webpack') +const webpack = require('webpack'); module.exports = { entry: { @@ -29,6 +29,10 @@ module.exports = { "less-loader", ], }, + { + test: /\.bpmnlintrc$/i, + use: 'bpmnlint-loader', + }, { test: /\.jsx?$/, exclude: /node_modules/, @@ -61,27 +65,32 @@ module.exports = { AWS_RUNTIME_HANDLER_ENDPOINT: 'http://localhost:8890', CAMUNDA_ENDPOINT: 'http://localhost:8080/engine-rest', DATA_CONFIG: 'http://localhost:8100/data-objects', + GITHUB_TOKEN: '', + NISQ_ANALYZER_ENDPOINT: 'http://localhost:8098/nisq-analyzer', + OPENTOSCA_ENDPOINT: 'http://localhost:1337/csars', + PROVENANCE_COLLECTION: false, + DOWNLOAD_FILE_NAME: 'quantum-workflow-model', ENABLE_DATA_FLOW_PLUGIN: true, ENABLE_PLANQK_PLUGIN: true, ENABLE_QHANA_PLUGIN: true, ENABLE_QUANTME_PLUGIN: true, - GITHUB_TOKEN: '', - OPENTOSCA_ENDPOINT: 'http://localhost:1337/csars', - NISQ_ANALYZER_ENDPOINT: 'http://localhost:8098/nisq-analyzer', QISKIT_RUNTIME_HANDLER_ENDPOINT: 'http://localhost:8889', QHANA_GET_PLUGIN_URL: 'http://localhost:5006/api/plugins/', QHANA_LIST_PLUGINS_URL: 'http://localhost:5006/api/plugins/?item-count=100', QRM_USERNAME: '', - QRM_REPONAME: '', + QRM_REPONAME: '', QRM_REPOPATH: '', SERVICE_DATA_CONFIG: 'http://localhost:8000/service-task', SCRIPT_SPLITTER_ENDPOINT: 'http://localhost:8891', SCRIPT_SPLITTER_THRESHOLD: 5, TRANSFORMATION_FRAMEWORK_ENDPOINT: 'http://localhost:8888', - WINERY_ENDPOINT: 'http://localhost:8081/winery', - PROVENANCE_COLLECTION: false + UPLOAD_BRANCH_NAME: '', + UPLOAD_FILE_NAME: 'workflow', + UPLOAD_GITHUB_REPO: '', + UPLOAD_GITHUB_USER: '', + WINERY_ENDPOINT: 'http://localhost:8081/winery' }) ], mode: 'development', - devtool: 'source-map', + devtool: 'source-map' };