diff --git a/eslint.config.mjs b/eslint.config.mjs index 2ca13810b1..0fdd4b2157 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -18,6 +18,7 @@ import eslintJs from '@eslint/js'; import importPlugin from 'eslint-plugin-import'; import nodePlugin from 'eslint-plugin-n'; import prettierRecommendedConfig from 'eslint-plugin-prettier/recommended'; +import unicornPlugin from 'eslint-plugin-unicorn'; import tsEslint from 'typescript-eslint'; export default tsEslint.config( @@ -93,10 +94,17 @@ export default tsEslint.config( { files: ['packages/core/src/**/*'], ...nodePlugin.configs['flat/recommended-script'], + plugins: { + n: nodePlugin, + unicorn: unicornPlugin, + }, rules: { ...nodePlugin.configs['flat/recommended-script'].rules, // without this line, the rules are not applied when specifying custom rules 'n/file-extension-in-import': ['error', 'always'], 'n/no-unsupported-features/node-builtins': 'off', // we don't use node in this package, and most errors are due to "navigator.xxx is still an experimental feature and is not supported until Node.js yyy" + // apply a subset of unicorn rules for now + 'unicorn/prefer-number-properties': 'error', + 'unicorn/prefer-switch': 'error', }, }, diff --git a/package-lock.json b/package-lock.json index 8ecef34390..e704aa0988 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "eslint-plugin-import": "~2.32.0", "eslint-plugin-n": "~17.23.1", "eslint-plugin-prettier": "~5.5.4", + "eslint-plugin-unicorn": "~61.0.2", "prettier": "~3.6.2", "typescript": "~5.9.2", "typescript-eslint": "~8.44.1" @@ -15960,6 +15961,15 @@ } ] }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.14", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.14.tgz", + "integrity": "sha512-GM9c0cWWR8Ga7//Ves/9KRgTS8nLausCkP3CGiFLrnwA2CDUluXgaQqvrULoR2Ujrd/mz/lkX87F5BHFsNr5sQ==", + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, "node_modules/basic-auth": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", @@ -16224,9 +16234,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.26.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz", + "integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==", "funding": [ { "type": "opencollective", @@ -16243,9 +16253,10 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", - "node-releases": "^2.0.19", + "baseline-browser-mapping": "^2.8.9", + "caniuse-lite": "^1.0.30001746", + "electron-to-chromium": "^1.5.227", + "node-releases": "^2.0.21", "update-browserslist-db": "^1.1.3" }, "bin": { @@ -16316,6 +16327,19 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "node_modules/builtin-modules": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.0.0.tgz", + "integrity": "sha512-bkXY9WsVpY7CvMhKSR6pZilZu9Ln5WDrKVBUXf2S443etkmEO4V58heTecXcUIsNsi4Rx8JUO4NfX1IcQl4deg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", @@ -16453,9 +16477,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001724", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001724.tgz", - "integrity": "sha512-WqJo7p0TbHDOythNTqYujmaJTvtYRZrjpP8TCvH6Vb9CYJerJNKamKzIWOM4BkQatWj9H2lYulpdAQNBe7QhNA==", + "version": "1.0.30001749", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001749.tgz", + "integrity": "sha512-0rw2fJOmLfnzCRbkm8EyHL8SvI2Apu5UbnQuTsJ0ClgrH8hcwFooJ1s5R0EP8o8aVrFu8++ae29Kt9/gZAZp/Q==", "funding": [ { "type": "opencollective", @@ -16505,6 +16529,13 @@ "node": ">=0.8.0" } }, + "node_modules/change-case": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", + "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==", + "dev": true, + "license": "MIT" + }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -16682,6 +16713,29 @@ "node": ">=0.10.0" } }, + "node_modules/clean-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clean-regexp/-/clean-regexp-1.0.0.tgz", + "integrity": "sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/clean-regexp/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -17475,12 +17529,12 @@ } }, "node_modules/core-js-compat": { - "version": "3.42.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.42.0.tgz", - "integrity": "sha512-bQasjMfyDGyaeWKBIu33lHh9qlSR0MFE/Nmc6nMjf/iU9b3rSMdAYz1Baxrv4lPdGUsTqZudHA4jIGSJy0SWZQ==", + "version": "3.45.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.45.1.tgz", + "integrity": "sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==", "license": "MIT", "dependencies": { - "browserslist": "^4.24.4" + "browserslist": "^4.25.3" }, "funding": { "type": "opencollective", @@ -18978,9 +19032,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.171", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.171.tgz", - "integrity": "sha512-scWpzXEJEMrGJa4Y6m/tVotb0WuvNmasv3wWVzUAeCgKU0ToFOhUW6Z+xWnRQANMYGxN4ngJXIThgBJOqzVPCQ==", + "version": "1.5.233", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.233.tgz", + "integrity": "sha512-iUdTQSf7EFXsDdQsp8MwJz5SVk4APEFqXU/S47OtQ0YLqacSwPXdZ5vRlMX3neb07Cy2vgioNuRnWUXFwuslkg==", "license": "ISC" }, "node_modules/emittery": { @@ -19781,6 +19835,136 @@ } } }, + "node_modules/eslint-plugin-unicorn": { + "version": "61.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-61.0.2.tgz", + "integrity": "sha512-zLihukvneYT7f74GNbVJXfWIiNQmkc/a9vYBTE4qPkQZswolWNdu+Wsp9sIXno1JOzdn6OUwLPd19ekXVkahRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "@eslint-community/eslint-utils": "^4.7.0", + "@eslint/plugin-kit": "^0.3.3", + "change-case": "^5.4.4", + "ci-info": "^4.3.0", + "clean-regexp": "^1.0.0", + "core-js-compat": "^3.44.0", + "esquery": "^1.6.0", + "find-up-simple": "^1.0.1", + "globals": "^16.3.0", + "indent-string": "^5.0.0", + "is-builtin-module": "^5.0.0", + "jsesc": "^3.1.0", + "pluralize": "^8.0.0", + "regexp-tree": "^0.1.27", + "regjsparser": "^0.12.0", + "semver": "^7.7.2", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": "^20.10.0 || >=21.0.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/eslint-plugin-unicorn?sponsor=1" + }, + "peerDependencies": { + "eslint": ">=9.29.0" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/ci-info": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.1.tgz", + "integrity": "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/regjsparser": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.12.0.tgz", + "integrity": "sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.0.2" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/regjsparser/node_modules/jsesc": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz", + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/eslint-plugin-unicorn/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -19949,10 +20133,11 @@ } }, "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -20897,6 +21082,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/find-up-simple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/find-up-simple/-/find-up-simple-1.0.1.tgz", + "integrity": "sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -22807,6 +23005,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-builtin-module": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-5.0.0.tgz", + "integrity": "sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "builtin-modules": "^5.0.0" + }, + "engines": { + "node": ">=18.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -31334,9 +31548,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "version": "2.0.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz", + "integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==", "license": "MIT" }, "node_modules/node-source-walk": { @@ -35023,6 +35237,16 @@ "@babel/runtime": "^7.8.4" } }, + "node_modules/regexp-tree": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/regexp-tree/-/regexp-tree-0.1.27.tgz", + "integrity": "sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==", + "dev": true, + "license": "MIT", + "bin": { + "regexp-tree": "bin/regexp-tree" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -37125,6 +37349,19 @@ "node": ">=6" } }, + "node_modules/strip-indent": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.1.0.tgz", + "integrity": "sha512-OA95x+JPmL7kc7zCu+e+TeYxEiaIyndRx0OrBcK2QPPH09oAndr2ALvymxWA+Lx1PYYvFUm4O63pRkdJAaW96w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", diff --git a/package.json b/package.json index e971d59ff8..5f2194c9d3 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,7 @@ "eslint-plugin-import": "~2.32.0", "eslint-plugin-n": "~17.23.1", "eslint-plugin-prettier": "~5.5.4", + "eslint-plugin-unicorn": "~61.0.2", "prettier": "~3.6.2", "typescript": "~5.9.2", "typescript-eslint": "~8.44.1" diff --git a/packages/core/src/editor/Editor.ts b/packages/core/src/editor/Editor.ts index c1cb3b418b..f2f4746f44 100644 --- a/packages/core/src/editor/Editor.ts +++ b/packages/core/src/editor/Editor.ts @@ -1228,9 +1228,9 @@ export class Editor extends EventSource { ); if (preInput) { - const scale = parseFloat(preInput) / 100; + const scale = Number.parseFloat(preInput) / 100; - if (!isNaN(scale)) { + if (!Number.isNaN(scale)) { editor.graph.getView().setScale(scale); } } @@ -2124,10 +2124,10 @@ export class Editor extends EventSource { if (geo && xField && yField && widthField && heightField) { geo = geo.clone(); - geo.x = parseFloat(xField.value); - geo.y = parseFloat(yField.value); - geo.width = parseFloat(widthField.value); - geo.height = parseFloat(heightField.value); + geo.x = Number.parseFloat(xField.value); + geo.y = Number.parseFloat(yField.value); + geo.width = Number.parseFloat(widthField.value); + geo.height = Number.parseFloat(heightField.value); model.setGeometry(cell, geo); } @@ -2383,15 +2383,23 @@ export class Editor extends EventSource { */ setMode(modename: any): void { const panningHandler = this.graph.getPlugin('PanningHandler'); - if (modename === 'select') { - panningHandler && (panningHandler.useLeftButtonForPanning = false); - this.graph.setConnectable(false); - } else if (modename === 'connect') { - panningHandler && (panningHandler.useLeftButtonForPanning = false); - this.graph.setConnectable(true); - } else if (modename === 'pan') { - panningHandler && (panningHandler.useLeftButtonForPanning = true); - this.graph.setConnectable(false); + switch (modename) { + case 'select': { + panningHandler && (panningHandler.useLeftButtonForPanning = false); + this.graph.setConnectable(false); + break; + } + case 'connect': { + panningHandler && (panningHandler.useLeftButtonForPanning = false); + this.graph.setConnectable(true); + break; + } + case 'pan': { + panningHandler && (panningHandler.useLeftButtonForPanning = true); + this.graph.setConnectable(false); + break; + } + // No default } } diff --git a/packages/core/src/gui/MaxWindow.ts b/packages/core/src/gui/MaxWindow.ts index bc93f41396..f9e08c35a7 100644 --- a/packages/core/src/gui/MaxWindow.ts +++ b/packages/core/src/gui/MaxWindow.ts @@ -402,7 +402,7 @@ export default class MaxWindow extends EventSource { activate(): void { if (activeWindow !== this) { const style = getCurrentStyle(this.getElement()); - const index = style != null ? parseInt(style.zIndex) : 3; + const index = style != null ? Number.parseInt(style.zIndex) : 3; if (activeWindow) { const elt = activeWindow.getElement(); @@ -683,8 +683,8 @@ export default class MaxWindow extends EventSource { this.minimize.style.display = 'none'; // Saves window state - x = parseInt(this.div.style.left); - y = parseInt(this.div.style.top); + x = Number.parseInt(this.div.style.left); + y = Number.parseInt(this.div.style.top); height = this.table.style.height; width = this.table.style.width; @@ -812,14 +812,14 @@ export default class MaxWindow extends EventSource { * Returns the current position on the x-axis. */ getX(): number { - return parseInt(this.div.style.left); + return Number.parseInt(this.div.style.left); } /** * Returns the current position on the y-axis. */ getY(): number { - return parseInt(this.div.style.top); + return Number.parseInt(this.div.style.top); } /** diff --git a/packages/core/src/i18n/Translations.ts b/packages/core/src/i18n/Translations.ts index a3dbdb0da2..1b8a35768d 100644 --- a/packages/core/src/i18n/Translations.ts +++ b/packages/core/src/i18n/Translations.ts @@ -351,7 +351,7 @@ export default class Translations { if (c === '{') { index = ''; } else if (index != null && c === '}') { - index = parseInt(index) - 1; + index = Number.parseInt(index) - 1; if (index >= 0 && index < params.length) { result.push(params[index]); diff --git a/packages/core/src/serialization/ObjectCodec.ts b/packages/core/src/serialization/ObjectCodec.ts index c77c2ed35c..723ba004b3 100644 --- a/packages/core/src/serialization/ObjectCodec.ts +++ b/packages/core/src/serialization/ObjectCodec.ts @@ -582,7 +582,7 @@ class ObjectCodec { let { value } = attr; if (this.isNumericAttribute(dec, attr, obj)) { - value = parseFloat(value); + value = Number.parseFloat(value); if (Number.isNaN(value) || !Number.isFinite(value)) { value = 0; diff --git a/packages/core/src/serialization/codecs/StylesheetCodec.ts b/packages/core/src/serialization/codecs/StylesheetCodec.ts index a324f70006..77e061805c 100644 --- a/packages/core/src/serialization/codecs/StylesheetCodec.ts +++ b/packages/core/src/serialization/codecs/StylesheetCodec.ts @@ -170,7 +170,7 @@ export class StylesheetCodec extends ObjectCodec { value = entry.getAttribute('value'); if (isNumeric(value)) { - value = parseFloat(value); + value = Number.parseFloat(value); } } diff --git a/packages/core/src/serialization/codecs/editor/EditorCodec.ts b/packages/core/src/serialization/codecs/editor/EditorCodec.ts index d2477ea25b..1a22fc70c7 100644 --- a/packages/core/src/serialization/codecs/editor/EditorCodec.ts +++ b/packages/core/src/serialization/codecs/editor/EditorCodec.ts @@ -147,59 +147,79 @@ export class EditorCodec extends ObjectCodec { decodeUi(_dec: Codec, node: Element, editor: Editor) { let tmp = node.firstChild; while (tmp != null) { - if (tmp.nodeName === 'add') { - const as = tmp.getAttribute('as'); - const elt = tmp.getAttribute('element'); - const style = tmp.getAttribute('style'); - let element = null; + switch (tmp.nodeName) { + case 'add': { + const as = tmp.getAttribute('as'); + const elt = tmp.getAttribute('element'); + const style = tmp.getAttribute('style'); + let element = null; - if (elt != null) { - element = document.getElementById(elt); + if (elt != null) { + element = document.getElementById(elt); - if (element != null && style != null) { - element.style.cssText += `;${style}`; + if (element != null && style != null) { + element.style.cssText += `;${style}`; + } + } else { + const x = Number.parseInt(tmp.getAttribute('x')); + const y = Number.parseInt(tmp.getAttribute('y')); + const width = tmp.getAttribute('width') || null; + const height = tmp.getAttribute('height') || null; + + // Creates a new window around the element + element = document.createElement('div'); + if (style != null) { + element.style.cssText = style; + } + + const wnd = new MaxWindow( + translate(as) || as, + element, + x, + y, + width ? Number.parseInt(width) : null, + height ? Number.parseInt(height) : null, + false, + true + ); + wnd.setVisible(true); } - } else { - const x = parseInt(tmp.getAttribute('x')); - const y = parseInt(tmp.getAttribute('y')); - const width = tmp.getAttribute('width') || null; - const height = tmp.getAttribute('height') || null; - - // Creates a new window around the element - element = document.createElement('div'); - if (style != null) { - element.style.cssText = style; + + // TODO: Make more generic + switch (as) { + case 'graph': { + editor.setGraphContainer(element); + break; + } + case 'toolbar': { + editor.setToolbarContainer(element); + break; + } + case 'title': { + editor.setTitleContainer(element); + break; + } + case 'status': { + editor.setStatusContainer(element); + break; + } + case 'map': { + throw new Error('Unimplemented'); + } + // No default } - const wnd = new MaxWindow( - translate(as) || as, - element, - x, - y, - width ? parseInt(width) : null, - height ? parseInt(height) : null, - false, - true - ); - wnd.setVisible(true); + break; } - - // TODO: Make more generic - if (as === 'graph') { - editor.setGraphContainer(element); - } else if (as === 'toolbar') { - editor.setToolbarContainer(element); - } else if (as === 'title') { - editor.setTitleContainer(element); - } else if (as === 'status') { - editor.setStatusContainer(element); - } else if (as === 'map') { - throw new Error('Unimplemented'); + case 'resource': { + GlobalConfig.i18n.addResource(tmp.getAttribute('basename')); + break; + } + case 'stylesheet': { + addLinkToHead('stylesheet', tmp.getAttribute('name')!); + break; } - } else if (tmp.nodeName === 'resource') { - GlobalConfig.i18n.addResource(tmp.getAttribute('basename')); - } else if (tmp.nodeName === 'stylesheet') { - addLinkToHead('stylesheet', tmp.getAttribute('name')!); + // No default } tmp = tmp.nextSibling; diff --git a/packages/core/src/serialization/codecs/editor/EditorToolbarCodec.ts b/packages/core/src/serialization/codecs/editor/EditorToolbarCodec.ts index 4cce9f42f5..604a50e8eb 100644 --- a/packages/core/src/serialization/codecs/editor/EditorToolbarCodec.ts +++ b/packages/core/src/serialization/codecs/editor/EditorToolbarCodec.ts @@ -138,142 +138,160 @@ export class EditorToolbarCodec extends ObjectCodec { while (node != null) { if (isElement(node)) { if (!this.processInclude(dec, node, into)) { - if (node.nodeName === 'separator') { - into.addSeparator(); - } else if (node.nodeName === 'br') { - into.toolbar!.addBreak(); - } else if (node.nodeName === 'hr') { - into.toolbar!.addLine(); - } else if (node.nodeName === 'add') { - let as = node.getAttribute('as'); - as = translate(as) || as; - const icon = node.getAttribute('icon'); - const pressedIcon = node.getAttribute('pressedIcon'); - const action = node.getAttribute('action'); - const mode = node.getAttribute('mode'); - const template = node.getAttribute('template'); - const toggle = node.getAttribute('toggle') != '0'; - const text = getTextContent((node)); - let elt = null; - let funct: any; - - if (action != null) { - elt = into.addItem(as, icon, action, pressedIcon); - } else if (mode != null) { - funct = EditorToolbarCodec.allowEval ? doEval(text) : null; - elt = into.addMode(as, icon!, mode, pressedIcon, funct); - } else if (template != null || (text != null && text.length > 0)) { - let cell = template ? editor.templates[template] : null; - const style = node.getAttribute('style'); - - if (cell != null && style != null) { - cell = editor.graph.cloneCell(cell); - cell.setStyle(style); - } + switch (node.nodeName) { + case 'separator': { + into.addSeparator(); + break; + } + case 'br': { + into.toolbar!.addBreak(); + break; + } + case 'hr': { + into.toolbar!.addLine(); + break; + } + case 'add': { + let as = node.getAttribute('as'); + as = translate(as) || as; + const icon = node.getAttribute('icon'); + const pressedIcon = node.getAttribute('pressedIcon'); + const action = node.getAttribute('action'); + const mode = node.getAttribute('mode'); + const template = node.getAttribute('template'); + const toggle = node.getAttribute('toggle') != '0'; + const text = getTextContent((node)); + let elt = null; + let funct: any; - let insertFunction = null; + if (action != null) { + elt = into.addItem(as, icon, action, pressedIcon); + } else if (mode != null) { + funct = EditorToolbarCodec.allowEval ? doEval(text) : null; + elt = into.addMode(as, icon!, mode, pressedIcon, funct); + } else if (template != null || (text != null && text.length > 0)) { + let cell = template ? editor.templates[template] : null; + const style = node.getAttribute('style'); - if (text != null && text.length > 0 && EditorToolbarCodec.allowEval) { - insertFunction = doEval(text); - } + if (cell != null && style != null) { + cell = editor.graph.cloneCell(cell); + cell.setStyle(style); + } + + let insertFunction = null; + + if (text != null && text.length > 0 && EditorToolbarCodec.allowEval) { + insertFunction = doEval(text); + } + + elt = into.addPrototype( + as, + icon, + cell, + pressedIcon!, + insertFunction, + toggle + ); + } else { + const children = getChildNodes(node); + + if (children.length > 0) { + if (icon == null) { + const combo = into.addActionCombo(as); + + for (let i = 0; i < children.length; i += 1) { + const child = children[i]; - elt = into.addPrototype( - as, - icon, - cell, - pressedIcon!, - insertFunction, - toggle - ); - } else { - const children = getChildNodes(node); - - if (children.length > 0) { - if (icon == null) { - const combo = into.addActionCombo(as); - - for (let i = 0; i < children.length; i += 1) { - const child = children[i]; - - if (child.nodeName === 'separator') { - into.addOption(combo, '---'); - } else if (child.nodeName === 'add') { - const lab = child.getAttribute('as')!; - const act = child.getAttribute('action')!; - into.addActionOption(combo, lab, act); + if (child.nodeName === 'separator') { + into.addOption(combo, '---'); + } else if (child.nodeName === 'add') { + const lab = child.getAttribute('as')!; + const act = child.getAttribute('action')!; + into.addActionOption(combo, lab, act); + } } - } - } else { - const select: HTMLSelectElement = into.addCombo(); - - const create = () => { - const template = editor.templates[select.value]; - - if (template != null) { - const clone = template.clone(); - const style = ( - select.options[ - select.selectedIndex - ] as HTMLOptionElementWithCellStyle - ).cellStyle; - - if (style) { - clone.setStyle(style); + } else { + const select: HTMLSelectElement = into.addCombo(); + + const create = () => { + const template = editor.templates[select.value]; + + if (template != null) { + const clone = template.clone(); + const style = ( + select.options[ + select.selectedIndex + ] as HTMLOptionElementWithCellStyle + ).cellStyle; + + if (style) { + clone.setStyle(style); + } + + return clone; } + GlobalConfig.logger.warn(`Template ${template} not found`); - return clone; - } - GlobalConfig.logger.warn(`Template ${template} not found`); + return null; + }; - return null; - }; + const img = into.addPrototype( + as, + icon, + create, + null!, + null!, + toggle + ); - const img = into.addPrototype(as, icon, create, null!, null!, toggle); + // Selects the toolbar icon if a selection change is made in the corresponding combobox. + InternalEvent.addListener(select, 'change', () => { + into.toolbar!.selectMode(img, (evt: MouseEvent) => { + const pt = convertPoint( + editor.graph.container, + getClientX(evt), + getClientY(evt) + ); - // Selects the toolbar icon if a selection change is made in the corresponding combobox. - InternalEvent.addListener(select, 'change', () => { - into.toolbar!.selectMode(img, (evt: MouseEvent) => { - const pt = convertPoint( - editor.graph.container, - getClientX(evt), - getClientY(evt) - ); + return editor.addVertex(null, funct(), pt.x, pt.y); + }); - return editor.addVertex(null, funct(), pt.x, pt.y); + into.toolbar!.noReset = false; }); - into.toolbar!.noReset = false; - }); - - // Adds the entries to the combobox - for (let i = 0; i < children.length; i += 1) { - const child = children[i]; - - if (child.nodeName === 'separator') { - into.addOption(select, '---'); - } else if (child.nodeName === 'add') { - const lab = child.getAttribute('as')!; - const tmp = child.getAttribute('template'); - const option = into.addOption( - select, - lab, - tmp || template - ) as HTMLOptionElementWithCellStyle; - option.cellStyle = child.getAttribute('style'); + // Adds the entries to the combobox + for (let i = 0; i < children.length; i += 1) { + const child = children[i]; + + if (child.nodeName === 'separator') { + into.addOption(select, '---'); + } else if (child.nodeName === 'add') { + const lab = child.getAttribute('as')!; + const tmp = child.getAttribute('template'); + const option = into.addOption( + select, + lab, + tmp || template + ) as HTMLOptionElementWithCellStyle; + option.cellStyle = child.getAttribute('style'); + } } } } } - } - // Assigns an ID to the created element to access it later. - if (elt != null) { - const id = node.getAttribute('id'); + // Assigns an ID to the created element to access it later. + if (elt != null) { + const id = node.getAttribute('id'); - if (id != null && id.length > 0) { - elt.setAttribute('id', id); + if (id != null && id.length > 0) { + elt.setAttribute('id', id); + } } + + break; } + // No default } } } diff --git a/packages/core/src/serialization/codecs/mxGraph/utils.ts b/packages/core/src/serialization/codecs/mxGraph/utils.ts index e6698453a2..2390085dd3 100644 --- a/packages/core/src/serialization/codecs/mxGraph/utils.ts +++ b/packages/core/src/serialization/codecs/mxGraph/utils.ts @@ -48,7 +48,7 @@ function convertToNumericIfNeeded(value: string): string | number { return value; } - let numericValue = parseFloat(value); + let numericValue = Number.parseFloat(value); if (Number.isNaN(numericValue) || !Number.isFinite(numericValue)) { numericValue = 0; diff --git a/packages/core/src/util/gestureUtils.ts b/packages/core/src/util/gestureUtils.ts index 587a2c7fd8..b0c12f3989 100644 --- a/packages/core/src/util/gestureUtils.ts +++ b/packages/core/src/util/gestureUtils.ts @@ -137,8 +137,8 @@ export const makeDraggable = ( dragSource.createPreviewElement = (graph) => { const elt = dragElement.cloneNode(true); - const w = parseInt(elt.style.width); - const h = parseInt(elt.style.height); + const w = Number.parseInt(elt.style.width); + const h = Number.parseInt(elt.style.height); elt.style.width = `${Math.round(w * graph.view.scale)}px`; elt.style.height = `${Math.round(h * graph.view.scale)}px`; diff --git a/packages/core/src/util/mathUtils.ts b/packages/core/src/util/mathUtils.ts index 1ce0116275..d3b46af634 100644 --- a/packages/core/src/util/mathUtils.ts +++ b/packages/core/src/util/mathUtils.ts @@ -407,21 +407,32 @@ export const getDirectedBounds = ( const m2 = Rectangle.fromRectangle(m); - if (d === 'south') { - m2.y = m.x; - m2.x = m.height; - m2.width = m.y; - m2.height = m.width; - } else if (d === 'west') { - m2.y = m.height; - m2.x = m.width; - m2.width = m.x; - m2.height = m.y; - } else if (d === 'north') { - m2.y = m.width; - m2.x = m.y; - m2.width = m.height; - m2.height = m.x; + switch (d) { + case 'south': { + m2.y = m.x; + m2.x = m.height; + m2.width = m.y; + m2.height = m.width; + + break; + } + case 'west': { + m2.y = m.height; + m2.x = m.width; + m2.width = m.x; + m2.height = m.y; + + break; + } + case 'north': { + m2.y = m.width; + m2.x = m.y; + m2.width = m.height; + m2.height = m.x; + + break; + } + // No default } return new Rectangle( @@ -661,8 +672,8 @@ export const intersectsHotspot = ( */ export const isNumeric = (n: any): n is number | string => { return ( - !Number.isNaN(parseFloat(n)) && - isFinite(+n) && + !Number.isNaN(Number.parseFloat(n)) && + Number.isFinite(+n) && (typeof n !== 'string' || n.toLowerCase().indexOf('0x') < 0) ); }; @@ -673,7 +684,7 @@ export const isNumeric = (n: any): n is number | string => { * @param n String representing the possibly numeric value. */ export const isInteger = (n: string) => { - return String(parseInt(n)) === String(n); + return String(Number.parseInt(n)) === String(n); }; /** diff --git a/packages/core/src/util/styleUtils.ts b/packages/core/src/util/styleUtils.ts index 8c032829a7..90499a2caa 100644 --- a/packages/core/src/util/styleUtils.ts +++ b/packages/core/src/util/styleUtils.ts @@ -73,15 +73,26 @@ export const getCurrentStyle = (element: HTMLElement) => { * Parses the given CSS numeric value adding handling for the values thin, medium and thick (2, 4 and 6). */ export const parseCssNumber = (value: string) => { - if (value === 'thin') { - value = '2'; - } else if (value === 'medium') { - value = '4'; - } else if (value === 'thick') { - value = '6'; + switch (value) { + case 'thin': { + value = '2'; + + break; + } + case 'medium': { + value = '4'; + + break; + } + case 'thick': { + value = '6'; + + break; + } + // No default } - let n = parseFloat(value); + let n = Number.parseFloat(value); if (Number.isNaN(n)) { n = 0; diff --git a/packages/core/src/util/xmlUtils.ts b/packages/core/src/util/xmlUtils.ts index 8057d8581c..8ac85a680a 100644 --- a/packages/core/src/util/xmlUtils.ts +++ b/packages/core/src/util/xmlUtils.ts @@ -147,72 +147,89 @@ export const getPrettyXml = ( } } - if (node.nodeType === NODE_TYPE.DOCUMENT) { - result.push( - getPrettyXml( - ((node)).documentElement, - tab, - indent, - newline, - ns - ) - ); - } else if (node.nodeType === NODE_TYPE.DOCUMENT_FRAGMENT) { - let tmp = node.firstChild; - - if (tmp != null) { - while (tmp != null) { - result.push(getPrettyXml(tmp, tab, indent, newline, ns)); - tmp = tmp.nextSibling; - } + switch (node.nodeType) { + case NODE_TYPE.DOCUMENT: { + result.push( + getPrettyXml( + ((node)).documentElement, + tab, + indent, + newline, + ns + ) + ); + + break; } - } else if (node.nodeType === NODE_TYPE.COMMENT) { - const value = getTextContent((node)); + case NODE_TYPE.DOCUMENT_FRAGMENT: { + let tmp = node.firstChild; + + if (tmp != null) { + while (tmp != null) { + result.push(getPrettyXml(tmp, tab, indent, newline, ns)); + tmp = tmp.nextSibling; + } + } - if (value.length > 0) { - result.push(`${indent}${newline}`); + break; } - } else if (node.nodeType === NODE_TYPE.TEXT) { - const value = trim(getTextContent((node))); + case NODE_TYPE.COMMENT: { + const value = getTextContent((node)); - if (value && value.length > 0) { - result.push(indent + htmlEntities(value, false) + newline); - } - } else if (node.nodeType === NODE_TYPE.CDATA) { - const value = getTextContent((node)); + if (value.length > 0) { + result.push(`${indent}${newline}`); + } - if (value.length > 0) { - result.push(`${indent}(node))); - // Creates the string with the node attributes - // and converts all HTML entities in the values - const attrs = node.attributes; + if (value && value.length > 0) { + result.push(indent + htmlEntities(value, false) + newline); + } - if (attrs != null) { - for (let i = 0; i < attrs.length; i += 1) { - const val = htmlEntities(attrs[i].value); - result.push(` ${attrs[i].nodeName}="${val}"`); + break; + } + case NODE_TYPE.CDATA: { + const value = getTextContent((node)); + + if (value.length > 0) { + result.push(`${indent}${newline}`); + if (tmp != null) { + result.push(`>${newline}`); - while (tmp != null) { - result.push(getPrettyXml(tmp, tab, indent + tab, newline, ns)); - tmp = tmp.nextSibling; - } + while (tmp != null) { + result.push(getPrettyXml(tmp, tab, indent + tab, newline, ns)); + tmp = tmp.nextSibling; + } - result.push(`${indent}${newline}`); - } else { - result.push(` />${newline}`); + result.push(`${indent}${newline}`); + } else { + result.push(` />${newline}`); + } } } } diff --git a/packages/core/src/view/GraphDataModel.ts b/packages/core/src/view/GraphDataModel.ts index a898e4bb60..ada595b880 100644 --- a/packages/core/src/view/GraphDataModel.ts +++ b/packages/core/src/view/GraphDataModel.ts @@ -486,7 +486,7 @@ export class GraphDataModel extends EventSource { // Makes sure IDs of deleted cells are not reused if (isNumeric(String(cell.getId()))) { - this.nextId = Math.max(this.nextId, parseInt(cell.getId())); + this.nextId = Math.max(this.nextId, Number.parseInt(cell.getId())); } // Recursively processes child cells diff --git a/packages/core/src/view/GraphView.ts b/packages/core/src/view/GraphView.ts index 77b5bdb6c1..31075aec62 100644 --- a/packages/core/src/view/GraphView.ts +++ b/packages/core/src/view/GraphView.ts @@ -1017,39 +1017,50 @@ export class GraphView extends EventSource { updateVertexLabelOffset(state: CellState): void { const h = state.style.labelPosition ?? 'center'; - if (h === 'left') { - let lw = state.style.labelWidth ?? null; + switch (h) { + case 'left': { + let lw = state.style.labelWidth ?? null; - if (lw != null) { - lw *= this.scale; - } else { - lw = state.width; + if (lw != null) { + lw *= this.scale; + } else { + lw = state.width; + } + + // @ts-ignore + state.absoluteOffset.x -= lw; + + break; } + case 'right': { + // @ts-ignore + state.absoluteOffset.x += state.width; - // @ts-ignore - state.absoluteOffset.x -= lw; - } else if (h === 'right') { - // @ts-ignore - state.absoluteOffset.x += state.width; - } else if (h === 'center') { - const lw = state.style.labelWidth ?? null; - - if (lw != null) { - // Aligns text block with given width inside the vertex width - const align = state.style.align ?? 'center'; - let dx = 0; - - if (align === 'center') { - dx = 0.5; - } else if (align === 'right') { - dx = 1; - } + break; + } + case 'center': { + const lw = state.style.labelWidth ?? null; + + if (lw != null) { + // Aligns text block with given width inside the vertex width + const align = state.style.align ?? 'center'; + let dx = 0; + + if (align === 'center') { + dx = 0.5; + } else if (align === 'right') { + dx = 1; + } - if (dx !== 0) { - // @ts-ignore - state.absoluteOffset.x -= (lw * this.scale - state.width) * dx; + if (dx !== 0) { + // @ts-ignore + state.absoluteOffset.x -= (lw * this.scale - state.width) * dx; + } } + + break; } + // No default } const v = state.style.verticalLabelPosition ?? 'middle'; diff --git a/packages/core/src/view/canvas/SvgCanvas2D.ts b/packages/core/src/view/canvas/SvgCanvas2D.ts index f7c37174a6..7a0b6e4eac 100644 --- a/packages/core/src/view/canvas/SvgCanvas2D.ts +++ b/packages/core/src/view/canvas/SvgCanvas2D.ts @@ -347,7 +347,7 @@ class SvgCanvas2D extends AbstractCanvas2D { * Rounds all numbers to 2 decimal points. */ override format(value: number) { - return parseFloat(value.toFixed(2)); + return Number.parseFloat(value.toFixed(2)); } /** @@ -601,13 +601,25 @@ class SvgCanvas2D extends AbstractCanvas2D { if (direction == null || direction === 'south') { gradient.setAttribute('y2', '100%'); - } else if (direction === 'east') { - gradient.setAttribute('x2', '100%'); - } else if (direction === 'north') { - gradient.setAttribute('y1', '100%'); - } else if (direction === 'west') { - gradient.setAttribute('x1', '100%'); - } + } else + switch (direction) { + case 'east': { + gradient.setAttribute('x2', '100%'); + + break; + } + case 'north': { + gradient.setAttribute('y1', '100%'); + + break; + } + case 'west': { + gradient.setAttribute('x1', '100%'); + + break; + } + // No default + } let op = alpha1 < 1 ? `;stop-opacity:${alpha1}` : ''; @@ -832,7 +844,8 @@ class SvgCanvas2D extends AbstractCanvas2D { */ createTolerance(node: SVGElement) { const tol = node.cloneNode(true) as SVGElement; - const sw = parseFloat(tol.getAttribute('stroke-width') || '1') + this.strokeTolerance; + const sw = + Number.parseFloat(tol.getAttribute('stroke-width') || '1') + this.strokeTolerance; tol.setAttribute('pointer-events', 'stroke'); tol.setAttribute('visibility', 'hidden'); tol.removeAttribute('stroke-dasharray'); diff --git a/packages/core/src/view/canvas/XmlCanvas2D.ts b/packages/core/src/view/canvas/XmlCanvas2D.ts index bad4331900..dd2574ef9b 100644 --- a/packages/core/src/view/canvas/XmlCanvas2D.ts +++ b/packages/core/src/view/canvas/XmlCanvas2D.ts @@ -87,9 +87,9 @@ class XmlCanvas2D extends AbstractCanvas2D { */ override format(value: string | number): number { if (typeof value === 'string') { - return parseFloat(parseFloat(value).toFixed(2)); + return Number.parseFloat(Number.parseFloat(value).toFixed(2)); } else { - return parseFloat(value.toFixed(2)); + return Number.parseFloat(value.toFixed(2)); } } diff --git a/packages/core/src/view/cell/CellOverlay.ts b/packages/core/src/view/cell/CellOverlay.ts index 45b6f3a76b..3538b56263 100644 --- a/packages/core/src/view/cell/CellOverlay.ts +++ b/packages/core/src/view/cell/CellOverlay.ts @@ -181,24 +181,46 @@ class CellOverlay extends EventSource implements ObjectIdentity { } else { pt = new Point(); - if (this.align === 'left') { - pt.x = state.x; - } else if (this.align === 'center') { - pt.x = state.x + state.width / 2; - } else if (this.align === 'right') { - pt.x = state.x + state.width; - } else { - throw new Error(); + switch (this.align) { + case 'left': { + pt.x = state.x; + + break; + } + case 'center': { + pt.x = state.x + state.width / 2; + + break; + } + case 'right': { + pt.x = state.x + state.width; + + break; + } + default: { + throw new Error(); + } } - if (this.verticalAlign === 'top') { - pt.y = state.y; - } else if (this.verticalAlign === 'middle') { - pt.y = state.y + state.height / 2; - } else if (this.verticalAlign === 'bottom') { - pt.y = state.y + state.height; - } else { - throw new Error(); + switch (this.verticalAlign) { + case 'top': { + pt.y = state.y; + + break; + } + case 'middle': { + pt.y = state.y + state.height / 2; + + break; + } + case 'bottom': { + pt.y = state.y + state.height; + + break; + } + default: { + throw new Error(); + } } } diff --git a/packages/core/src/view/cell/CellPath.ts b/packages/core/src/view/cell/CellPath.ts index 68d4a640a9..109519f6a2 100644 --- a/packages/core/src/view/cell/CellPath.ts +++ b/packages/core/src/view/cell/CellPath.ts @@ -90,7 +90,7 @@ class CellPath { const tokens = path.split(CellPath.PATH_SEPARATOR); for (let i = 0; i < tokens.length; i += 1) { - parent = parent.getChildAt(parseInt(tokens[i])); + parent = parent.getChildAt(Number.parseInt(tokens[i])); } return parent; @@ -109,8 +109,8 @@ class CellPath { if (p1[i].length === 0 || p2[i].length === 0) { comp = p1[i] === p2[i] ? 0 : p1[i] > p2[i] ? 1 : -1; } else { - const t1 = parseInt(p1[i]); - const t2 = parseInt(p2[i]); + const t1 = Number.parseInt(p1[i]); + const t2 = Number.parseInt(p2[i]); comp = t1 === t2 ? 0 : t1 > t2 ? 1 : -1; } break; diff --git a/packages/core/src/view/cell/CellRenderer.ts b/packages/core/src/view/cell/CellRenderer.ts index 1274959c3d..0c20cb8219 100644 --- a/packages/core/src/view/cell/CellRenderer.ts +++ b/packages/core/src/view/cell/CellRenderer.ts @@ -885,7 +885,8 @@ class CellRenderer { ) { result = // @ts-ignore - parseFloat(String(shape[property])) - parseFloat(String(shape.spacing)) !== + Number.parseFloat(String(shape[property])) - + Number.parseFloat(String(shape.spacing)) !== (state.style[styleName] || defaultValue); } else { // @ts-ignore diff --git a/packages/core/src/view/layout/hierarchical/CoordinateAssignment.ts b/packages/core/src/view/layout/hierarchical/CoordinateAssignment.ts index 7253a2d18c..a86b38e1a2 100644 --- a/packages/core/src/view/layout/hierarchical/CoordinateAssignment.ts +++ b/packages/core/src/view/layout/hierarchical/CoordinateAssignment.ts @@ -325,7 +325,7 @@ class CoordinateAssignment extends HierarchicalLayoutStage { ); const rankValue = cellWrapper.weightedValue; - const rankIndex = parseInt(String(cellWrapper.rankIndex)); + const rankIndex = Number.parseInt(String(cellWrapper.rankIndex)); const nextLayerConnectedCells = ( cell.getNextLayerConnectedCells(rankValue) diff --git a/packages/core/src/view/mixins/CellsMixin.ts b/packages/core/src/view/mixins/CellsMixin.ts index 660445d643..c795930513 100644 --- a/packages/core/src/view/mixins/CellsMixin.ts +++ b/packages/core/src/view/mixins/CellsMixin.ts @@ -374,30 +374,44 @@ export const CellsMixin: PartialType = { if (state && !cell.isEdge()) { if (param === null) { - if (align === 'center') { - param = state.x + state.width / 2; - break; - } else if (align === 'right') { - param = state.x + state.width; - } else if (align === 'top') { - param = state.y; - } else if (align === 'middle') { - param = state.y + state.height / 2; - break; - } else if (align === 'bottom') { - param = state.y + state.height; - } else { - param = state.x; + switch (align) { + case 'center': + param = state.x + state.width / 2; + break; + case 'right': + param = state.x + state.width; + break; + case 'top': + param = state.y; + break; + case 'middle': + param = state.y + state.height / 2; + break; + case 'bottom': + param = state.y + state.height; + break; + default: + param = state.x; + break; + } + } else + switch (align) { + case 'right': { + param = Math.max(param, state.x + state.width); + break; + } + case 'top': { + param = Math.min(param, state.y); + break; + } + case 'bottom': { + param = Math.max(param, state.y + state.height); + break; + } + default: { + param = Math.min(param, state.x); + } } - } else if (align === 'right') { - param = Math.max(param, state.x + state.width); - } else if (align === 'top') { - param = Math.min(param, state.y); - } else if (align === 'bottom') { - param = Math.max(param, state.y + state.height); - } else { - param = Math.min(param, state.x); - } } } } @@ -418,18 +432,35 @@ export const CellsMixin: PartialType = { if (geo != null && !cell.isEdge()) { geo = geo.clone(); - if (align === 'center') { - geo.x += (p - state.x - state.width / 2) / s; - } else if (align === 'right') { - geo.x += (p - state.x - state.width) / s; - } else if (align === 'top') { - geo.y += (p - state.y) / s; - } else if (align === 'middle') { - geo.y += (p - state.y - state.height / 2) / s; - } else if (align === 'bottom') { - geo.y += (p - state.y - state.height) / s; - } else { - geo.x += (p - state.x) / s; + switch (align) { + case 'center': { + geo.x += (p - state.x - state.width / 2) / s; + + break; + } + case 'right': { + geo.x += (p - state.x - state.width) / s; + + break; + } + case 'top': { + geo.y += (p - state.y) / s; + + break; + } + case 'middle': { + geo.y += (p - state.y - state.height / 2) / s; + + break; + } + case 'bottom': { + geo.y += (p - state.y - state.height) / s; + + break; + } + default: { + geo.x += (p - state.x) / s; + } } this.resizeCell(cell, geo); diff --git a/packages/core/src/view/mixins/ConnectionsMixin.ts b/packages/core/src/view/mixins/ConnectionsMixin.ts index b2dea9fd49..95d0cdb746 100644 --- a/packages/core/src/view/mixins/ConnectionsMixin.ts +++ b/packages/core/src/view/mixins/ConnectionsMixin.ts @@ -221,12 +221,23 @@ export const ConnectionsMixin: PartialType = { // Bounds need to be rotated by 90 degrees for further computation if (vertex.style.anchorPointDirection) { - if (direction === 'north') { - r1 += 270; - } else if (direction === 'west') { - r1 += 180; - } else if (direction === 'south') { - r1 += 90; + switch (direction) { + case 'north': { + r1 += 270; + + break; + } + case 'west': { + r1 += 180; + + break; + } + case 'south': { + r1 += 90; + + break; + } + // No default } // Bounds need to be rotated by 90 degrees for further computation @@ -250,12 +261,23 @@ export const ConnectionsMixin: PartialType = { let cos = 0; let sin = 0; - if (r1 === 90) { - sin = 1; - } else if (r1 === 180) { - cos = -1; - } else if (r1 === 270) { - sin = -1; + switch (r1) { + case 90: { + sin = 1; + + break; + } + case 180: { + cos = -1; + + break; + } + case 270: { + sin = -1; + + break; + } + // No default } point = getRotatedPoint(point, cos, sin, cx); diff --git a/packages/core/src/view/mixins/EventsMixin.ts b/packages/core/src/view/mixins/EventsMixin.ts index 30a317f7cd..bccea02d8f 100644 --- a/packages/core/src/view/mixins/EventsMixin.ts +++ b/packages/core/src/view/mixins/EventsMixin.ts @@ -708,12 +708,23 @@ export const EventsMixin: PartialType = { } for (const l of mouseListeners) { - if (evtName === InternalEvent.MOUSE_DOWN) { - l.mouseDown(sender, me); - } else if (evtName === InternalEvent.MOUSE_MOVE) { - l.mouseMove(sender, me); - } else if (evtName === InternalEvent.MOUSE_UP) { - l.mouseUp(sender, me); + switch (evtName) { + case InternalEvent.MOUSE_DOWN: { + l.mouseDown(sender, me); + + break; + } + case InternalEvent.MOUSE_MOVE: { + l.mouseMove(sender, me); + + break; + } + case InternalEvent.MOUSE_UP: { + l.mouseUp(sender, me); + + break; + } + // No default } } diff --git a/packages/core/src/view/mixins/SwimlaneMixin.ts b/packages/core/src/view/mixins/SwimlaneMixin.ts index 36814255c4..b69db8812b 100644 --- a/packages/core/src/view/mixins/SwimlaneMixin.ts +++ b/packages/core/src/view/mixins/SwimlaneMixin.ts @@ -145,12 +145,23 @@ export const SwimlaneMixin: PartialType = { const h = style.horizontal ?? true; let n = h ? 0 : 3; - if (dir === 'north') { - n--; - } else if (dir === 'west') { - n += 2; - } else if (dir === 'south') { - n += 1; + switch (dir) { + case 'north': { + n--; + + break; + } + case 'west': { + n += 2; + + break; + } + case 'south': { + n += 1; + + break; + } + // No default } const _mod = mod(n, 2); @@ -174,14 +185,25 @@ export const SwimlaneMixin: PartialType = { const size = style.startSize ?? DEFAULT_STARTSIZE; const dir = this.getSwimlaneDirection(style); - if (dir === 'north') { - result.y = size; - } else if (dir === 'west') { - result.x = size; - } else if (dir === 'south') { - result.height = size; - } else { - result.width = size; + switch (dir) { + case 'north': { + result.y = size; + + break; + } + case 'west': { + result.x = size; + + break; + } + case 'south': { + result.height = size; + + break; + } + default: { + result.width = size; + } } } return result; diff --git a/packages/core/src/view/other/DragSource.ts b/packages/core/src/view/other/DragSource.ts index d3459dfefa..b59645138e 100644 --- a/packages/core/src/view/other/DragSource.ts +++ b/packages/core/src/view/other/DragSource.ts @@ -597,8 +597,8 @@ class DragSource { // Grid and guides if (this.currentGuide && this.currentGuide.isEnabledForEvent(evt)) { // LATER: HTML preview appears smaller than SVG preview - const w = parseInt(this.previewElement.style.width); - const h = parseInt(this.previewElement.style.height); + const w = Number.parseInt(this.previewElement.style.width); + const h = Number.parseInt(this.previewElement.style.height); const bounds = new Rectangle(0, 0, w, h); let delta = new Point(x, y); delta = this.currentGuide.move(bounds, delta, gridEnabled, true); diff --git a/packages/core/src/view/shape/Shape.ts b/packages/core/src/view/shape/Shape.ts index d8833b3bae..e6332e4b0b 100644 --- a/packages/core/src/view/shape/Shape.ts +++ b/packages/core/src/view/shape/Shape.ts @@ -1124,12 +1124,23 @@ class Shape { getShapeRotation() { let rot = this.getRotation(); - if (this.direction === 'north') { - rot += 270; - } else if (this.direction === 'west') { - rot += 180; - } else if (this.direction === 'south') { - rot += 90; + switch (this.direction) { + case 'north': { + rot += 270; + + break; + } + case 'west': { + rot += 180; + + break; + } + case 'south': { + rot += 90; + + break; + } + // No default } return rot; diff --git a/packages/core/src/view/shape/node/TextShape.ts b/packages/core/src/view/shape/node/TextShape.ts index 9b392024e5..f2f65a893e 100644 --- a/packages/core/src/view/shape/node/TextShape.ts +++ b/packages/core/src/view/shape/node/TextShape.ts @@ -211,14 +211,14 @@ class TextShape extends Shape { */ override checkBounds() { return ( - !isNaN(this.scale) && - isFinite(this.scale) && + !Number.isNaN(this.scale) && + Number.isFinite(this.scale) && this.scale > 0 && this.bounds && - !isNaN(this.bounds.x) && - !isNaN(this.bounds.y) && - !isNaN(this.bounds.width) && - !isNaN(this.bounds.height) + !Number.isNaN(this.bounds.x) && + !Number.isNaN(this.bounds.y) && + !Number.isNaN(this.bounds.width) && + !Number.isNaN(this.bounds.height) ); } diff --git a/packages/core/src/view/shape/stencil/StencilShape.ts b/packages/core/src/view/shape/stencil/StencilShape.ts index 37ac343c36..ebbafa50d3 100644 --- a/packages/core/src/view/shape/stencil/StencilShape.ts +++ b/packages/core/src/view/shape/stencil/StencilShape.ts @@ -365,265 +365,360 @@ class StencilShape extends Shape { } else if (name === 'restore') { canvas.restore(); } else if (paint) { - if (name === 'path') { - canvas.begin(); - - let parseRegularly = true; - - if (node.getAttribute('rounded') == '1') { - parseRegularly = false; - - const arcSize = Number(node.getAttribute('arcSize')); - let pointCount = 0; - const segs: Point[][] = []; + switch (name) { + case 'path': { + canvas.begin(); + + let parseRegularly = true; + + if (node.getAttribute('rounded') == '1') { + parseRegularly = false; + + const arcSize = Number(node.getAttribute('arcSize')); + let pointCount = 0; + const segs: Point[][] = []; + + // Renders the elements inside the given path + let childNode = node.firstChild as Element; + + while (childNode != null) { + if (isElement(childNode)) { + const childName = childNode.nodeName; + + if (childName === 'move' || childName === 'line') { + if (childName === 'move' || segs.length === 0) { + segs.push([]); + } + + segs[segs.length - 1].push( + new Point( + x0 + Number(childNode.getAttribute('x')) * sx, + y0 + Number(childNode.getAttribute('y')) * sy + ) + ); + pointCount++; + } else { + // We only support move and line for rounded corners + parseRegularly = true; + break; + } + } - // Renders the elements inside the given path - let childNode = node.firstChild as Element; + childNode = childNode.nextSibling as Element; + } - while (childNode != null) { - if (isElement(childNode)) { - const childName = childNode.nodeName; + if (!parseRegularly && pointCount > 0) { + for (let i = 0; i < segs.length; i += 1) { + let close = false; + const ps = segs[i][0]; + const pe = segs[i][segs[i].length - 1]; - if (childName === 'move' || childName === 'line') { - if (childName === 'move' || segs.length === 0) { - segs.push([]); + if (ps.x === pe.x && ps.y === pe.y) { + segs[i].pop(); + close = true; } - segs[segs.length - 1].push( - new Point( - x0 + Number(childNode.getAttribute('x')) * sx, - y0 + Number(childNode.getAttribute('y')) * sy - ) - ); - pointCount++; - } else { - // We only support move and line for rounded corners - parseRegularly = true; - break; + this.addPoints(canvas, segs[i], true, arcSize, close); } + } else { + parseRegularly = true; } - - childNode = childNode.nextSibling as Element; } - if (!parseRegularly && pointCount > 0) { - for (let i = 0; i < segs.length; i += 1) { - let close = false; - const ps = segs[i][0]; - const pe = segs[i][segs[i].length - 1]; + if (parseRegularly) { + // Renders the elements inside the given path + let childNode = node.firstChild as Element; - if (ps.x === pe.x && ps.y === pe.y) { - segs[i].pop(); - close = true; + while (childNode) { + if (isElement(childNode)) { + this.drawNode(canvas, shape, childNode, aspect, disableShadow, paint); } - this.addPoints(canvas, segs[i], true, arcSize, close); + childNode = childNode.nextSibling as Element; } - } else { - parseRegularly = true; } + + break; + } + case 'close': { + canvas.close(); + + break; } + case 'move': { + canvas.moveTo( + x0 + Number(node.getAttribute('x')) * sx, + y0 + Number(node.getAttribute('y')) * sy + ); - if (parseRegularly) { - // Renders the elements inside the given path - let childNode = node.firstChild as Element; + break; + } + case 'line': { + canvas.lineTo( + x0 + Number(node.getAttribute('x')) * sx, + y0 + Number(node.getAttribute('y')) * sy + ); - while (childNode) { - if (isElement(childNode)) { - this.drawNode(canvas, shape, childNode, aspect, disableShadow, paint); - } + break; + } + case 'quad': { + canvas.quadTo( + x0 + Number(node.getAttribute('x1')) * sx, + y0 + Number(node.getAttribute('y1')) * sy, + x0 + Number(node.getAttribute('x2')) * sx, + y0 + Number(node.getAttribute('y2')) * sy + ); - childNode = childNode.nextSibling as Element; - } + break; + } + case 'curve': { + canvas.curveTo( + x0 + Number(node.getAttribute('x1')) * sx, + y0 + Number(node.getAttribute('y1')) * sy, + x0 + Number(node.getAttribute('x2')) * sx, + y0 + Number(node.getAttribute('y2')) * sy, + x0 + Number(node.getAttribute('x3')) * sx, + y0 + Number(node.getAttribute('y3')) * sy + ); + + break; } - } else if (name === 'close') { - canvas.close(); - } else if (name === 'move') { - canvas.moveTo( - x0 + Number(node.getAttribute('x')) * sx, - y0 + Number(node.getAttribute('y')) * sy - ); - } else if (name === 'line') { - canvas.lineTo( - x0 + Number(node.getAttribute('x')) * sx, - y0 + Number(node.getAttribute('y')) * sy - ); - } else if (name === 'quad') { - canvas.quadTo( - x0 + Number(node.getAttribute('x1')) * sx, - y0 + Number(node.getAttribute('y1')) * sy, - x0 + Number(node.getAttribute('x2')) * sx, - y0 + Number(node.getAttribute('y2')) * sy - ); - } else if (name === 'curve') { - canvas.curveTo( - x0 + Number(node.getAttribute('x1')) * sx, - y0 + Number(node.getAttribute('y1')) * sy, - x0 + Number(node.getAttribute('x2')) * sx, - y0 + Number(node.getAttribute('y2')) * sy, - x0 + Number(node.getAttribute('x3')) * sx, - y0 + Number(node.getAttribute('y3')) * sy - ); - } else if (name === 'arc') { - canvas.arcTo( - Number(node.getAttribute('rx')) * sx, - Number(node.getAttribute('ry')) * sy, - Number(node.getAttribute('x-axis-rotation')), - toBoolean(node.getAttribute('large-arc-flag')), - toBoolean(node.getAttribute('sweep-flag')), - x0 + Number(node.getAttribute('x')) * sx, - y0 + Number(node.getAttribute('y')) * sy - ); - } else if (name === 'rect') { - canvas.rect( - x0 + Number(node.getAttribute('x')) * sx, - y0 + Number(node.getAttribute('y')) * sy, - Number(node.getAttribute('w')) * sx, - Number(node.getAttribute('h')) * sy - ); - } else if (name === 'roundrect') { - let arcsize = Number(node.getAttribute('arcsize')); - - if (arcsize === 0) { - arcsize = RECTANGLE_ROUNDING_FACTOR * 100; - } - - const w = Number(node.getAttribute('w')) * sx; - const h = Number(node.getAttribute('h')) * sy; - const factor = Number(arcsize) / 100; - const r = Math.min(w * factor, h * factor); - - canvas.roundrect( - x0 + Number(node.getAttribute('x')) * sx, - y0 + Number(node.getAttribute('y')) * sy, - w, - h, - r, - r - ); - } else if (name === 'ellipse') { - canvas.ellipse( - x0 + Number(node.getAttribute('x')) * sx, - y0 + Number(node.getAttribute('y')) * sy, - Number(node.getAttribute('w')) * sx, - Number(node.getAttribute('h')) * sy - ); - } else if (name === 'image') { - if (!shape.outline) { - const src = this.evaluateAttribute(node, 'src', shape) as string; - - canvas.image( + case 'arc': { + canvas.arcTo( + Number(node.getAttribute('rx')) * sx, + Number(node.getAttribute('ry')) * sy, + Number(node.getAttribute('x-axis-rotation')), + toBoolean(node.getAttribute('large-arc-flag')), + toBoolean(node.getAttribute('sweep-flag')), + x0 + Number(node.getAttribute('x')) * sx, + y0 + Number(node.getAttribute('y')) * sy + ); + + break; + } + case 'rect': { + canvas.rect( x0 + Number(node.getAttribute('x')) * sx, y0 + Number(node.getAttribute('y')) * sy, Number(node.getAttribute('w')) * sx, - Number(node.getAttribute('h')) * sy, - src, - false, - node.getAttribute('flipH') === '1', - node.getAttribute('flipV') === '1' + Number(node.getAttribute('h')) * sy ); - } - } else if (name === 'text') { - if (!shape.outline) { - const str = this.evaluateTextAttribute(node, 'str', shape) as string; - let rotation = node.getAttribute('vertical') == '1' ? -90 : 0; - - if (node.getAttribute('align-shape') === '0') { - const dr = shape.rotation; - // Depends on flipping - const flipH = shape.style?.flipH ?? false; - const flipV = shape.style?.flipV ?? false; + break; + } + case 'roundrect': { + let arcsize = Number(node.getAttribute('arcsize')); - if (flipH && flipV) { - rotation -= dr; - } else if (flipH || flipV) { - rotation += dr; - } else { - rotation -= dr; - } + if (arcsize === 0) { + arcsize = RECTANGLE_ROUNDING_FACTOR * 100; } - rotation -= Number(node.getAttribute('rotation')); + const w = Number(node.getAttribute('w')) * sx; + const h = Number(node.getAttribute('h')) * sy; + const factor = Number(arcsize) / 100; + const r = Math.min(w * factor, h * factor); + + canvas.roundrect( + x0 + Number(node.getAttribute('x')) * sx, + y0 + Number(node.getAttribute('y')) * sy, + w, + h, + r, + r + ); - canvas.text( + break; + } + case 'ellipse': { + canvas.ellipse( x0 + Number(node.getAttribute('x')) * sx, y0 + Number(node.getAttribute('y')) * sy, - 0, - 0, - str, - (node.getAttribute('align') as AlignValue) ?? 'left', - (node.getAttribute('valign') as VAlignValue) ?? 'top', - false, - '', - 'auto', - false, - rotation, - 'auto' + Number(node.getAttribute('w')) * sx, + Number(node.getAttribute('h')) * sy ); + + break; } - } else if (name === 'include-shape') { - const stencil = StencilShapeRegistry.get(node.getAttribute('name')); + case 'image': { + if (!shape.outline) { + const src = this.evaluateAttribute(node, 'src', shape) as string; + + canvas.image( + x0 + Number(node.getAttribute('x')) * sx, + y0 + Number(node.getAttribute('y')) * sy, + Number(node.getAttribute('w')) * sx, + Number(node.getAttribute('h')) * sy, + src, + false, + node.getAttribute('flipH') === '1', + node.getAttribute('flipV') === '1' + ); + } - if (stencil) { - const x = x0 + Number(node.getAttribute('x')) * sx; - const y = y0 + Number(node.getAttribute('y')) * sy; - const w = Number(node.getAttribute('w')) * sx; - const h = Number(node.getAttribute('h')) * sy; + break; + } + case 'text': { + if (!shape.outline) { + const str = this.evaluateTextAttribute(node, 'str', shape) as string; + let rotation = node.getAttribute('vertical') == '1' ? -90 : 0; + + if (node.getAttribute('align-shape') === '0') { + const dr = shape.rotation; + + // Depends on flipping + const flipH = shape.style?.flipH ?? false; + const flipV = shape.style?.flipV ?? false; + + if (flipH && flipV) { + rotation -= dr; + } else if (flipH || flipV) { + rotation += dr; + } else { + rotation -= dr; + } + } + + rotation -= Number(node.getAttribute('rotation')); + + canvas.text( + x0 + Number(node.getAttribute('x')) * sx, + y0 + Number(node.getAttribute('y')) * sy, + 0, + 0, + str, + (node.getAttribute('align') as AlignValue) ?? 'left', + (node.getAttribute('valign') as VAlignValue) ?? 'top', + false, + '', + 'auto', + false, + rotation, + 'auto' + ); + } + + break; + } + case 'include-shape': { + const stencil = StencilShapeRegistry.get(node.getAttribute('name')); + + if (stencil) { + const x = x0 + Number(node.getAttribute('x')) * sx; + const y = y0 + Number(node.getAttribute('y')) * sy; + const w = Number(node.getAttribute('w')) * sx; + const h = Number(node.getAttribute('h')) * sy; + + stencil.drawShape(canvas, shape, x, y, w, h); + } + + break; + } + case 'fillstroke': { + canvas.fillAndStroke(); + + break; + } + case 'fill': { + canvas.fill(); - stencil.drawShape(canvas, shape, x, y, w, h); - } - } else if (name === 'fillstroke') { - canvas.fillAndStroke(); - } else if (name === 'fill') { - canvas.fill(); - } else if (name === 'stroke') { - canvas.stroke(); - } else if (name === 'strokewidth') { - const s = node.getAttribute('fixed') === '1' ? 1 : minScale; - canvas.setStrokeWidth(Number(node.getAttribute('width')) * s); - } else if (name === 'dashed') { - canvas.setDashed(node.getAttribute('dashed') === '1'); - } else if (name === 'dashpattern') { - let value = node.getAttribute('pattern'); - - if (value != null) { - const tmp = value.split(' '); - const pat = []; - - for (let i = 0; i < tmp.length; i += 1) { - if (tmp[i].length > 0) { - pat.push(Number(tmp[i]) * minScale); + break; + } + case 'stroke': { + canvas.stroke(); + + break; + } + case 'strokewidth': { + const s = node.getAttribute('fixed') === '1' ? 1 : minScale; + canvas.setStrokeWidth(Number(node.getAttribute('width')) * s); + + break; + } + case 'dashed': { + canvas.setDashed(node.getAttribute('dashed') === '1'); + + break; + } + case 'dashpattern': { + let value = node.getAttribute('pattern'); + + if (value != null) { + const tmp = value.split(' '); + const pat = []; + + for (let i = 0; i < tmp.length; i += 1) { + if (tmp[i].length > 0) { + pat.push(Number(tmp[i]) * minScale); + } } + + value = pat.join(' '); + canvas.setDashPattern(value); } - value = pat.join(' '); - canvas.setDashPattern(value); - } - } else if (name === 'strokecolor') { - canvas.setStrokeColor(node.getAttribute('color') as ColorValue); - } else if (name === 'linecap') { - canvas.setLineCap(node.getAttribute('cap') as string); - } else if (name === 'linejoin') { - canvas.setLineJoin(node.getAttribute('join') as string); - } else if (name === 'miterlimit') { - canvas.setMiterLimit(Number(node.getAttribute('limit'))); - } else if (name === 'fillcolor') { - canvas.setFillColor(node.getAttribute('color') as ColorValue); - } else if (name === 'alpha') { - canvas.setAlpha(Number(node.getAttribute('alpha'))); - } else if (name === 'fillalpha') { - canvas.setAlpha(Number(node.getAttribute('alpha'))); - } else if (name === 'strokealpha') { - canvas.setAlpha(Number(node.getAttribute('alpha'))); - } else if (name === 'fontcolor') { - canvas.setFontColor(node.getAttribute('color') as ColorValue); - } else if (name === 'fontstyle') { - canvas.setFontStyle(Number(node.getAttribute('style'))); - } else if (name === 'fontfamily') { - canvas.setFontFamily(node.getAttribute('family') as string); - } else if (name === 'fontsize') { - canvas.setFontSize(Number(node.getAttribute('size')) * minScale); + break; + } + case 'strokecolor': { + canvas.setStrokeColor(node.getAttribute('color') as ColorValue); + + break; + } + case 'linecap': { + canvas.setLineCap(node.getAttribute('cap') as string); + + break; + } + case 'linejoin': { + canvas.setLineJoin(node.getAttribute('join') as string); + + break; + } + case 'miterlimit': { + canvas.setMiterLimit(Number(node.getAttribute('limit'))); + + break; + } + case 'fillcolor': { + canvas.setFillColor(node.getAttribute('color') as ColorValue); + + break; + } + case 'alpha': { + canvas.setAlpha(Number(node.getAttribute('alpha'))); + + break; + } + case 'fillalpha': { + canvas.setAlpha(Number(node.getAttribute('alpha'))); + + break; + } + case 'strokealpha': { + canvas.setAlpha(Number(node.getAttribute('alpha'))); + + break; + } + case 'fontcolor': { + canvas.setFontColor(node.getAttribute('color') as ColorValue); + + break; + } + case 'fontstyle': { + canvas.setFontStyle(Number(node.getAttribute('style'))); + + break; + } + case 'fontfamily': { + canvas.setFontFamily(node.getAttribute('family') as string); + + break; + } + case 'fontsize': { + canvas.setFontSize(Number(node.getAttribute('size')) * minScale); + + break; + } + // No default } if ( diff --git a/packages/core/src/view/style/edge/Loop.ts b/packages/core/src/view/style/edge/Loop.ts index d8b523159b..4e63502aa7 100644 --- a/packages/core/src/view/style/edge/Loop.ts +++ b/packages/core/src/view/style/edge/Loop.ts @@ -87,15 +87,27 @@ export const Loop: EdgeStyleFunction = ( if (pt != null) { x = pt.x; dy = Math.max(Math.abs(y - pt.y), dy); - } else if (dir === 'north') { - y = source.y - 2 * dx; - } else if (dir === 'south') { - y = source.y + source.height + 2 * dx; - } else if (dir === 'east') { - x = source.x - 2 * dy; - } else { - x = source.x + source.width + 2 * dy; - } + } else + switch (dir) { + case 'north': { + y = source.y - 2 * dx; + + break; + } + case 'south': { + y = source.y + source.height + 2 * dx; + + break; + } + case 'east': { + x = source.x - 2 * dy; + + break; + } + default: { + x = source.x + source.width + 2 * dy; + } + } } else if (pt !== null) { x = view.getRoutingCenterX(source); dx = Math.max(Math.abs(x - pt.x), dy); diff --git a/packages/core/src/view/style/edge/Manhattan.ts b/packages/core/src/view/style/edge/Manhattan.ts index 8affa89887..0e68d18875 100644 --- a/packages/core/src/view/style/edge/Manhattan.ts +++ b/packages/core/src/view/style/edge/Manhattan.ts @@ -112,7 +112,7 @@ export const ManhattanConnector: EdgeStyleFunction = ( function toPointFromString(pointString: string) { const xy = pointString.split(pointString.indexOf('@') === -1 ? ' ' : '@'); - return new Point(parseInt(xy[0], 10), parseInt(xy[1], 10)); + return new Point(Number.parseInt(xy[0], 10), Number.parseInt(xy[1], 10)); } function pointToString(point: Point) { diff --git a/packages/core/src/view/style/perimeter/EllipsePerimeter.ts b/packages/core/src/view/style/perimeter/EllipsePerimeter.ts index 7b9623a240..99a85889b9 100644 --- a/packages/core/src/view/style/perimeter/EllipsePerimeter.ts +++ b/packages/core/src/view/style/perimeter/EllipsePerimeter.ts @@ -43,8 +43,8 @@ export const EllipsePerimeter: PerimeterFunction = ( // Calculates straight line equation through // point and ellipse center y = d * x + h - const dx = parseInt(String(px - cx)); - const dy = parseInt(String(py - cy)); + const dx = Number.parseInt(String(px - cx)); + const dy = Number.parseInt(String(py - cy)); if (dx === 0 && dy !== 0) { return new Point(cx, cy + (b * dy) / Math.abs(dy)); diff --git a/packages/core/src/view/style/perimeter/TrianglePerimeter.ts b/packages/core/src/view/style/perimeter/TrianglePerimeter.ts index 29a41566be..ed1714e475 100644 --- a/packages/core/src/view/style/perimeter/TrianglePerimeter.ts +++ b/packages/core/src/view/style/perimeter/TrianglePerimeter.ts @@ -48,17 +48,28 @@ export const TrianglePerimeter: PerimeterFunction = ( let corner = new Point(x + w, cy); let end = new Point(x, y + h); - if (direction === 'north') { - start = end; - corner = new Point(cx, y); - end = new Point(x + w, y + h); - } else if (direction === 'south') { - corner = new Point(cx, y + h); - end = new Point(x + w, y); - } else if (direction === 'west') { - start = new Point(x + w, y); - corner = new Point(x, cy); - end = new Point(x + w, y + h); + switch (direction) { + case 'north': { + start = end; + corner = new Point(cx, y); + end = new Point(x + w, y + h); + + break; + } + case 'south': { + corner = new Point(cx, y + h); + end = new Point(x + w, y); + + break; + } + case 'west': { + start = new Point(x + w, y); + corner = new Point(x, cy); + end = new Point(x + w, y + h); + + break; + } + // No default } let dx = next.x - cx; @@ -88,15 +99,27 @@ export const TrianglePerimeter: PerimeterFunction = ( } else { result = new Point(start.x, next.y); } - } else if (direction === 'north') { - result = new Point(x + w / 2 + (h * Math.tan(alpha)) / 2, y + h); - } else if (direction === 'south') { - result = new Point(x + w / 2 - (h * Math.tan(alpha)) / 2, y); - } else if (direction === 'west') { - result = new Point(x + w, y + h / 2 + (w * Math.tan(alpha)) / 2); - } else { - result = new Point(x, y + h / 2 - (w * Math.tan(alpha)) / 2); - } + } else + switch (direction) { + case 'north': { + result = new Point(x + w / 2 + (h * Math.tan(alpha)) / 2, y + h); + + break; + } + case 'south': { + result = new Point(x + w / 2 - (h * Math.tan(alpha)) / 2, y); + + break; + } + case 'west': { + result = new Point(x + w, y + h / 2 + (w * Math.tan(alpha)) / 2); + + break; + } + default: { + result = new Point(x, y + h / 2 - (w * Math.tan(alpha)) / 2); + } + } } else { if (orthogonal) { const pt = new Point(cx, cy);