diff --git a/package-lock.json b/package-lock.json index 60aa8a2..b914254 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "dependencies": { "@bpmn-io/element-templates-validator": "^0.14.0", "@bpmn-io/extract-process-variables": "^0.8.0", + "bpmnlint": "^8.3.2", "classnames": "^2.3.1", "ids": "^1.0.0", "min-dash": "^4.0.0", @@ -26,7 +27,7 @@ "@bpmn-io/element-templates-icons-renderer": "^0.3.0", "@bpmn-io/properties-panel": "^2.2.0", "@bpmn-io/variable-resolver": "1.0.1", - "@camunda/linting": "^1.3.0", + "@camunda/linting": "^2.0.0", "@rollup/plugin-alias": "^5.0.0", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-commonjs": "^25.0.0", @@ -34,12 +35,13 @@ "@rollup/plugin-node-resolve": "^15.0.1", "@testing-library/preact": "^2.0.1", "@testing-library/preact-hooks": "^1.1.0", + "assert": "^2.0.0", "axe-core": "^4.4.2", "babel-loader": "^9.0.0", "babel-plugin-istanbul": "^6.1.1", "bpmn-js": "^13.0.0", "bpmn-js-create-append-anything": "^0.2.1", - "bpmn-js-properties-panel": "^1.26.0", + "bpmn-js-properties-panel": "^2.0.0", "bpmn-moddle": "^8.0.0", "camunda-bpmn-js-behaviors": "^0.6.0", "camunda-bpmn-moddle": "^7.0.1", @@ -78,7 +80,7 @@ "peerDependencies": { "@bpmn-io/properties-panel": ">= 2.2", "bpmn-js": ">= 11.5", - "bpmn-js-properties-panel": ">= 1", + "bpmn-js-properties-panel": ">= 2", "camunda-bpmn-js-behaviors": ">= 0.4", "diagram-js": ">= 11.9" } @@ -687,14 +689,14 @@ "integrity": "sha512-Hk0Fggw1fqsoeYXTC6/Ca5MyuseS3S2OAg6PGf9w7xcJf1RxJVHp20azAYhPK3bmgFXw/tBl/DMzZhyp+EDKtw==" }, "node_modules/@camunda/linting": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@camunda/linting/-/linting-1.3.0.tgz", - "integrity": "sha512-T8B2tTK1PhtTroQdOWx3tLIZ/1iv19+B0RrIG+vufiY7isxIOKrFXbNeseTUExLzC/KBmXB4ikfx9ucocuuPig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@camunda/linting/-/linting-2.0.0.tgz", + "integrity": "sha512-5HTpcuCbb52M9Jjv+ADqMmj7VqBuEtOKFh1VOlOaAdR3Q8FyKhMW/SnSTWRih6p6+mjb00+h5e/CWlwV0lNlCQ==", "dev": true, "dependencies": { "bpmn-moddle": "^8.0.0", "bpmnlint": "^8.0.0", - "bpmnlint-plugin-camunda-compat": "^1.3.1", + "bpmnlint-plugin-camunda-compat": "^1.3.2", "bpmnlint-utils": "^1.0.2", "min-dash": "^4.0.0", "min-dom": "^4.1.0", @@ -702,7 +704,7 @@ "zeebe-bpmn-moddle": "^0.18.0" }, "peerDependencies": { - "bpmn-js-properties-panel": ">= 1.10.0" + "bpmn-js-properties-panel": ">= 2.0.0" }, "peerDependenciesMeta": { "bpmn-js-properties-panel": { @@ -2163,6 +2165,18 @@ "get-intrinsic": "^1.1.3" } }, + "node_modules/assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "dependencies": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "node_modules/assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -2395,9 +2409,9 @@ } }, "node_modules/bpmn-js-properties-panel": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-1.26.0.tgz", - "integrity": "sha512-ureaMtsVtLD/ULezt+4gC9dCFKhQNg/w12qxoKT46JwL3f4FzmcCptZ/6zJrxit8bLV/tIMPAIOdcvanviWvrA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-2.0.0.tgz", + "integrity": "sha512-Son92BKzoLhRZ7BpP5pbVk/OAd+VtuOWLqt9+1rZA72oiRGy0t/N3coLaw3uLRdKg5331BG0Y40RltL8hcwfww==", "dev": true, "dependencies": { "@bpmn-io/element-templates-validator": "^0.14.0", @@ -2422,7 +2436,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-8.0.1.tgz", "integrity": "sha512-mwZcrWhi52+JH5Oq58WwKYcUxQ1ZMiDQuzt1bpqiqEEFFnQLqCgtLwEXQuDXFmAuQPdMAghyPzqdOZQqIQVesw==", - "dev": true, "dependencies": { "min-dash": "^4.0.0", "moddle": "^6.0.0", @@ -2430,18 +2443,17 @@ } }, "node_modules/bpmnlint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-8.2.0.tgz", - "integrity": "sha512-sBWAfQvDJ6SgVAI2HXii5vQSJ+gPjKvqGSknXOnt11xoy/df9mCXG0PfB46Fc+QkB6BWYijduKemQf/+xpgrPQ==", - "dev": true, + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-8.3.2.tgz", + "integrity": "sha512-2XlfwMd6jFrIJbNWr2TUQmmU4Au81HWzH37LXaU/OqShPAWMV9ygajFGzApt4Of6UwIbWvEtiSjHTXmeAX9sEA==", "dependencies": { - "@bpmn-io/moddle-utils": "^0.1.0", + "@bpmn-io/moddle-utils": "^0.2.0", "ansi-colors": "^4.1.3", - "bpmn-moddle": "^7.1.3", - "bpmnlint-utils": "^1.0.2", + "bpmn-moddle": "^8.0.1", + "bpmnlint-utils": "^1.1.1", "cli-table": "^0.3.11", "color-support": "^1.1.3", - "min-dash": "^3.8.1", + "min-dash": "^4.1.1", "mri": "^1.2.0", "pluralize": "^7.0.0", "tiny-glob": "^0.2.9" @@ -2454,9 +2466,9 @@ } }, "node_modules/bpmnlint-plugin-camunda-compat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/bpmnlint-plugin-camunda-compat/-/bpmnlint-plugin-camunda-compat-1.3.1.tgz", - "integrity": "sha512-nH+bmplVZ92d+26/GFKi4HQ1dD6xxjhRAwRGBMRuQc1hNtdsp/dv9MhShSyMCD1ZWays4d59dhNXHWorAy8aCg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/bpmnlint-plugin-camunda-compat/-/bpmnlint-plugin-camunda-compat-1.3.2.tgz", + "integrity": "sha512-ESszSXaaBgO5HCP7el8lCVSgsqNsfvTB0LWLPI6hjReCJyECg6rWKQRsOJPPsjBk7NC7EPnwoymgb/2ofk1pTw==", "dev": true, "dependencies": { "@bpmn-io/feel-lint": "^0.1.1", @@ -2474,57 +2486,26 @@ "dev": 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 + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bpmnlint-utils/-/bpmnlint-utils-1.1.1.tgz", + "integrity": "sha512-Afdb77FmwNB3INyUfbzXW40yY+mc0qYU3SgDFeI4zTtduiVomOlfqoXiEaUIGI8Hyh7aVYpmf3O97P2w7x0DYQ==" + }, + "node_modules/bpmnlint/node_modules/@bpmn-io/moddle-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@bpmn-io/moddle-utils/-/moddle-utils-0.2.0.tgz", + "integrity": "sha512-X6+z5QqI50YYer6dxnQ7YqU+e0mK5YzmFbiR5vycQdlXgOV8H4YtGglV0O0D7rMfV3LjouRe2BdrWEIvWrQgxg==", + "dependencies": { + "min-dash": "^4.1.1" + } }, "node_modules/bpmnlint/node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, "engines": { "node": ">=6" } }, - "node_modules/bpmnlint/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" - } - }, - "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": "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" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2833,7 +2814,6 @@ "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" }, @@ -2894,7 +2874,6 @@ "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" } @@ -2909,7 +2888,6 @@ "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" } @@ -3717,6 +3695,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4959,8 +4943,7 @@ "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 + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" }, "node_modules/globby": { "version": "13.1.4", @@ -4984,8 +4967,7 @@ "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 + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" }, "node_modules/gopd": { "version": "1.0.1", @@ -5315,6 +5297,22 @@ "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", "dev": true }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -5462,6 +5460,21 @@ "node": ">=8" } }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -5480,6 +5493,22 @@ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, + "node_modules/is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -6776,7 +6805,6 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/moddle/-/moddle-6.2.3.tgz", "integrity": "sha512-bLVN+ZHL3aKnhxc19XtjUfvdJsS3EsiEJC7bT6YPD11qYmTzvsxrGgyYz1Ouof7TZuGw0lDJ1OLmEnxcpQWk3Q==", - "dev": true, "dependencies": { "min-dash": "^4.0.0" } @@ -6785,7 +6813,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-10.1.0.tgz", "integrity": "sha512-erWckwLt+dYskewKXJso9u+aAZ5172lOiYxSOqKCPTy7L/xmqH1PoeoA7eVC7oJTt3PqF5TkZzUmbjGH6soQBg==", - "dev": true, "dependencies": { "min-dash": "^4.0.0", "moddle": "^6.0.0", @@ -6802,7 +6829,6 @@ "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" } @@ -7058,6 +7084,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -7486,7 +7528,6 @@ "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" } @@ -8255,8 +8296,7 @@ "node_modules/saxen": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/saxen/-/saxen-8.1.2.tgz", - "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==", - "dev": true + "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==" }, "node_modules/schema-utils": { "version": "4.0.1", @@ -8997,7 +9037,6 @@ "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" @@ -9254,6 +9293,19 @@ "punycode": "^2.1.0" } }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10191,14 +10243,14 @@ "integrity": "sha512-Hk0Fggw1fqsoeYXTC6/Ca5MyuseS3S2OAg6PGf9w7xcJf1RxJVHp20azAYhPK3bmgFXw/tBl/DMzZhyp+EDKtw==" }, "@camunda/linting": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@camunda/linting/-/linting-1.3.0.tgz", - "integrity": "sha512-T8B2tTK1PhtTroQdOWx3tLIZ/1iv19+B0RrIG+vufiY7isxIOKrFXbNeseTUExLzC/KBmXB4ikfx9ucocuuPig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@camunda/linting/-/linting-2.0.0.tgz", + "integrity": "sha512-5HTpcuCbb52M9Jjv+ADqMmj7VqBuEtOKFh1VOlOaAdR3Q8FyKhMW/SnSTWRih6p6+mjb00+h5e/CWlwV0lNlCQ==", "dev": true, "requires": { "bpmn-moddle": "^8.0.0", "bpmnlint": "^8.0.0", - "bpmnlint-plugin-camunda-compat": "^1.3.1", + "bpmnlint-plugin-camunda-compat": "^1.3.2", "bpmnlint-utils": "^1.0.2", "min-dash": "^4.0.0", "min-dom": "^4.1.0", @@ -11366,6 +11418,18 @@ "get-intrinsic": "^1.1.3" } }, + "assert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", + "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "dev": true, + "requires": { + "es6-object-assign": "^1.1.0", + "is-nan": "^1.2.1", + "object-is": "^1.0.1", + "util": "^0.12.0" + } + }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", @@ -11540,9 +11604,9 @@ } }, "bpmn-js-properties-panel": { - "version": "1.26.0", - "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-1.26.0.tgz", - "integrity": "sha512-ureaMtsVtLD/ULezt+4gC9dCFKhQNg/w12qxoKT46JwL3f4FzmcCptZ/6zJrxit8bLV/tIMPAIOdcvanviWvrA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-2.0.0.tgz", + "integrity": "sha512-Son92BKzoLhRZ7BpP5pbVk/OAd+VtuOWLqt9+1rZA72oiRGy0t/N3coLaw3uLRdKg5331BG0Y40RltL8hcwfww==", "dev": true, "requires": { "@bpmn-io/element-templates-validator": "^0.14.0", @@ -11561,7 +11625,6 @@ "version": "8.0.1", "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-8.0.1.tgz", "integrity": "sha512-mwZcrWhi52+JH5Oq58WwKYcUxQ1ZMiDQuzt1bpqiqEEFFnQLqCgtLwEXQuDXFmAuQPdMAghyPzqdOZQqIQVesw==", - "dev": true, "requires": { "min-dash": "^4.0.0", "moddle": "^6.0.0", @@ -11569,72 +11632,41 @@ } }, "bpmnlint": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-8.2.0.tgz", - "integrity": "sha512-sBWAfQvDJ6SgVAI2HXii5vQSJ+gPjKvqGSknXOnt11xoy/df9mCXG0PfB46Fc+QkB6BWYijduKemQf/+xpgrPQ==", - "dev": true, + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/bpmnlint/-/bpmnlint-8.3.2.tgz", + "integrity": "sha512-2XlfwMd6jFrIJbNWr2TUQmmU4Au81HWzH37LXaU/OqShPAWMV9ygajFGzApt4Of6UwIbWvEtiSjHTXmeAX9sEA==", "requires": { - "@bpmn-io/moddle-utils": "^0.1.0", + "@bpmn-io/moddle-utils": "^0.2.0", "ansi-colors": "^4.1.3", - "bpmn-moddle": "^7.1.3", - "bpmnlint-utils": "^1.0.2", + "bpmn-moddle": "^8.0.1", + "bpmnlint-utils": "^1.1.1", "cli-table": "^0.3.11", "color-support": "^1.1.3", - "min-dash": "^3.8.1", + "min-dash": "^4.1.1", "mri": "^1.2.0", "pluralize": "^7.0.0", "tiny-glob": "^0.2.9" }, "dependencies": { - "ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "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, + "@bpmn-io/moddle-utils": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@bpmn-io/moddle-utils/-/moddle-utils-0.2.0.tgz", + "integrity": "sha512-X6+z5QqI50YYer6dxnQ7YqU+e0mK5YzmFbiR5vycQdlXgOV8H4YtGglV0O0D7rMfV3LjouRe2BdrWEIvWrQgxg==", "requires": { - "min-dash": "^3.5.2", - "moddle": "^5.0.2", - "moddle-xml": "^9.0.6" + "min-dash": "^4.1.1" } }, - "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": "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" - } + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==" } } }, "bpmnlint-plugin-camunda-compat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/bpmnlint-plugin-camunda-compat/-/bpmnlint-plugin-camunda-compat-1.3.1.tgz", - "integrity": "sha512-nH+bmplVZ92d+26/GFKi4HQ1dD6xxjhRAwRGBMRuQc1hNtdsp/dv9MhShSyMCD1ZWays4d59dhNXHWorAy8aCg==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/bpmnlint-plugin-camunda-compat/-/bpmnlint-plugin-camunda-compat-1.3.2.tgz", + "integrity": "sha512-ESszSXaaBgO5HCP7el8lCVSgsqNsfvTB0LWLPI6hjReCJyECg6rWKQRsOJPPsjBk7NC7EPnwoymgb/2ofk1pTw==", "dev": true, "requires": { "@bpmn-io/feel-lint": "^0.1.1", @@ -11654,10 +11686,9 @@ } }, "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 + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bpmnlint-utils/-/bpmnlint-utils-1.1.1.tgz", + "integrity": "sha512-Afdb77FmwNB3INyUfbzXW40yY+mc0qYU3SgDFeI4zTtduiVomOlfqoXiEaUIGI8Hyh7aVYpmf3O97P2w7x0DYQ==" }, "brace-expansion": { "version": "1.1.11", @@ -11863,7 +11894,6 @@ "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" } @@ -11914,8 +11944,7 @@ "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 + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==" }, "colorette": { "version": "1.4.0", @@ -11926,8 +11955,7 @@ "colors": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", - "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", - "dev": true + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==" }, "commander": { "version": "2.20.3", @@ -12569,6 +12597,12 @@ "is-symbol": "^1.0.2" } }, + "es6-object-assign": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", + "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", + "dev": true + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -13513,8 +13547,7 @@ "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 + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==" }, "globby": { "version": "13.1.4", @@ -13532,8 +13565,7 @@ "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 + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==" }, "gopd": { "version": "1.0.1", @@ -13778,6 +13810,16 @@ "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", "dev": true }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, "is-array-buffer": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", @@ -13874,6 +13916,15 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -13889,6 +13940,16 @@ "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==", "dev": true }, + "is-nan": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", + "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, "is-negative-zero": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", @@ -14884,7 +14945,6 @@ "version": "6.2.3", "resolved": "https://registry.npmjs.org/moddle/-/moddle-6.2.3.tgz", "integrity": "sha512-bLVN+ZHL3aKnhxc19XtjUfvdJsS3EsiEJC7bT6YPD11qYmTzvsxrGgyYz1Ouof7TZuGw0lDJ1OLmEnxcpQWk3Q==", - "dev": true, "requires": { "min-dash": "^4.0.0" } @@ -14893,7 +14953,6 @@ "version": "10.1.0", "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-10.1.0.tgz", "integrity": "sha512-erWckwLt+dYskewKXJso9u+aAZ5172lOiYxSOqKCPTy7L/xmqH1PoeoA7eVC7oJTt3PqF5TkZzUmbjGH6soQBg==", - "dev": true, "requires": { "min-dash": "^4.0.0", "moddle": "^6.0.0", @@ -14909,8 +14968,7 @@ "mri": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" }, "ms": { "version": "2.1.2", @@ -15108,6 +15166,16 @@ "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "dev": true }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", @@ -15423,8 +15491,7 @@ "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 + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" }, "preact": { "version": "10.15.1", @@ -15992,8 +16059,7 @@ "saxen": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/saxen/-/saxen-8.1.2.tgz", - "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==", - "dev": true + "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==" }, "schema-utils": { "version": "4.0.1", @@ -16553,7 +16619,6 @@ "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" @@ -16737,6 +16802,19 @@ "punycode": "^2.1.0" } }, + "util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 7be5cb6..9bff301 100644 --- a/package.json +++ b/package.json @@ -47,6 +47,7 @@ "dependencies": { "@bpmn-io/element-templates-validator": "^0.14.0", "@bpmn-io/extract-process-variables": "^0.8.0", + "bpmnlint": "^8.3.2", "classnames": "^2.3.1", "ids": "^1.0.0", "min-dash": "^4.0.0", @@ -62,7 +63,7 @@ "@bpmn-io/element-templates-icons-renderer": "^0.3.0", "@bpmn-io/properties-panel": "^2.2.0", "@bpmn-io/variable-resolver": "1.0.1", - "@camunda/linting": "^1.3.0", + "@camunda/linting": "^2.0.0", "@rollup/plugin-alias": "^5.0.0", "@rollup/plugin-babel": "^6.0.3", "@rollup/plugin-commonjs": "^25.0.0", @@ -70,12 +71,13 @@ "@rollup/plugin-node-resolve": "^15.0.1", "@testing-library/preact": "^2.0.1", "@testing-library/preact-hooks": "^1.1.0", + "assert": "^2.0.0", "axe-core": "^4.4.2", "babel-loader": "^9.0.0", "babel-plugin-istanbul": "^6.1.1", "bpmn-js": "^13.0.0", "bpmn-js-create-append-anything": "^0.2.1", - "bpmn-js-properties-panel": "^1.26.0", + "bpmn-js-properties-panel": "^2.0.0", "bpmn-moddle": "^8.0.0", "camunda-bpmn-js-behaviors": "^0.6.0", "camunda-bpmn-moddle": "^7.0.1", @@ -113,8 +115,8 @@ }, "peerDependencies": { "@bpmn-io/properties-panel": ">= 2.2", - "bpmn-js-properties-panel": ">= 1", "bpmn-js": ">= 11.5", + "bpmn-js-properties-panel": ">= 2", "camunda-bpmn-js-behaviors": ">= 0.4", "diagram-js": ">= 11.9" } diff --git a/src/cloud-element-templates/LinterPlugin.js b/src/cloud-element-templates/LinterPlugin.js new file mode 100644 index 0000000..7fdfff2 --- /dev/null +++ b/src/cloud-element-templates/LinterPlugin.js @@ -0,0 +1,116 @@ +/** + * Copyright Camunda Services GmbH and/or licensed to Camunda Services GmbH + * under one or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information regarding copyright + * ownership. + * + * Camunda licenses this file to you under the MIT; you may not use this file + * except in compliance with the MIT License. + */ + +import StaticResolver from 'bpmnlint/lib/resolver/static-resolver'; +import ElementTemplates from './ElementTemplates'; +import { getPropertyValue, validateProperty } from './util/propertyUtil'; + +import { applyConditions } from './Condition'; + +import BpmnModdle from 'bpmn-moddle'; +import zeebeModdle from 'zeebe-bpmn-moddle/resources/zeebe'; + +import { Validator } from './Validator'; + +export const elementTemplateLintRule = ({ templates = [] }) => { + const moddle = new BpmnModdle({ zeebe: zeebeModdle }); + + const validator = new Validator(moddle).addAll(templates); + const validTemplates = validator.getValidTemplates(); + + // We use the ElementTemplates Module without the required bpmn-js modules + // As we only use it to facilitate template ID and version lookup, + // access to commandstack etc. is not required + const elementTemplates = new ElementTemplates(); + elementTemplates.set(validTemplates); + + function check(node, reporter) { + + let template = elementTemplates.get(node); + + const templateId = elementTemplates._getTemplateId(node); + + // Handle missing template + if (templateId && !template) { + reporter.report( + node.id, + 'Linked element template not found', + { + name: node.name + } + ); + return; + } + + if (!template) { + return; + } + + template = applyConditions(node, template); + + // Check attributes + template.properties.forEach((property) => { + const value = getPropertyValue(node, property); + const error = validateProperty(value, property); + + if (!error) { + return; + } + + reporter.report( + node.id, + error, + { + propertiesPanel: { + entryIds: [ getEntryId(property, template) ] + }, + name: node.name + } + ); + }); + } + + return { + check + }; + +}; + + +export const ElementTemplateLinterPlugin = function(templates) { + return { + config: { + rules: { + 'element-templates/validate': [ 'error', { templates } ] + } + }, + resolver: new StaticResolver({ + 'rule:bpmnlint-plugin-element-templates/validate': elementTemplateLintRule + }) + }; +}; + + +// helpers ////////////////////// + +function getEntryId(property, template) { + const index = template.properties + .filter(p => p.group === property.group) + .indexOf(property); + + const path = [ 'custom-entry', template.id ]; + + if (property.group) { + path.push(property.group); + } + + path.push(index); + return path.join('-'); +} \ No newline at end of file diff --git a/src/cloud-element-templates/properties/CustomProperties.js b/src/cloud-element-templates/properties/CustomProperties.js index f99d491..85c7c43 100644 --- a/src/cloud-element-templates/properties/CustomProperties.js +++ b/src/cloud-element-templates/properties/CustomProperties.js @@ -1,15 +1,14 @@ import { find, forEach, - groupBy, - isString + groupBy } from 'min-dash'; import { useService } from 'bpmn-js-properties-panel'; import { PropertyDescription } from '../../element-templates/components/PropertyDescription'; -import { getPropertyValue, setPropertyValue } from '../util/propertyUtil'; +import { getPropertyValue, setPropertyValue, validateProperty } from '../util/propertyUtil'; import { Group, @@ -426,61 +425,16 @@ function propertyGetter(element, property) { } function propertySetter(bpmnFactory, commandStack, element, property) { - return function getValue(value) { + return function setValue(value) { return setPropertyValue(bpmnFactory, commandStack, element, property, value); }; } function propertyValidator(translate, property) { - return function validate(value) { - const { constraints = {} } = property; - - const { - maxLength, - minLength, - notEmpty - } = constraints; - - if (notEmpty && isEmpty(value)) { - return translate('Must not be empty.'); - } - - if (maxLength && (value || '').length > maxLength) { - return translate('Must have max length {maxLength}.', { maxLength }); - } - - if (minLength && (value || '').length < minLength) { - return translate('Must have min length {minLength}.', { minLength }); - } - - let { pattern } = constraints; - - if (pattern) { - let message; - - if (!isString(pattern)) { - message = pattern.message; - pattern = pattern.value; - } - - if (!matchesPattern(value, pattern)) { - return message || translate('Must match pattern {pattern}.', { pattern }); - } - } - }; + return value => validateProperty(value, property, translate); } -function isEmpty(value) { - if (typeof value === 'string') { - return !value.trim().length; - } - - return value === undefined; -} -function matchesPattern(string, pattern) { - return new RegExp(pattern).test(string); -} function groupByGroupId(properties) { return groupBy(properties, 'group'); diff --git a/src/cloud-element-templates/util/propertyUtil.js b/src/cloud-element-templates/util/propertyUtil.js index 781ab52..dbace20 100644 --- a/src/cloud-element-templates/util/propertyUtil.js +++ b/src/cloud-element-templates/util/propertyUtil.js @@ -4,6 +4,11 @@ import { } from 'bpmn-js/lib/util/ModelUtil'; import { + default as defaultTranslate +} from 'diagram-js/lib/i18n/translate/translate'; + +import { + isString, isUndefined, without } from 'min-dash'; @@ -755,6 +760,49 @@ export function unsetProperty(commandStack, element, property) { } } +export function validateProperty(value, property, translate = defaultTranslate) { + const { + constraints = {}, + label + } = property; + + const { + maxLength, + minLength, + notEmpty + } = constraints; + + if (notEmpty && isEmpty(value)) { + return `${label} ${translate('must not be empty.')}`; + } + + if (maxLength && (value || '').length > maxLength) { + return `${label} ${translate('must have max length {maxLength}.', { maxLength })}`; + } + + if (minLength && (value || '').length < minLength) { + return `${label} ${translate('must have min length {minLength}.', { minLength })}`; + } + + let { pattern } = constraints; + + if (pattern) { + let message; + + if (!isString(pattern)) { + message = pattern.message; + pattern = pattern.value; + } + + if (!matchesPattern(value, pattern)) { + if (message) { + return `${label} ${translate(message)}`; + } + + return `${label} ${translate('must match pattern {pattern}.', { pattern })}`; + } + } +} // helpers function unknownBindingError(element, property) { @@ -768,3 +816,15 @@ function unknownBindingError(element, property) { return new Error(`unknown binding <${ type }> for element <${ id }>, this should never happen`); } + +function isEmpty(value) { + if (typeof value === 'string') { + return !value.trim().length; + } + + return value === undefined; +} + +function matchesPattern(string, pattern) { + return new RegExp(pattern).test(string); +} diff --git a/src/index.js b/src/index.js index 97baa3e..346bdb9 100644 --- a/src/index.js +++ b/src/index.js @@ -3,3 +3,4 @@ export { default as ElementTemplatesPropertiesProviderModule } from './element-t // utils export { Validator as CloudElementTemplatesValidator } from './cloud-element-templates/Validator'; +export { ElementTemplateLinterPlugin as CloudElementTemplatesLinterPlugin } from './cloud-element-templates/LinterPlugin'; diff --git a/test/TestHelper.js b/test/TestHelper.js index 4981b3a..bd2a5a0 100644 --- a/test/TestHelper.js +++ b/test/TestHelper.js @@ -22,6 +22,9 @@ import Modeler from 'bpmn-js/lib/Modeler'; import axe from 'axe-core'; +import BPMNModdle from 'bpmn-moddle'; +import zeebeModdle from 'zeebe-bpmn-moddle/resources/zeebe'; + /** * https://www.deque.com/axe/core-documentation/api-documentation/#axe-core-tags */ @@ -255,4 +258,56 @@ document.addEventListener('keydown', function(event) { bpmnJS.saveXML({ format: true }).then(function(result) { download(result.xml, 'test.bpmn', 'application/xml'); }); -}); \ No newline at end of file +}); + +// Moddle helpers ////////////////////// +export async function createModdle(xml) { + const moddle = new BPMNModdle({ + zeebe: zeebeModdle + }); + + let root, warnings; + + try { + ({ + rootElement: root, + warnings = [] + } = await moddle.fromXML(xml, 'bpmn:Definitions', { lax: true })); + } catch (err) { + console.log(err); + } + + return { + root, + moddle, + context: { + warnings + }, + warnings + }; +} + +export function createDefinitions(xml = '') { + return ` + + ${ xml } + + `; +} + + +export function createProcess(bpmn = '', bpmndi = '') { + return createDefinitions(` + + ${ bpmn } + + ${ bpmndi } + `); +} \ No newline at end of file diff --git a/test/spec/Example.spec.js b/test/spec/Example.spec.js new file mode 100644 index 0000000..9abcc95 --- /dev/null +++ b/test/spec/Example.spec.js @@ -0,0 +1,307 @@ +import TestContainer from 'mocha-test-container-support'; + +import { + cleanup +} from '@testing-library/preact/pure'; + +import { domify } from 'min-dom'; + +import { + clearBpmnJS, + setBpmnJS, + insertCoreStyles, + insertBpmnStyles, + insertCSS, + enableLogging +} from 'test/TestHelper'; + +import Modeler from 'bpmn-js/lib/Modeler'; + +import { + BpmnPropertiesPanelModule, + BpmnPropertiesProviderModule, + ZeebePropertiesProviderModule, + ElementTemplatesPropertiesProviderModule +} from 'bpmn-js-properties-panel'; + +import LintingModule from '@camunda/linting/modeler'; +import { Linter } from '@camunda/linting'; + +import ElementTemplateChooserModule from '@bpmn-io/element-template-chooser'; +import ElementTemplatesIconsRenderer from '@bpmn-io/element-templates-icons-renderer'; + +import CamundaBehaviorsModule from 'camunda-bpmn-js-behaviors/lib/camunda-platform'; +import ZeebeBehaviorsModule from 'camunda-bpmn-js-behaviors/lib/camunda-cloud'; + +import CamundaModdle from 'camunda-bpmn-moddle/resources/camunda'; + +import ZeebeModdle from 'zeebe-bpmn-moddle/resources/zeebe'; + +import CloudElementTemplatesPropertiesProviderModule from 'src/cloud-element-templates'; + +import { ElementTemplateLinterPlugin } from 'src/cloud-element-templates/LinterPlugin'; + +const singleStart = window.__env__ && window.__env__.SINGLE_START; + +insertCoreStyles(); +insertBpmnStyles(); +insertCSS('bottom-panel.css', ` + .test-container { + display: flex; + flex-direction: column; + } + + .properties-panel-container { + position: absolute; + top: 0; + right: 0; + width: 250px; + height: 100%; + border-left: solid 1px #ccc; + background-color: #f7f7f8; + } + + .panel { + position: absolute; + bottom: 0; + left: 0; + width: calc(100% - 250px - 1px); + height: 200px; + display: flex; + flex-direction: column; + background-color: #f7f7f8; + padding: 5px; + box-sizing: border-box; + border-top: solid 1px #ccc; + font-family: sans-serif; + } + + .panel .errors { + resize: none; + flex-grow: 1; + background-color: #f7f7f8; + border: none; + margin-bottom: 5px; + font-family: sans-serif; + line-height: 1.5; + outline: none; + overflow-y: scroll; + } + + .panel button, + .panel input { + width: 200px; + } +`); + +describe('', function() { + + let modelerContainer; + + let propertiesContainer; + + afterEach(() => cleanup()); + + let container; + + beforeEach(function() { + modelerContainer = document.createElement('div'); + modelerContainer.classList.add('modeler-container'); + + container = TestContainer.get(this); + container.appendChild(modelerContainer); + }); + + async function createModeler(xml, options = { }, BpmnJS = Modeler) { + const { + shouldImport = true, + additionalModules = [ + ZeebeBehaviorsModule, + BpmnPropertiesPanelModule, + BpmnPropertiesProviderModule, + ZeebePropertiesProviderModule, + LintingModule + ], + moddleExtensions = { + zeebe: ZeebeModdle + }, + propertiesPanel = {}, + description = {}, + layout = {}, + } = options; + + clearBpmnJS(); + + const modeler = new BpmnJS({ + container: modelerContainer, + keyboard: { + bindTo: document + }, + additionalModules, + moddleExtensions, + propertiesPanel: { + parent: propertiesContainer, + feelTooltipContainer: container, + description, + layout, + ...propertiesPanel + }, + ...options + }); + + enableLogging && enableLogging(modeler, !!singleStart); + + setBpmnJS(modeler); + + if (!shouldImport) { + return { modeler }; + } + + try { + const result = await modeler.importXML(xml); + + return { error: null, warnings: result.warnings, modeler: modeler }; + } catch (err) { + return { error: err, warnings: err.warnings, modeler: modeler }; + } + } + + + (singleStart === 'cloud-templates' ? it.only : it)('should import simple process (cloud-templates)', async function() { + + // given + const diagramXml = require('test/spec/cloud-element-templates/fixtures/complex.bpmn').default; + + const elementTemplateContext = require.context('test/spec/cloud-element-templates/fixtures', false, /\.json$/); + + const elementTemplates = elementTemplateContext.keys().map(key => elementTemplateContext(key)).flat(); + + // when + const result = await createModeler( + diagramXml, + { + additionalModules: [ + ZeebeBehaviorsModule, + BpmnPropertiesPanelModule, + BpmnPropertiesProviderModule, + CloudElementTemplatesPropertiesProviderModule, + ElementTemplateChooserModule, + ElementTemplatesIconsRenderer, + LintingModule + ], + moddleExtensions: { + zeebe: ZeebeModdle + }, + propertiesPanel: { + parent: null + }, + elementTemplates, + linting: { + active: true + } + } + ); + + const modeler = result.modeler; + + const linter = new Linter({ + plugins: [ + ElementTemplateLinterPlugin(elementTemplates) + ] + + }); + + const linting = modeler.get('linting'); + const bpmnjs = modeler.get('bpmnjs'); + const eventBus = modeler.get('eventBus'); + + const lint = () => { + const definitions = bpmnjs.getDefinitions(); + + linter.lint(definitions).then(reports => { + linting.setErrors(reports); + + const errorContainer = panel.querySelector('.errors'); + errorContainer.innerHTML = ''; + + reports.forEach((report) => { + let { id, message, node, data } = report; + node = node || (data && data.node); + const name = node && node.name; + + const errorMessage = `${ name || id }: ${ message }`; + const item = domify(`
${escapeHtml(errorMessage)}
`); + item.addEventListener('click', () => { + linting.showError(report); + }); + + errorContainer.appendChild(item); + }); + }); + }; + + lint(); + + eventBus.on('elements.changed', lint); + linting.activate(); + + const propertiesPanelParent = domify('
'); + + bpmnjs._container.appendChild(propertiesPanelParent); + + modeler.get('propertiesPanel').attachTo(propertiesPanelParent); + + const panel = domify(` +
+
+
+ + + +
+
+ `); + + bpmnjs._container.appendChild(panel); + + + // then + expect(result.error).not.to.exist; + }); + + (singleStart === 'templates' ? it.only : it)('should import simple process (templates)', async function() { + + // given + const diagramXml = require('test/spec/element-templates/fixtures/complex.bpmn').default; + + const elementTemplateContext = require.context('test/spec/element-templates/fixtures', false, /\.json$/); + + const elementTemplates = elementTemplateContext.keys().map(key => elementTemplateContext(key)).flat(); + + // when + const result = await createModeler( + diagramXml, + { + additionalModules: [ + CamundaBehaviorsModule, + BpmnPropertiesPanelModule, + BpmnPropertiesProviderModule, + ElementTemplateChooserModule, + ElementTemplatesPropertiesProviderModule + ], + moddleExtensions: { + camunda: CamundaModdle + }, + elementTemplates + } + ); + + // then + expect(result.error).not.to.exist; + }); +}); + + +const escapeHtml = (unsafe) => { + return unsafe.replaceAll('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"').replaceAll("'", '''); +}; diff --git a/test/spec/cloud-element-templates/LinterPlugin.spec.js b/test/spec/cloud-element-templates/LinterPlugin.spec.js new file mode 100644 index 0000000..83ce1e9 --- /dev/null +++ b/test/spec/cloud-element-templates/LinterPlugin.spec.js @@ -0,0 +1,142 @@ +import RuleTester from 'bpmnlint/lib/testers/rule-tester'; + +import { elementTemplateLintRule } from 'src/cloud-element-templates/LinterPlugin.js'; + +import { + createModdle, + createProcess +} from '../../TestHelper'; + +import templates from './fixtures/constraints.json'; + +const valid = [ + { + name: 'Valid Template', + moddleElement: createModdle(createProcess('')), + config: { + templates + } + }, + { + name: 'Conditional Template - property hidden', + moddleElement: createModdle(createProcess('')), + config: { + templates + } + }, + { + name: 'No Template', + moddleElement: createModdle(createProcess('')), + config: { + templates + } + } +]; + + +const invalid = [ + { + name: 'Template Not Found', + moddleElement: createModdle(createProcess('')), + config: { + templates + }, + report: { + id: 'Task_1', + message: 'Linked element template not found' + } + }, + { + name: 'Min Length', + moddleElement: createModdle(createProcess('')), + config: { + templates + }, + report: { + id: 'Task_1', + message: 'Test Property must have min length 5.', + propertiesPanel: { entryIds: [ 'custom-entry-constraints.minLength-0' ] }, + name: 'a' + } + }, + { + name: 'Max Length', + moddleElement: createModdle(createProcess('')), + config: { + templates + }, + report: { + id: 'Task_1', + message: 'Test Property must have max length 5.', + propertiesPanel: { entryIds: [ 'custom-entry-constraints.maxLength-0' ] }, + name: 'Very Long Name' + } + }, + { + name: 'Not Empty', + moddleElement: createModdle(createProcess('')), + config: { + templates + }, + report: { + id: 'Task_1', + message: 'Test Property must not be empty.', + propertiesPanel: { entryIds: [ 'custom-entry-constraints.notEmpty-0' ] } + } + }, + { + name: 'Pattern', + moddleElement: createModdle(createProcess('')), + config: { + templates + }, + report: { + id: 'Task_1', + message: 'Test Property must match pattern A+B.', + propertiesPanel: { entryIds: [ 'custom-entry-constraints.pattern-0' ] } + } + }, + { + name: 'Pattern (custom message)', + moddleElement: createModdle(createProcess('')), + config: { + templates + }, + report: { + id: 'Task_1', + message: 'Test Property This is a custom message', + propertiesPanel: { entryIds: [ 'custom-entry-constraints.pattern-custom-message-0' ] } + } + }, + { + name: 'Conditional Template - property shown', + moddleElement: createModdle(createProcess('')), + config: { + templates + }, + report: { + id: 'Task_1', + message: 'Test Property must match pattern A+B.', + propertiesPanel: { entryIds: [ 'custom-entry-constraints.conditional-1' ] }, + name: 'foo' + } + } +]; + + +describe('element-templates Linting', function() { + + before(function() { + + // 'assert' needs the process variable to be defined + if (!global.process) { + global.process = {}; + } + }); + + RuleTester.verify('element-templates', elementTemplateLintRule, { + valid, + invalid + }); + +}); \ No newline at end of file diff --git a/test/spec/cloud-element-templates/fixtures/constraints.json b/test/spec/cloud-element-templates/fixtures/constraints.json new file mode 100644 index 0000000..84fc6d0 --- /dev/null +++ b/test/spec/cloud-element-templates/fixtures/constraints.json @@ -0,0 +1,154 @@ +[ + { + "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", + "name": "empty", + "id": "constraints.empty", + "appliesTo": [ + "bpmn:Task" + ], + "properties": [] + }, + { + "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", + "name": "Constraints - Min Length", + "id": "constraints.minLength", + "appliesTo": [ + "bpmn:Task" + ], + "properties": [ + { + "label": "Test Property", + "type": "String", + "binding": { + "type": "property", + "name": "name" + }, + "constraints": { + "minLength": 5 + } + } + ] + }, + { + "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", + "name": "Constraints - Max Length", + "id": "constraints.maxLength", + "appliesTo": [ + "bpmn:Task" + ], + "properties": [ + { + "label": "Test Property", + "type": "String", + "binding": { + "type": "property", + "name": "name" + }, + "constraints": { + "maxLength": 5 + } + } + ] + }, + { + "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", + "name": "Constraints - not Empty", + "id": "constraints.notEmpty", + "appliesTo": [ + "bpmn:Task" + ], + "properties": [ + { + "label": "Test Property", + "type": "String", + "binding": { + "type": "property", + "name": "name" + }, + "constraints": { + "notEmpty": true + } + } + ] + }, + { + "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", + "name": "Constraints - Pattern", + "id": "constraints.pattern", + "appliesTo": [ + "bpmn:Task" + ], + "properties": [ + { + "label": "Test Property", + "type": "String", + "binding": { + "type": "property", + "name": "name" + }, + "constraints": { + "pattern": "A+B" + } + } + ] + }, + { + "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", + "name": "Constraints - Pattern (custom message)", + "id": "constraints.pattern-custom-message", + "appliesTo": [ + "bpmn:Task" + ], + "properties": [ + { + "label": "Test Property", + "type": "String", + "binding": { + "type": "property", + "name": "name" + }, + "constraints": { + "pattern": { + "value": "A+B", + "message": "This is a custom message" + } + } + } + ] + }, + { + "$schema": "https://unpkg.com/@camunda/zeebe-element-templates-json-schema/resources/schema.json", + "name": "Constraints - Conditional", + "id": "constraints.conditional", + "appliesTo": [ + "bpmn:Task" + ], + "properties": [ + { + "id": "nameProperty", + "type": "Hidden", + "binding": { + "type": "property", + "name": "name" + } + }, + { + "label": "Test Property", + "type": "String", + "binding": { + "type": "property", + "name": "name" + }, + "constraints": { + "pattern": { + "value": "A+B" + } + }, + "condition": { + "property": "nameProperty", + "equals": "foo" + } + } + ] + } +] \ No newline at end of file diff --git a/test/spec/cloud-element-templates/fixtures/update-template-properties-order.json b/test/spec/cloud-element-templates/fixtures/update-template-properties-order.json index 3a65432..9294135 100644 --- a/test/spec/cloud-element-templates/fixtures/update-template-properties-order.json +++ b/test/spec/cloud-element-templates/fixtures/update-template-properties-order.json @@ -24,7 +24,7 @@ "key": "header-1-key" }, "condition": { - "equals": "update template properties order", + "equals": "update template properties order", "property": "name" } }, diff --git a/test/spec/cloud-element-templates/properties/CustomProperties.json b/test/spec/cloud-element-templates/properties/CustomProperties.json index f7a6114..0417f15 100644 --- a/test/spec/cloud-element-templates/properties/CustomProperties.json +++ b/test/spec/cloud-element-templates/properties/CustomProperties.json @@ -203,7 +203,7 @@ ], "properties": [ { - "label": "NotEmpty", + "label": "String - NotEmpty", "description": "Must not be empty", "type": "String", "group": "input", @@ -216,7 +216,7 @@ } }, { - "label": "MinLength", + "label": "String - MinLength", "description": "Must have min length 5", "type": "String", "group": "input", @@ -229,7 +229,7 @@ } }, { - "label": "MaxLength", + "label": "String - MaxLength", "description": "Must have max length 5", "type": "String", "group": "input", @@ -242,7 +242,7 @@ } }, { - "label": "Pattern (String)", + "label": "String - Pattern (String)", "description": "Must match /A+B/", "type": "String", "group": "input", @@ -255,7 +255,7 @@ } }, { - "label": "Pattern (String + Message)", + "label": "String - Pattern (String + Message)", "description": "Must be https url", "type": "String", "group": "input", @@ -271,7 +271,7 @@ } }, { - "label": "Pattern (Integer)", + "label": "String - Pattern (Integer)", "description": "Must be integer", "type": "String", "group": "input", diff --git a/test/spec/cloud-element-templates/properties/CustomProperties.spec.js b/test/spec/cloud-element-templates/properties/CustomProperties.spec.js index 9c5a2cf..563f82c 100644 --- a/test/spec/cloud-element-templates/properties/CustomProperties.spec.js +++ b/test/spec/cloud-element-templates/properties/CustomProperties.spec.js @@ -1237,7 +1237,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { [ [ 'String', 'input' ], [ 'Select', 'select' ], - [ 'Textarea', 'textarea' ] + [ 'TextArea', 'textarea' ] ].forEach(function([ name, selector ]) { describe(name, function() { @@ -1251,7 +1251,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { input = domQuery(selector, entry); // assume - expectError(entry, 'Must not be empty.'); + expectError(entry, `${name} - NotEmpty must not be empty.`); // when changeInput(input, 'FOO'); @@ -1270,7 +1270,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { input = domQuery(selector, entry); // assume - expectError(entry, 'Must have min length 5.'); + expectError(entry, `${name} - MinLength must have min length 5.`); // when changeInput(input, 'FOOOOOOO'); @@ -1295,7 +1295,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { changeInput(input, 'FOOOOOOO'); // then - expectError(entry, 'Must have max length 5.'); + expectError(entry, `${name} - MaxLength must have max length 5.`); }); @@ -1308,7 +1308,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { input = domQuery(selector, entry); // assume - expectError(entry, 'Must match pattern A+B.'); + expectError(entry, `${name} - Pattern (String) must match pattern A+B.`); // when changeInput(input, 'AAAB'); @@ -1327,7 +1327,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { input = domQuery(selector, entry); // assume - expectError(entry, 'Must start with https://'); + expectError(entry, `${name} - Pattern (String + Message) Must start with https://`); // when changeInput(input, 'https://'); @@ -1346,7 +1346,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { input = domQuery(selector, entry); // assume - expectError(entry, 'Must be positive integer'); + expectError(entry, `${name} - Pattern (Integer) Must be positive integer`); // when changeInput(input, '20'); @@ -1376,7 +1376,7 @@ describe('provider/cloud-element-templates - CustomProperties', function() { // then const entry = findEntry('custom-entry-com.validated-inputs-conditional.Task-authentication-1', container), input = domQuery('input', entry); - expectError(entry, 'Must not be empty.'); + expectError(entry, 'Bearer token must not be empty.'); // and when changeInput(input, '123456');