diff --git a/package-lock.json b/package-lock.json index 3d6cf8ac..a4884dee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,15 +14,15 @@ "xmlbuilder2": "^3.1.1" }, "devDependencies": { - "@rollup/plugin-commonjs": "^28.0.0", + "@rollup/plugin-commonjs": "^28.0.1", "@rollup/plugin-node-resolve": "^15.3.0", - "@rollup/plugin-typescript": "^12.1.0", + "@rollup/plugin-typescript": "^12.1.1", "@types/chai": "^5.0.0", "@types/mocha": "^10.0.9", - "@types/node": "^22.7.5", + "@types/node": "^22.7.7", "chai": "^5.1.1", "cross-env": "^7.0.3", - "eslint": "^9.12.0", + "eslint": "^9.13.0", "husky": "^9.1.6", "lint-staged": "^15.2.10", "logging": "^3.3.0", @@ -31,11 +31,11 @@ "prettier": "^3.3.3", "rollup": "^4.24.0", "rollup-plugin-polyfill-node": "^0.13.0", - "semantic-release": "^24.1.2", + "semantic-release": "^24.1.3", "ts-node": "^10.9.2", - "tslib": "^2.7.0", + "tslib": "^2.8.0", "typescript": "^5.6.3", - "typescript-eslint": "^8.8.1", + "typescript-eslint": "^8.10.0", "uglify-js": "^3.19.3" }, "engines": { @@ -579,9 +579,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.6.0.tgz", - "integrity": "sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg==", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", + "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", "dev": true, "license": "Apache-2.0", "engines": { @@ -613,9 +613,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz", - "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.13.0.tgz", + "integrity": "sha512-IFLyoY4d72Z5y/6o/BazFBezupzI/taV8sGumxTAVw3lXG9A6md1Dc34T9s1FoD/an9pJH8RHbAxsaEbBed9lA==", "dev": true, "license": "MIT", "engines": { @@ -1169,19 +1169,19 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "28.0.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.0.tgz", - "integrity": "sha512-BJcu+a+Mpq476DMXG+hevgPSl56bkUoi88dKT8t3RyUp8kGuOh+2bU8Gs7zXDlu+fyZggnJ+iOBGrb/O1SorYg==", + "version": "28.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "fdir": "^6.1.1", + "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", - "picomatch": "^2.3.1" + "picomatch": "^4.0.2" }, "engines": { "node": ">=16.0.0 || 14 >= 14.17" @@ -1195,19 +1195,6 @@ } } }, - "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/plugin-inject": { "version": "5.0.5", "dev": true, @@ -1255,9 +1242,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.0.tgz", - "integrity": "sha512-Kzs8KGJofe7cfTRODsnG1jNGxSvU8gVoNNd7Z/QaY25AYwe2LSSUpx/kPxqF38NYkpR8de3m51r9uwJpDlz6dg==", + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.1.tgz", + "integrity": "sha512-t7O653DpfB5MbFrqPe/VcKFFkvRuFNp9qId3xq4Eth5xlyymzxNpye2z8Hrl0RIMuXTSr5GGcFpkdlMeacUiFQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2017,9 +2004,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.7.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz", - "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==", + "version": "22.7.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.7.tgz", + "integrity": "sha512-SRxCrrg9CL/y54aiMCG3edPKdprgMVGDXjA3gB8UmmBW5TcXzRUYAh8EWzTnSJFAd1rgImPELza+A3bJ+qxz8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -2052,17 +2039,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz", - "integrity": "sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.10.0.tgz", + "integrity": "sha512-phuB3hoP7FFKbRXxjl+DRlQDuJqhpOnm5MmtROXyWi3uS/Xg2ZXqiQfcG2BJHiN4QKyzdOJi3NEn/qTnjUlkmQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/type-utils": "8.8.1", - "@typescript-eslint/utils": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/type-utils": "8.10.0", + "@typescript-eslint/utils": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2086,16 +2073,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.8.1.tgz", - "integrity": "sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.10.0.tgz", + "integrity": "sha512-E24l90SxuJhytWJ0pTQydFT46Nk0Z+bsLKo/L8rtQSL93rQ6byd1V/QbDpHUTdLPOMsBCcYXZweADNCfOCmOAg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/typescript-estree": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "debug": "^4.3.4" }, "engines": { @@ -2115,14 +2102,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.8.1.tgz", - "integrity": "sha512-X4JdU+66Mazev/J0gfXlcC/dV6JI37h+93W9BRYXrSn0hrE64IoWgVkO9MSJgEzoWkxONgaQpICWg8vAN74wlA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.10.0.tgz", + "integrity": "sha512-AgCaEjhfql9MDKjMUxWvH7HjLeBqMCBfIaBbzzIcBbQPZE7CPh1m6FF+L75NUMJFMLYhCywJXIDEMa3//1A0dw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1" + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2133,14 +2120,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz", - "integrity": "sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.10.0.tgz", + "integrity": "sha512-PCpUOpyQSpxBn230yIcK+LeCQaXuxrgCm2Zk1S+PTIRJsEfU6nJ0TtwyH8pIwPK/vJoA+7TZtzyAJSGBz+s/dg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.8.1", - "@typescript-eslint/utils": "8.8.1", + "@typescript-eslint/typescript-estree": "8.10.0", + "@typescript-eslint/utils": "8.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2158,9 +2145,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.8.1.tgz", - "integrity": "sha512-WCcTP4SDXzMd23N27u66zTKMuEevH4uzU8C9jf0RO4E04yVHgQgW+r+TeVTNnO1KIfrL8ebgVVYYMMO3+jC55Q==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.10.0.tgz", + "integrity": "sha512-k/E48uzsfJCRRbGLapdZgrX52csmWJ2rcowwPvOZ8lwPUv3xW6CcFeJAXgx4uJm+Ge4+a4tFOkdYvSpxhRhg1w==", "dev": true, "license": "MIT", "engines": { @@ -2172,14 +2159,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.8.1.tgz", - "integrity": "sha512-A5d1R9p+X+1js4JogdNilDuuq+EHZdsH9MjTVxXOdVFfTJXunKJR/v+fNNyO4TnoOn5HqobzfRlc70NC6HTcdg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.10.0.tgz", + "integrity": "sha512-3OE0nlcOHaMvQ8Xu5gAfME3/tWVDpb/HxtpUZ1WeOAksZ/h/gwrBzCklaGzwZT97/lBbbxJ16dMA98JMEngW4w==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/visitor-keys": "8.8.1", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/visitor-keys": "8.10.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2227,16 +2214,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz", - "integrity": "sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.10.0.tgz", + "integrity": "sha512-Oq4uZ7JFr9d1ZunE/QKy5egcDRXT/FrS2z/nlxzPua2VHFtmMvFNDvpq1m/hq0ra+T52aUezfcjGRIB7vNJF9w==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.8.1", - "@typescript-eslint/types": "8.8.1", - "@typescript-eslint/typescript-estree": "8.8.1" + "@typescript-eslint/scope-manager": "8.10.0", + "@typescript-eslint/types": "8.10.0", + "@typescript-eslint/typescript-estree": "8.10.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2250,13 +2237,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.8.1.tgz", - "integrity": "sha512-0/TdC3aeRAsW7MDvYRwEc1Uwm0TIBfzjPFgg60UU2Haj5qsCs9cc3zNgY71edqE3LbWfF/WoZQd3lJoDXFQpag==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.10.0.tgz", + "integrity": "sha512-k8nekgqwr7FadWk548Lfph6V3r9OVqjzAIVskE7orMZR23cGJjAOVazsZSJW+ElyjfTM4wx/1g88Mi70DDtG9A==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.8.1", + "@typescript-eslint/types": "8.10.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -3799,18 +3786,18 @@ } }, "node_modules/eslint": { - "version": "9.12.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz", - "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==", + "version": "9.13.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.13.0.tgz", + "integrity": "sha512-EYZK6SX6zjFHST/HRytOdA/zE72Cq/bfw45LSyuwrdvcclb/gqV8RRQxywOBEWO2+WDpva6UZa4CcDeJKzUCFA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.11.0", "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.6.0", + "@eslint/core": "^0.7.0", "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.12.0", + "@eslint/js": "9.13.0", "@eslint/plugin-kit": "^0.2.0", "@humanfs/node": "^0.16.5", "@humanwhocodes/module-importer": "^1.0.1", @@ -9698,8 +9685,6 @@ "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", - "optional": true, - "peer": true, "engines": { "node": ">=12" }, @@ -10450,9 +10435,9 @@ } }, "node_modules/semantic-release": { - "version": "24.1.2", - "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.2.tgz", - "integrity": "sha512-hvEJ7yI97pzJuLsDZCYzJgmRxF8kiEJvNZhf0oiZQcexw+Ycjy4wbdsn/sVMURgNCu8rwbAXJdBRyIxM4pe32g==", + "version": "24.1.3", + "resolved": "https://registry.npmjs.org/semantic-release/-/semantic-release-24.1.3.tgz", + "integrity": "sha512-Cb0Pm3Ye15u8k/B+7EnusMUSIIucAIEBD3QDRmmclv53KVyqmg1Lb3XPx0AMNxfJZEI+ZT+M+IXDyTrudK6Rew==", "dev": true, "license": "MIT", "dependencies": { @@ -11690,9 +11675,9 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.0.tgz", + "integrity": "sha512-jWVzBLplnCmoaTr13V9dYbiQ99wvZRd0vNWaDRg+aVYRcjDF3nDksxFDE/+fkXnKhpnUUkmx5pK/v8mCtLVqZA==", "dev": true, "license": "0BSD" }, @@ -11830,15 +11815,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.8.1.tgz", - "integrity": "sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.10.0.tgz", + "integrity": "sha512-YIu230PeN7z9zpu/EtqCIuRVHPs4iSlqW6TEvjbyDAE3MZsSl2RXBo+5ag+lbABCG8sFM1WVKEXhlQ8Ml8A3Fw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.8.1", - "@typescript-eslint/parser": "8.8.1", - "@typescript-eslint/utils": "8.8.1" + "@typescript-eslint/eslint-plugin": "8.10.0", + "@typescript-eslint/parser": "8.10.0", + "@typescript-eslint/utils": "8.10.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" diff --git a/package.json b/package.json index b4150add..19b4d965 100644 --- a/package.json +++ b/package.json @@ -27,15 +27,15 @@ "url": "git+https://github.com/Lightning-Flow-Scanner/lightning-flow-scanner-core.git" }, "devDependencies": { - "@rollup/plugin-commonjs": "^28.0.0", + "@rollup/plugin-commonjs": "^28.0.1", "@rollup/plugin-node-resolve": "^15.3.0", - "@rollup/plugin-typescript": "^12.1.0", + "@rollup/plugin-typescript": "^12.1.1", "@types/chai": "^5.0.0", "@types/mocha": "^10.0.9", - "@types/node": "^22.7.5", + "@types/node": "^22.7.7", "chai": "^5.1.1", "cross-env": "^7.0.3", - "eslint": "^9.12.0", + "eslint": "^9.13.0", "husky": "^9.1.6", "lint-staged": "^15.2.10", "logging": "^3.3.0", @@ -44,11 +44,11 @@ "prettier": "^3.3.3", "rollup": "^4.24.0", "rollup-plugin-polyfill-node": "^0.13.0", - "semantic-release": "^24.1.2", + "semantic-release": "^24.1.3", "ts-node": "^10.9.2", - "tslib": "^2.7.0", + "tslib": "^2.8.0", "typescript": "^5.6.3", - "typescript-eslint": "^8.8.1", + "typescript-eslint": "^8.10.0", "uglify-js": "^3.19.3" }, "dependencies": { diff --git a/src/main/models/FlowElement.ts b/src/main/models/FlowElement.ts index b90bd6a5..13cf07f1 100644 --- a/src/main/models/FlowElement.ts +++ b/src/main/models/FlowElement.ts @@ -1,7 +1,11 @@ export class FlowElement { public subtype: string; public metaType: string; - public element: object = {}; + public element: string | object = {}; + public connectors?: object[]; + public name?: string; + public locationX?: string; + public locationY?: string; constructor(metaType: string, subtype: string, element: object) { this.element = element; diff --git a/tests/Exceptions.test.ts b/tests/Exceptions.test.ts new file mode 100644 index 00000000..e290d312 --- /dev/null +++ b/tests/Exceptions.test.ts @@ -0,0 +1,817 @@ +import "mocha"; +import * as core from "../src"; +import { ParsedFlow } from "../src/main/models/ParsedFlow"; + +describe("Exceptions", () => { + let expect; + before(async () => { + expect = (await import("chai")).expect; + }); + + it("should show exceptions on wrong configuration", async () => { + const flows: ParsedFlow[] = [ + { + uri: "something", + flow: { + flowVariables: ["choices", "constants", "dynamicChoiceSets", "formulas", "variables"], + flowResources: ["textTemplates", "stages"], + flowMetadata: [ + "description", + "apiVersion", + "processMetadataValues", + "processType", + "interviewLabel", + "label", + "status", + "runInMode", + "startElementReference", + "isTemplate", + "fullName", + "timeZoneSidKey", + "isAdditionalPermissionRequiredToRun", + "migratedFromWorkflowRuleName", + "triggerOrder", + "environments", + "segment", + ], + flowNodes: [ + "actionCalls", + "apexPluginCalls", + "assignments", + "collectionProcessors", + "decisions", + "loops", + "orchestratedStages", + "recordCreates", + "recordDeletes", + "recordLookups", + "recordUpdates", + "recordRollbacks", + "screens", + "start", + "steps", + "subflows", + "waits", + ], + fsPath: "./tests/xmlfiles/random.flow-meta.xml", + name: "Flow1API60", + xmldata: { + "@xmlns": "http://soap.sforce.com/2006/04/metadata", + apiVersion: "60.0", + environments: "Default", + interviewLabel: "test {!$Flow.CurrentDateTime}", + label: "test", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + processType: "Flow", + runInMode: "SystemModeWithoutSharing", + screens: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + }, + label: "test", + interviewLabel: "test {!$Flow.CurrentDateTime}", + processType: "Flow", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { name: "CanvasMode", value: { stringValue: "AUTO_LAYOUT_CANVAS" } }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + type: "Flow", + elements: [ + { element: "61.0", subtype: "apiVersion", metaType: "metadata" }, + { element: "Default", subtype: "environments", metaType: "metadata" }, + { + element: "test {!$Flow.CurrentDateTime}", + subtype: "interviewLabel", + metaType: "metadata", + }, + { element: "test", subtype: "label", metaType: "metadata" }, + { + element: { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { element: "Flow", subtype: "processType", metaType: "metadata" }, + { + element: "SystemModeWithoutSharing", + subtype: "runInMode", + metaType: "metadata", + }, + { + element: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + subtype: "screens", + metaType: "node", + connectors: [], + name: "testtest", + locationX: "176", + locationY: "134", + }, + { + element: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + subtype: "start", + metaType: "node", + connectors: [ + { + element: { targetReference: "testtest" }, + processed: false, + type: "connector", + reference: "testtest", + }, + ], + name: "flowstart", + locationX: "50", + locationY: "0", + }, + { element: "Draft", subtype: "status", metaType: "metadata" }, + ], + startReference: "testtest", + } as unknown as core.Flow, + }, + ]; + const ruleConfig = { + rules: { + APIVersion: { + severity: "error", + expression: "===62", + }, + }, + exceptions: { + Flow1API60: { APIVersion: ["60.0"] }, + Flow2API61: { APIVersion: ["60.0"] }, + Flow3API59: { APIVersion: ["60.0"] }, + }, + }; + const results: core.ScanResult[] = core.scan(flows, ruleConfig); + const { ruleResults } = results.pop() as core.ScanResult; + expect( + ruleResults.filter((rule) => { + return rule.occurs; + }).length + ).to.equal(1); + }); + + it("should show not show any exceptions on api version", async () => { + const flows: ParsedFlow[] = [ + { + uri: "something", + flow: { + flowVariables: ["choices", "constants", "dynamicChoiceSets", "formulas", "variables"], + flowResources: ["textTemplates", "stages"], + flowMetadata: [ + "description", + "apiVersion", + "processMetadataValues", + "processType", + "interviewLabel", + "label", + "status", + "runInMode", + "startElementReference", + "isTemplate", + "fullName", + "timeZoneSidKey", + "isAdditionalPermissionRequiredToRun", + "migratedFromWorkflowRuleName", + "triggerOrder", + "environments", + "segment", + ], + flowNodes: [ + "actionCalls", + "apexPluginCalls", + "assignments", + "collectionProcessors", + "decisions", + "loops", + "orchestratedStages", + "recordCreates", + "recordDeletes", + "recordLookups", + "recordUpdates", + "recordRollbacks", + "screens", + "start", + "steps", + "subflows", + "waits", + ], + fsPath: "./tests/xmlfiles/random.flow-meta.xml", + name: "Flow1API60", + xmldata: { + "@xmlns": "http://soap.sforce.com/2006/04/metadata", + apiVersion: "60.0", + environments: "Default", + interviewLabel: "test {!$Flow.CurrentDateTime}", + label: "test", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + processType: "Flow", + runInMode: "SystemModeWithoutSharing", + screens: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + }, + label: "test", + interviewLabel: "test {!$Flow.CurrentDateTime}", + processType: "Flow", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { name: "CanvasMode", value: { stringValue: "AUTO_LAYOUT_CANVAS" } }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + type: "Flow", + elements: [ + { element: "61.0", subtype: "apiVersion", metaType: "metadata" }, + { element: "Default", subtype: "environments", metaType: "metadata" }, + { + element: "test {!$Flow.CurrentDateTime}", + subtype: "interviewLabel", + metaType: "metadata", + }, + { element: "test", subtype: "label", metaType: "metadata" }, + { + element: { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { element: "Flow", subtype: "processType", metaType: "metadata" }, + { + element: "SystemModeWithoutSharing", + subtype: "runInMode", + metaType: "metadata", + }, + { + element: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + subtype: "screens", + metaType: "node", + connectors: [], + name: "testtest", + locationX: "176", + locationY: "134", + }, + { + element: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + subtype: "start", + metaType: "node", + connectors: [ + { + element: { targetReference: "testtest" }, + processed: false, + type: "connector", + reference: "testtest", + }, + ], + name: "flowstart", + locationX: "50", + locationY: "0", + }, + { element: "Draft", subtype: "status", metaType: "metadata" }, + ], + startReference: "testtest", + } as unknown as core.Flow, + }, + { + uri: "something", + flow: { + flowVariables: ["choices", "constants", "dynamicChoiceSets", "formulas", "variables"], + flowResources: ["textTemplates", "stages"], + flowMetadata: [ + "description", + "apiVersion", + "processMetadataValues", + "processType", + "interviewLabel", + "label", + "status", + "runInMode", + "startElementReference", + "isTemplate", + "fullName", + "timeZoneSidKey", + "isAdditionalPermissionRequiredToRun", + "migratedFromWorkflowRuleName", + "triggerOrder", + "environments", + "segment", + ], + flowNodes: [ + "actionCalls", + "apexPluginCalls", + "assignments", + "collectionProcessors", + "decisions", + "loops", + "orchestratedStages", + "recordCreates", + "recordDeletes", + "recordLookups", + "recordUpdates", + "recordRollbacks", + "screens", + "start", + "steps", + "subflows", + "waits", + ], + fsPath: "./tests/xmlfiles/random.flow-meta.xml", + name: "Flow2API61", + xmldata: { + "@xmlns": "http://soap.sforce.com/2006/04/metadata", + apiVersion: "61.0", + environments: "Default", + interviewLabel: "test {!$Flow.CurrentDateTime}", + label: "test", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + processType: "Flow", + runInMode: "SystemModeWithoutSharing", + screens: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + }, + label: "test", + interviewLabel: "test {!$Flow.CurrentDateTime}", + processType: "Flow", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { name: "CanvasMode", value: { stringValue: "AUTO_LAYOUT_CANVAS" } }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + type: "Flow", + elements: [ + { element: "61.0", subtype: "apiVersion", metaType: "metadata" }, + { element: "Default", subtype: "environments", metaType: "metadata" }, + { + element: "test {!$Flow.CurrentDateTime}", + subtype: "interviewLabel", + metaType: "metadata", + }, + { element: "test", subtype: "label", metaType: "metadata" }, + { + element: { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { element: "Flow", subtype: "processType", metaType: "metadata" }, + { + element: "SystemModeWithoutSharing", + subtype: "runInMode", + metaType: "metadata", + }, + { + element: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + subtype: "screens", + metaType: "node", + connectors: [], + name: "testtest", + locationX: "176", + locationY: "134", + }, + { + element: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + subtype: "start", + metaType: "node", + connectors: [ + { + element: { targetReference: "testtest" }, + processed: false, + type: "connector", + reference: "testtest", + }, + ], + name: "flowstart", + locationX: "50", + locationY: "0", + }, + { element: "Draft", subtype: "status", metaType: "metadata" }, + ], + startReference: "testtest", + } as unknown as core.Flow, + }, + { + uri: "something", + flow: { + flowVariables: ["choices", "constants", "dynamicChoiceSets", "formulas", "variables"], + flowResources: ["textTemplates", "stages"], + flowMetadata: [ + "description", + "apiVersion", + "processMetadataValues", + "processType", + "interviewLabel", + "label", + "status", + "runInMode", + "startElementReference", + "isTemplate", + "fullName", + "timeZoneSidKey", + "isAdditionalPermissionRequiredToRun", + "migratedFromWorkflowRuleName", + "triggerOrder", + "environments", + "segment", + ], + flowNodes: [ + "actionCalls", + "apexPluginCalls", + "assignments", + "collectionProcessors", + "decisions", + "loops", + "orchestratedStages", + "recordCreates", + "recordDeletes", + "recordLookups", + "recordUpdates", + "recordRollbacks", + "screens", + "start", + "steps", + "subflows", + "waits", + ], + fsPath: "./tests/xmlfiles/random.flow-meta.xml", + name: "Flow3API59", + xmldata: { + "@xmlns": "http://soap.sforce.com/2006/04/metadata", + apiVersion: "59.0", + environments: "Default", + interviewLabel: "test {!$Flow.CurrentDateTime}", + label: "test", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + processType: "Flow", + runInMode: "SystemModeWithoutSharing", + screens: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + }, + label: "test", + interviewLabel: "test {!$Flow.CurrentDateTime}", + processType: "Flow", + processMetadataValues: [ + { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + { name: "CanvasMode", value: { stringValue: "AUTO_LAYOUT_CANVAS" } }, + { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + ], + start: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + status: "Draft", + type: "Flow", + elements: [ + { element: "59.0", subtype: "apiVersion", metaType: "metadata" }, + { element: "Default", subtype: "environments", metaType: "metadata" }, + { + element: "test {!$Flow.CurrentDateTime}", + subtype: "interviewLabel", + metaType: "metadata", + }, + { element: "test", subtype: "label", metaType: "metadata" }, + { + element: { + name: "BuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "CanvasMode", + value: { stringValue: "AUTO_LAYOUT_CANVAS" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { + element: { + name: "OriginBuilderType", + value: { stringValue: "LightningFlowBuilder" }, + }, + subtype: "processMetadataValues", + metaType: "metadata", + }, + { element: "Flow", subtype: "processType", metaType: "metadata" }, + { + element: "SystemModeWithoutSharing", + subtype: "runInMode", + metaType: "metadata", + }, + { + element: { + name: "testtest", + label: "test", + locationX: "176", + locationY: "134", + allowBack: "true", + allowFinish: "true", + allowPause: "true", + showFooter: "true", + showHeader: "true", + }, + subtype: "screens", + metaType: "node", + connectors: [], + name: "testtest", + locationX: "176", + locationY: "134", + }, + { + element: { + locationX: "50", + locationY: "0", + connector: { targetReference: "testtest" }, + }, + subtype: "start", + metaType: "node", + connectors: [ + { + element: { targetReference: "testtest" }, + processed: false, + type: "connector", + reference: "testtest", + }, + ], + name: "flowstart", + locationX: "50", + locationY: "0", + }, + { element: "Draft", subtype: "status", metaType: "metadata" }, + ], + startReference: "testtest", + } as unknown as core.Flow, + }, + ]; + const ruleConfig = { + rules: { + APIVersion: { + severity: "error", + expression: "===62", + }, + }, + exceptions: { + Flow1API60: { APIVersion: ["60"] }, + Flow2API61: { APIVersion: ["61"] }, + Flow3API59: { APIVersion: ["59"] }, + }, + }; + const results: core.ScanResult[] = core.scan(flows, ruleConfig); + results.forEach(({ ruleResults }) => { + expect( + ruleResults.filter((result) => { + return result.occurs; + }).length + ).to.equal(0); + }); + }); +});