diff --git a/.bpmnlintrc b/.bpmnlintrc index da3899a..9bba09e 100644 --- a/.bpmnlintrc +++ b/.bpmnlintrc @@ -3,8 +3,8 @@ "plugin:custom/recommended" ], "rules": { - "custom/process-must-contain-tilt-meta": "off", - "custom/controller-must-be-completely-filled": "off", + "custom/process-must-contain-tilt-meta": "error", + "custom/controller-must-be-completely-filled": "error", "label-required": "off" } } \ No newline at end of file diff --git a/.github/workflows/build_and_release.yml b/.github/workflows/build_and_release.yml index 66d44f1..0f9362b 100644 --- a/.github/workflows/build_and_release.yml +++ b/.github/workflows/build_and_release.yml @@ -16,7 +16,7 @@ jobs: npm install npm run all sed -i "s/TILT Extension (Development Build)/TILT Extension ${{ github.ref_name }}/" ./index.js - zip tilt-release.zip -r ./dist ./client ./index.js ./README.md ./LICENSE.md ./example_process.bpmn + zip tilt-release.zip -r ./dist ./client ./menu ./index.js ./README.md ./LICENSE.md ./example_process.bpmn - name: Create Release id: create_release diff --git a/assets/controller.svg b/assets/controller.svg new file mode 100644 index 0000000..0ecc9ba --- /dev/null +++ b/assets/controller.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/datadisclosed.svg b/assets/datadisclosed.svg new file mode 100644 index 0000000..2c37ba7 --- /dev/null +++ b/assets/datadisclosed.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/flag.svg b/assets/flag.svg new file mode 100644 index 0000000..54c38c7 --- /dev/null +++ b/assets/flag.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/protection.svg b/assets/protection.svg new file mode 100644 index 0000000..53701a2 --- /dev/null +++ b/assets/protection.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/representative.svg b/assets/representative.svg new file mode 100644 index 0000000..2e566ed --- /dev/null +++ b/assets/representative.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/tilt.svg b/assets/tilt.svg new file mode 100644 index 0000000..9d5185b --- /dev/null +++ b/assets/tilt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/bpmnlint-plugin-custom/index.js b/bpmnlint-plugin-custom/index.js index cfa6ae2..4e04ada 100644 --- a/bpmnlint-plugin-custom/index.js +++ b/bpmnlint-plugin-custom/index.js @@ -2,7 +2,8 @@ module.exports = { configs: { recommended: { rules: { - 'process-must-contain-tilt-meta': 'off' + 'process-must-contain-tilt-meta': 'error', + 'third-country-transfers-are-disallowed':'warn' } } } diff --git a/bpmnlint-plugin-custom/rules/controller-must-be-completely-filled.js b/bpmnlint-plugin-custom/rules/controller-must-be-completely-filled.js index 5cba706..44a9bfc 100644 --- a/bpmnlint-plugin-custom/rules/controller-must-be-completely-filled.js +++ b/bpmnlint-plugin-custom/rules/controller-must-be-completely-filled.js @@ -15,7 +15,7 @@ module.exports = function() { if (is(node, 'bpmn:StartEvent')) { check_passed = test_if_properties_exists(node,tilt_type,propertiesToTest) if(!check_passed){ - reporter.report(node.id, "Must Contain all this and that..."); + reporter.report(node.id, "[ TILT ]\tMust Contain all this and that..."); } } } diff --git a/bpmnlint-plugin-custom/rules/process-must-contain-tilt-meta.js b/bpmnlint-plugin-custom/rules/process-must-contain-tilt-meta.js index 67b52d0..a841aaa 100644 --- a/bpmnlint-plugin-custom/rules/process-must-contain-tilt-meta.js +++ b/bpmnlint-plugin-custom/rules/process-must-contain-tilt-meta.js @@ -15,7 +15,7 @@ module.exports = function() { if (is(node, 'bpmn:Process')) { check_passed = test_if_properties_exists(node,tilt_type,propertiesToTest) if(!check_passed){ - reporter.report(node.id, "The business process needs to contain all required TILT meta fields."); + reporter.report(node.id, "[ TILT ]\tThe business process needs to contain all required TILT meta fields."); } } } diff --git a/bpmnlint-plugin-custom/rules/third-country-transfers-are-disallowed.js b/bpmnlint-plugin-custom/rules/third-country-transfers-are-disallowed.js new file mode 100644 index 0000000..150db06 --- /dev/null +++ b/bpmnlint-plugin-custom/rules/third-country-transfers-are-disallowed.js @@ -0,0 +1,22 @@ +const { test_if_is_tilt } = require("../tilt-rule-helper"); +const { + is + } = require('bpmnlint-utils'); + + +module.exports = function() { + function check(node, reporter) { + let check_passed = false; + if (is(node, 'bpmn:MessageFlow')) { + debugger; + check_passed = !test_if_is_tilt(node,"tilt:ThirdCountryTransfers") + if(!check_passed){ + reporter.report(node.id, "[ TILT ]\tThird country transfer detected!"); + } + } + } + + return { + check: check + }; +}; \ No newline at end of file diff --git a/bpmnlint-plugin-custom/tilt-rule-helper.js b/bpmnlint-plugin-custom/tilt-rule-helper.js index 87e5d6a..342010f 100644 --- a/bpmnlint-plugin-custom/tilt-rule-helper.js +++ b/bpmnlint-plugin-custom/tilt-rule-helper.js @@ -10,6 +10,17 @@ export function test_if_properties_exists(node, tilt_type, propertiesToTest){ }; return false; } + +export function test_if_is_tilt(node, tilt_type){ + if ("extensionElements" in node){ + for (let i = 0; i < node["extensionElements"]["values"].length; i++) { + if (node["extensionElements"]["values"][i].$type == tilt_type){ + return true; + } + } + }; + return false; +} export function test(){ return false; } \ No newline at end of file diff --git a/client/index.js b/client/index.js index 48056c1..e04b7b9 100644 --- a/client/index.js +++ b/client/index.js @@ -7,18 +7,19 @@ import tiltPropertiesExtensionModule from './tilt-properties'; import tiltModdleDescriptor from "./descriptors/tilt"; import ExtractButton from './tilt-extractor/extract-button'; +import tiltOverlayProvider from './tilt-overlay' -var tiltExtractor = require('./tilt-extractor/tilt-extractor'); +//var tiltExtractor = require('./tilt-extractor/tilt-extractor'); registerPlatformBpmnJSPlugin(tiltPropertiesExtensionModule); registerBpmnJSModdleExtension(tiltModdleDescriptor); - +registerPlatformBpmnJSPlugin(tiltOverlayProvider) //provide { config, resolver } as a `lintRules.${tabType}` plug-in registerClientPlugin({ config, resolver }, 'lintRules.cloud-bpmn'); registerClientPlugin({ config, resolver }, 'lintRules.bpmn'); -registerBpmnJSPlugin(tiltExtractor); +//registerBpmnJSPlugin(tiltExtractor); registerClientExtension(ExtractButton); \ No newline at end of file diff --git a/client/style/style.css b/client/style/style.css new file mode 100644 index 0000000..d308f4c --- /dev/null +++ b/client/style/style.css @@ -0,0 +1,15 @@ +.filter-green svg{ + filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(86deg) brightness(118%) contrast(119%); +} +.filter-error svg{ + filter: invert(34%) sepia(86%) saturate(2067%) hue-rotate(342deg) brightness(88%) contrast(99%); +} +.filter-ok svg{ + filter: invert(41%) sepia(55%) saturate(382%) hue-rotate(128deg) brightness(101%) contrast(85%); +} +.filter-warn svg{ + filter: invert(81%) sepia(9%) saturate(1984%) hue-rotate(1deg) brightness(94%) contrast(86%);; +} +.filter-tilt svg{ + filter: invert(21%) sepia(85%) saturate(5617%) hue-rotate(269deg) brightness(93%) contrast(91%); +} \ No newline at end of file diff --git a/client/tilt-extractor/extract-button.js b/client/tilt-extractor/extract-button.js index 37a42af..951daac 100644 --- a/client/tilt-extractor/extract-button.js +++ b/client/tilt-extractor/extract-button.js @@ -1,12 +1,13 @@ import React, { Fragment, PureComponent } from 'camunda-modeler-plugin-helpers/react'; import { Fill } from 'camunda-modeler-plugin-helpers/components'; +import tiltIcon from "../../assets/tilt.svg" const { getBusinessObject } = require('bpmn-js/lib/util/ModelUtil'); import { v4 as uuidv4 } from 'uuid'; import classNames from 'classnames'; import {getPropertyFromModdle } from '../tilt-properties/props/moddle-property-io'; import TILT from "../descriptors/tilt.json" -import { buildTiltDocument, cleanPropertyThroughSchema, filterObjectsWithTiltProperty, getBusinessObjects } from './extractor'; +import { buildTiltDocument } from './extractor'; export default class ExtractButton extends PureComponent { constructor() { @@ -40,7 +41,7 @@ export default class ExtractButton extends PureComponent { if(element.hasOwnProperty("$type") && element.$type.startsWith("tilt")){ tilt_properties.push(element); - console.log(element) + //console.log(element) return tilt_properties; } @@ -136,15 +137,15 @@ export default class ExtractButton extends PureComponent { render() { // we can use fills to hook React components into certain places of the UI return - + - ;onClick + ; } } diff --git a/client/tilt-extractor/extractor.js b/client/tilt-extractor/extractor.js index 839c880..39618c4 100644 --- a/client/tilt-extractor/extractor.js +++ b/client/tilt-extractor/extractor.js @@ -16,7 +16,7 @@ export function filterObjectsWithTiltProperty(businessObjects,tiltProperty){ extensionElements = businessObjects[bo].get("extensionElements"); if(extensionElements){ if(!extensionElements.hasOwnProperty("values")){ - console.log(extensionElements) + //console.log(extensionElements) continue; } tiltProperties.push(...extensionElements.values.filter(e => e.$type == tiltProperty)) @@ -85,7 +85,7 @@ export function getSchemaProperty(propertyName, tiltSchema = schema){ } } } - console.log(propertyName) + //console.log(propertyName) return {}; } diff --git a/client/tilt-extractor/tilt-extractor.js b/client/tilt-extractor/tilt-extractor.js index c70e69e..cd71112 100644 --- a/client/tilt-extractor/tilt-extractor.js +++ b/client/tilt-extractor/tilt-extractor.js @@ -16,8 +16,9 @@ function TiltExtractor(injector, eventBus, bpmnRules, editorActions, canvas, com editorActions.register({ extractTiltFromBpmn: function() { - let bo = getBusinessObject(canvas.getRootElement()) - self.extract(); + //let bo = getBusinessObject(canvas.getRootElement()) + //self.extract(); + debugger; } }); } diff --git a/client/tilt-overlay/index.js b/client/tilt-overlay/index.js new file mode 100644 index 0000000..bf9d6bf --- /dev/null +++ b/client/tilt-overlay/index.js @@ -0,0 +1,6 @@ +import TiltOverlayProvider from './overlay'; + +export default { + __init__: [ 'tiltOverlayProvider' ], + tiltOverlayProvider: [ 'type', TiltOverlayProvider ] +}; \ No newline at end of file diff --git a/client/tilt-overlay/overlay.js b/client/tilt-overlay/overlay.js new file mode 100644 index 0000000..af13be4 --- /dev/null +++ b/client/tilt-overlay/overlay.js @@ -0,0 +1,142 @@ +import tiltIcon from "../../assets/tilt.svg"; +import tiltControllerIcon from "../../assets/controller.svg"; +import tiltDataDisclosedIcon from "../../assets/datadisclosed.svg"; +import flagIcon from "../../assets/flag.svg"; +import tiltDataProtectionOfficerIcon from "../../assets/protection.svg"; +import tiltRepresentativeIcon from "../../assets/representative.svg" +import { getBusinessObject } from "bpmn-js/lib/util/ModelUtil"; + +const events = [ + 'commandStack.element.updateModdleProperties.postExecuted', + 'shape.added' +] +const toggleEvents = ['canvas.viewbox.changed'] + +function addTiltOverlays(overlays,e){ + const element = getElementFromEvent(e); + const bo = getBusinessObject(element); + const extensionElements = bo.get("extensionElements"); + + // Discover all existing Tilt Extensions + var arr = []; + if(extensionElements){ + for(let v in extensionElements.values){ + let t = extensionElements.values[v].$type; + if(t.startsWith("tilt")){ + if(!arr.includes(t)){ + arr.push(t) + } + } + } + } + + // Remove existing Overlays + const currentO = overlays.get({element: element.id}); + for(let o in currentO){ + debugger; + overlays.remove(currentO[o].id) + } + + // Add new Overlays + for(let a in arr){ + switch(arr[a]) { + case "tilt:Controller": + addOverlay(overlays,element.id,tiltControllerIcon); + break; + case "tilt:DataDisclosed": + addOverlay(overlays,element.id,tiltDataDisclosedIcon); + break; + case "tilt:DataProtectionOfficer": + addOverlay(overlays,element.id,tiltDataProtectionOfficerIcon); + break; + case "tilt:Representative": + addOverlay(overlays,element.id,tiltRepresentativeIcon); + break; + case "tilt:ThirdCountryTransfers": + //let deltaX = Math.abs(element.waypoints[0].x - element.waypoints[element.waypoints.length-1].x); + //let deltaY = Math.abs(element.waypoints[0].y - element.waypoints[element.waypoints.length-1].y); + + overlays.add(`${element.id}`, { + html: `
${flagIcon}
`, + position: { + top: 10,//deltaY/2, + left: 10//deltaX/2 + } + }); + break; + default: + addOverlay(overlays,element.id,tiltIcon) + break; + // code block + } + } + return {} +} + +function addOverlay(overlays,id,icon, c = "filter-tilt"){ + let g = overlays.get({element: id}) + overlays.add(`${id}`, { + html: `
${icon}
`, + position: { + left: -5+g.length * 24, + top: -30 + } + }); +} + +function getElementFromEvent(e){ + if(e.hasOwnProperty("context")){ + return e.context.element; + }else{ + return e.element; + } +} + +export default class TiltOverlayProvider { + constructor(injector,overlays,eventBus,editorActions) { + //this._injector = injector; + //this._overlays = overlays; + window.toggleTilt = true; + this.addEventListener(eventBus,events,overlays); + + //Whenever there is a viebox change we need to reactivate the toggle. + toggleEvents.forEach(function(event) { + eventBus.on(event, function(e) { + if(window.toggleTilt){ + overlays.show(); + }else{ + overlays.hide() + } + //console.log(event +": "+e) + }); + }); + + + editorActions.register({ + toggleTiltIcons: function() { + window.toggleTilt = !window.toggleTilt; + if(window.toggleTilt){ + overlays.show(); + }else{ + overlays.hide() + } + //console.log(window.toggleTilt) + } + }); + //editorActions.trigger("toggleTiltIcons") + } + addEventListener(eventBus,eventList,overlays){ + eventList.forEach(function(event) { + eventBus.on(event, function(e) { + addTiltOverlays(overlays,e); + }); + }); + } + } + + TiltOverlayProvider.$inject = [ + "injector", + "overlays", + "eventBus", + "editorActions" + ]; \ No newline at end of file diff --git a/client/tilt-properties/tilt-extension-provider.js b/client/tilt-properties/tilt-extension-provider.js index 67446c2..ab5c399 100644 --- a/client/tilt-properties/tilt-extension-provider.js +++ b/client/tilt-properties/tilt-extension-provider.js @@ -42,8 +42,9 @@ export default class TiltPropertiesExtensionProvider { }else if(is(element, 'bpmn:StartEvent')) { groups.push(createTiltPropertiesGroup(element,this._injector,[ + new PropertyBlueprint("tilt:Meta",{},null), new PropertyBlueprint("tilt:Controller",{representative:[]},null) - ],[1])); + ],[1,1])); }else if(is(element, 'bpmn:DataObjectReference')) { diff --git a/example_process.bpmn b/example_process.bpmn index 1244f8f..361aa2e 100644 --- a/example_process.bpmn +++ b/example_process.bpmn @@ -4,19 +4,21 @@ - + + + + + + - - - - - - - - - + + + + + + @@ -64,22 +66,9 @@ Flow_0rjt9y5 - - Flow_1qbbh85 - Flow_0bnihd8 - - Flow_0rjt9y5 - - - - - - - - Flow_05p3wo3 @@ -120,171 +109,183 @@ + + Flow_1qbbh85 + Flow_0bnihd8 + + + + + + + + + + Activity_0dftqvn - Event_0wfbdsl Event_1y5aqpw + Event_0wfbdsl Event_1isqgou - Flow_14n81na - Flow_0xqt8h6 + Flow_1u5a10i + Flow_1amjleb - - Flow_14n81na - - - Flow_0xqt8h6 + Flow_1amjleb Flow_1u5a10i + Flow_13v7ah5 + + Flow_14n81na + + - Flow_1u5a10i + Flow_13v7ah5 - - + + + - + - + - + - + - + - + - - - - + - + - + - + - + + + + - - + + - - + + - - + + - - - + + + - - + + - - + + - - + + - - + + - - - - + - + - - - - + - + + + + - + - - - - - - + + - - + + + + + + + + + + - - + + - - + + - - + + - - - - - - - - + + - - - - + + + + + + diff --git a/images/properties_panel_extension.png b/images/properties_panel_extension.png index d6c00cd..2108fa3 100644 Binary files a/images/properties_panel_extension.png and b/images/properties_panel_extension.png differ diff --git a/index.js b/index.js index 88cad77..2a90745 100644 --- a/index.js +++ b/index.js @@ -3,5 +3,6 @@ module.exports = { name: `TILT Extension (Development Build)`, script: './dist/client.js', - menu: './menu/menu.js' + menu: './menu/menu.js', + style: "./client/style/style.css" }; diff --git a/menu/menu.js b/menu/menu.js index 9fbf14b..3f97ee4 100644 --- a/menu/menu.js +++ b/menu/menu.js @@ -1,14 +1,25 @@ 'use strict'; module.exports = function(electronApp, menuState) { - return [{ - label: 'Generate TILT document', - accelerator: 'CommandOrControl+T', - enabled: function() { - return true; - }, - action: function() { - electronApp.emit('menu:action', 'extractTiltFromBpmn'); - } - }]; + return [ + //{ + // label: 'Generate TILT document', + // accelerator: 'CommandOrControl+T', + // enabled: function() { + // return true; + // }, + // action: function() { + // electronApp.emit('menu:action', 'extractTiltFromBpmn'); + // } + //}, + { + label: 'Toggle TILT icons', + accelerator: 'CommandOrControl+T', + enabled: function() { + return true; + }, + action: function() { + electronApp.emit('menu:action', 'toggleTiltIcons'); + } + }]; }; \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 7f22bc0..f3b7181 100644 --- a/package-lock.json +++ b/package-lock.json @@ -867,8 +867,7 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "bpmn-js": { "version": "11.1.1", @@ -1313,8 +1312,7 @@ "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "enhanced-resolve": { "version": "5.12.0", @@ -1480,8 +1478,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fastest-levenshtein": { "version": "1.0.16", @@ -2065,7 +2062,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", - "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -4136,6 +4132,48 @@ "safe-buffer": "^5.1.0" } }, + "raw-loader": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-4.0.2.tgz", + "integrity": "sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA==", + "requires": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "schema-utils": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", + "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "requires": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + } + } + }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", diff --git a/package.json b/package.json index 630596b..6016774 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "camunda-bpmn-js-behaviors": "^0.4.0", "diagram-js": "^11.4.3", "npm": "^9.3.0", + "raw-loader": "^4.0.2", "uuid": "^9.0.0" } } diff --git a/webpack.config.js b/webpack.config.js index ad433f4..7484025 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -14,6 +14,10 @@ module.exports = { { test: /\.bpmnlintrc$/i, use: 'bpmnlint-loader', + }, + { + test: /\.svg$/, + loader: 'raw-loader' } ] },